Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1232 connectés 

  FORUM HardWare.fr
  Electronique, domotique, DIY

  ESP32 : Faire clignoter une LED sans monopoliser le programme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ESP32 : Faire clignoter une LED sans monopoliser le programme

n°352103
Lt Ripley
T'es à fond là ?
Posté le 06-10-2021 à 08:49:48  profilanswer
 

Bonjour
 
La question est dans le titre : Savez vous comment faire clignoter une led ou un buzzer sans monopoliser le programme, pour qu'il puisse continuer de fonctionner en parallèle ?
 
Merci pour votre savoir


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
mood
Publicité
Posté le 06-10-2021 à 08:49:48  profilanswer
 

n°352154
bersac
Posté le 06-10-2021 à 14:07:31  profilanswer
 

Salut Lt Ripley,
 
Je ne connais pas l'ESP32 mais sur Arduino classique, on utilise pour cela la fonction millis().
 
Le net regorge d'exemples, fais une recherche comme celle-ci.

n°352181
Lt Ripley
T'es à fond là ?
Posté le 06-10-2021 à 16:46:12  profilanswer
 

Merci bien !
 
En effet ça a l'air simple ça doit fonctionner aussi avec un ESP32
 

Code :
  1. digitalWrite( ledpin , millis() / 500 % 2 );


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°352372
rat de com​bat
attention rongeur méchant!
Posté le 07-10-2021 à 18:39:01  profilanswer
 

Ca fonctionnera, mais ce n'est pas très élégant je trouve. Du moins sur un AVR (Arduino "classique" ) la division est coûteuse est le modulo peut-être aussi selon l'optimisation du compilateur. Après c'est une seule ligne qui va fonctionner, donc on peut faire comme ça en effet.
 
Méthode plus classique: Timer+Interruption
 
(Oui, millis() est basé la dessus. Comme je disais, ça va fonctionner. :o )

n°352511
TotalRecal​l
Modérateur
Posté le 08-10-2021 à 18:58:32  profilanswer
 

C'est moche et bourrin le millis() / 500 % 2, surtout s'il n'y a rien d'autre qui tourne : autant utiliser plutôt un delay() comme dans Blink (exemple Arduino).
 
Et s'il y a des trucs à faire en parallèle et qu'on ne veut pas gérer à la main les interruptions il y a des librairies comme https://www.arduino.cc/reference/en/libraries/leos/


---------------
Topic .Net - C# @ Prog
n°352513
Lt Ripley
T'es à fond là ?
Posté le 08-10-2021 à 19:13:42  profilanswer
 

Merci
 
Je vais étudier le truc !
 
 
Le voltage qui alimente les pins c'est du 3,3v c'est bien ça ?  Je peux mettre 3 leds en parallèle sur la même pin pour éclairer un peu mieux ?
 
Juste pour info c'est pour mon 2e projet ESP32, après ma serrure électronique qui marche du feu de dieu.  Là c'est une alerte sur température et humidité des pièces (je pense que l'air trop sec endommage les muqueuses et provoque les rhumes j'ai donc un humidificateur d'air par pièce mais j'oublie parfois de contrôler et de les mettre en route)
 
J'arrive a recup les valeurs du html au c++ en passant par le js et l'inverse etc mais putain ça va me faire ouate mille fonctions
 
Juste pour le seuil température chambre :
 
c++

Code :
  1. serveurVR.on("/getSeuilTempChambre", HTTP_GET, [](AsyncWebServerRequest *request)
  2.   {
  3.     String str = String(seuilTempChambre);
  4.     request->send(200, "text/plain", str);
  5.   }); 
  6.   serveurVR.on("/plusTempChambreButton", HTTP_GET, [](AsyncWebServerRequest *request)
  7.   {
  8.     seuilTempChambre++;
  9.     request->send(200);
  10.   }); 
  11.   serveurVR.on("/moinsTempChambreButton", HTTP_GET, [](AsyncWebServerRequest *request)
  12.   {
  13.     seuilTempChambre--;
  14.     request->send(200);
  15.   });


 
 
js :

Code :
  1. setInterval(function getSeuilTempChambre()
  2. {
  3.     var xhttp = new XMLHttpRequest();
  4.     xhttp.onreadystatechange = function()
  5.     {
  6.         if(this.readyState == 4 && this.status == 200)
  7.         {
  8.             document.getElementById("seuilTempChambre" ).innerHTML = this.responseText;
  9.         }
  10.     };
  11.     xhttp.open("GET", "getSeuilTempChambre", true);
  12.     xhttp.send();
  13. }, 2000);
  14. function plusTempChambreButton()  {
  15.     var xhttp = new XMLHttpRequest();
  16.     xhttp.open("GET", "plusTempChambreButton", true);
  17.     xhttp.send();
  18. }
  19. function moinsTempChambreButton()  {
  20.     var xhttp = new XMLHttpRequest();
  21.     xhttp.open("GET", "moinsTempChambreButton", true);
  22.     xhttp.send();
  23. }


 
 
Voilà ou j'en suis
 
https://i.imgur.com/YtPOv1L.png


Message édité par Lt Ripley le 08-10-2021 à 19:32:01

---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°352639
Lt Ripley
T'es à fond là ?
Posté le 11-10-2021 à 13:00:59  profilanswer
 

Bon, l'ESP32 c'est 40ma maxi par pin, donc je pourrais mettre maxi 2 leds de 20ma en 3,5v que je me suis dégotées sur la bay mais par sécurité je vais en mettre qu'une.
 
Qu'est ce que vous me conseillez pour stocker une dizaine d'entiers dans la flash ?  Les "preferences" ?  Avec un tableau[] ?
 
Il est impossible d'enregistrer directement un objet ? (créé par moi, tout simple, contenant uniquement cette dizaine d'entier voire aussi un String ou 2 si besoin pourquoi pas)
 
Edit : C'est bon j'y arrive avec putBytes (un tableau[] d'int).  Ça a l'avantage de persister quand je maj mes fichiers HTML/CSS/JS


Message édité par Lt Ripley le 12-10-2021 à 08:43:29

---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°352791
Lt Ripley
T'es à fond là ?
Posté le 12-10-2021 à 17:22:45  profilanswer
 

Bon j'ai fait ça, j'ai utilisé millis() ça marche impec.
 

Code :
  1. void blinkTheLed()  {
  2.   unsigned long currentMillis = millis();
  3.   if (currentMillis - previousMillis >= blinkInterval)  {
  4.    
  5.     ledState = (ledState == LOW) ? HIGH : LOW;
  6.     digitalWrite(led, ledState);
  7.     previousMillis = currentMillis;
  8.   }
  9. }
  10. void decreaseBypass()  {
  11.   unsigned long currentMillisForBypass = millis();
  12.   if (currentMillisForBypass - previousMillisForBypass >= 60000)  {
  13.     bypass--;
  14.     previousMillisForBypass = currentMillisForBypass;
  15.   }
  16. }


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°353357
Lt Ripley
T'es à fond là ?
Posté le 19-10-2021 à 21:29:11  profilanswer
 

Salut !
 
Ça y est c'est en place ça fonctionne
 
J'ai une question, comment le lien se fait entre le fichier JS et le main.cpp ?
 
Dans le script.js j'ai ça

Code :
  1. // Hygro relevée chambre
  2. setInterval(function getHygroChambre()
  3. {
  4.    var xhttp = new XMLHttpRequest();
  5.  
  6.    xhttp.onreadystatechange = function()
  7.    {
  8.        if(this.readyState == 4 && this.status == 200)
  9.        {
  10.            document.getElementById("hygroChambre" ).innerHTML = this.responseText;
  11.        }
  12.    };
  13.  
  14.    xhttp.open("GET", "getHygroChambre", true);
  15.    xhttp.send();
  16. }, 5000);


 
/getHydroChambre (et tous les autres) sont dans main.cpp.  Du coup il fait 750 lignes. 30 fonctions dans le main et aussi dans le JS.  Je voudrais faire un objet server dédié que je créé depuis le main dans le setup().  Comment je peux faire ?  Le JS va trouver les fonctions ?  Je vois pas comment le lien se fait actuellement.
 
main.cpp :

Code :
  1. // Hygro relevée chambre
  2.  serveurVR.on("/getHygroChambre", HTTP_GET, [](AsyncWebServerRequest *request)
  3.  {
  4.    String str = String(hygroChambre);
  5.    str = str.substring(0, (str.length()-1));
  6.    str+="%";
  7.    request->send(200, "text/plain", str);
  8.  });


 
https://i.imgur.com/B7arLUP.png
 
Sacré bordel quand même :whistle:  
https://i.imgur.com/sRRCxGW.png
 
J'ai du mal a planquer les fils, mauvaise idée ce verre "dépoli" pour les leds
https://i.imgur.com/O8PC3Ca.png


Message édité par Lt Ripley le 19-10-2021 à 21:58:01

---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°354853
Lt Ripley
T'es à fond là ?
Posté le 06-11-2021 à 11:34:01  profilanswer
 

Salut !
 
Ça marche bien, j'ai ajouté un capteur extérieur, avec 8,5m de câble (cheapest RJ45 amazon), RAS.  
 
J'ai pu alléger mon main.cpp de 300 lignes, j'ai créé un objet ou j'ai mis toutes mes methodes serveur.on et à qui je passe les pointeurs de mon server, de mes variables et d'une methode.
 
J'ai une question, après investigation j'ai déterminé que la lecture d'un capteur peut induire jusqu'à 1,5s de lag.  Tout va bien pendant 30 ou 60s (il lit les capteurs toutes les 4s) et d'un coup les leds et le buzzer laggent, 1 fois, et ça repart.  Je vois grâce au monitor série que l'ESP est bloqué entre 2 lectures (qui sont à la suite) de capteurs dans la loop().
 
C'est pas grave, mais ça fait un peu cheap.  Est ce que vous avez une idée de comment éviter ça ?
 
Merci !
 
https://i.imgur.com/vwE9FMs.png


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
mood
Publicité
Posté le 06-11-2021 à 11:34:01  profilanswer
 

n°354901
rat de com​bat
attention rongeur méchant!
Posté le 06-11-2021 à 18:15:05  profilanswer
 

Lt Ripley a écrit :

Est ce que vous avez une idée de comment éviter ça ?

Difficile d'être plus concret sans connaître tout le truc, mais de manière générale je dirais il te faut une horloge qui tourne séparément du code principal. On en revient aux timers hardware + une interruption toutes les secondes p.ex. Dans l'interruption tu mets un drapeau ("flag", un volatile bool, surtout ne pas oublier le volatile) à 1 pour signaler au code principal qu'il faut faire ceci ou cela. Tu peux avoir plusieurs drapeaux avec des diviseurs différents (en software). Après tout ça dans le monde Arduino et sur ESP, aucune idée de comment faire...

n°355153
Lt Ripley
T'es à fond là ?
Posté le 09-11-2021 à 15:46:01  profilanswer
 

Merci, j'avais regardé un peu les interruptions, ça pique, là je fonctionne avec millis() et j'ai pas le courage de tout réécrire.
 
Pour passer un tableau de dates du c++ au javascript faut faire ça en json ?  Directement c'est mort j'imagine


---------------
Mes apps  |  Viens coder  |  Mon topal de vente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Electronique, domotique, DIY

  ESP32 : Faire clignoter une LED sans monopoliser le programme

 

Sujets relatifs
ESP32 multiplexer caméra?Batteries et LED
Recherches d'infos sur un afficheur à LED 15 segmentsFeu Stop a LED
[Test] Sources de courant chinoises pour LED 1WBarre Led (écran) et diamètre fil électrique.
Choix LED rouge/verte suivant l'intensité lumineuse ?[résolu] Arduino nano + LED ws2812b
Setup de LED (pour TV) wifi contrôlé par une caméra[AIDE] Bande LED RGB avec contrôleur 2 canaux
Plus de sujets relatifs à : ESP32 : Faire clignoter une LED sans monopoliser le programme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR