ESP32 : Faire clignoter une LED sans monopoliser le programme

ESP32 : Faire clignoter une LED sans monopoliser le programme - Electronique, domotique, DIY

Marsh Posté le 06-10-2021 à 08:49:48    

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
Reply

Marsh Posté le 06-10-2021 à 08:49:48   

Reply

Marsh Posté le 06-10-2021 à 14:07:31    

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.

Reply

Marsh Posté le 06-10-2021 à 16:46:12    

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
Reply

Marsh Posté le 07-10-2021 à 18:39:01    

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 )

Reply

Marsh Posté le 08-10-2021 à 18:58:32    

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/


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 08-10-2021 à 19:13:42    

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
Reply

Marsh Posté le 11-10-2021 à 13:00:59    

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
Reply

Marsh Posté le 12-10-2021 à 17:22:45    

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
Reply

Marsh Posté le 19-10-2021 à 21:29:11    

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
Reply

Marsh Posté le 06-11-2021 à 11:34:01    

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
Reply

Marsh Posté le 06-11-2021 à 11:34:01   

Reply

Marsh Posté le 06-11-2021 à 18:15:05    

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...

Reply

Marsh Posté le 09-11-2021 à 15:46:01    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed