| |||||
FORUM HardWare.fr

Electronique, domotique, DIY

ESP32 : Faire clignoter une LED sans monopoliser le programme| Dernière réponse | |
|---|---|
| Sujet : ESP32 : Faire clignoter une LED sans monopoliser le programme | |
| Lt Ripley | 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 |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| Lt Ripley | 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 |
| rat de combat |
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... |
| Lt Ripley | 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 |
| Lt Ripley | 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
|
| Lt Ripley | Bon j'ai fait ça, j'ai utilisé millis() ça marche impec.
|
| Lt Ripley | 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 |
| Lt Ripley | 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++
|
| TotalRecall | 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/ |
| rat de combat | 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 ) |
| Lt Ripley | Merci bien !
En effet ça a l'air simple ça doit fonctionner aussi avec un ESP32
|
| Bersac | 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. |
| Lt Ripley | 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 |


