moumoune:
Donc de retour a mon problème et ce que je craignais se produit:
Dans une fonction boucle on répète et répète sans sortir de la boucle, donc comment combiner deux boucles??
en fait ce qu'il faut comprendre c'est que le programme est relancé à l'infini (par le biais de la fonction loop() d'arduino, qui comme son nom l'indique, tourne en boucle infinie). Cette fonction est mise en place par l'IDE arduino, et tu n'as pas à t'en préoccuper ni à essayer de la relancer toi-même. Tu as juste à mettre ton code à l'intérieur pour qu'elle réalise ce que tu veux.
Ensuite, à l'intérieur de cette boucle infinie, à toi de faire un code qui ne soit jamais bloquant (et c'est ce qui est très simplifié si tu utilises ma librairie ), donc il faut à tout prix éviter d'utiliser par exemple delay(duree), qui va rester bloqué à cet endroit dans le programme le temps "duree" et donc empêcher de faire autrechose pendant ce temps. Pour résoudre ce problème, il faut réaliser tes temporisations de manière non bloquante, c'est à dire que tu va dans le déroulement de ton programme par exemple :
-tester si ta temporisation 1 est finie ->non,
-afficher des valeurs sur le lcd
-tester si ta tempo 2 est finie->non
-faire autrechose
et... c'est tout. Comme tout ce code est placé dans loop(), justement, il sera ensuite relancé à l'infini. Tant et si bien qu'au bout d'un moment, tu va avoir le déroulement suivant :
-tester si ta temporisation 1 est finie ->oui,
-faire ce qu'il y a à faire si tempo1 finie
-afficher des valeurs sur le lcd
-tester si ta tempo 2 est finie->non
-faire autrechose
et ainsi de suite.
Pour réaliser les temporisations de manière non bloquante, il faut employer la technique de l'exemple fourni avec l'IDE "blink without delay", au moins pour comprendre le principe, qui est le suivant :
-lire l'horloge du microcontrôleur avec millis() et stocker cette valeur
puis dans les appels suivant de la boucle
-lire la valeur de l'horloge avec millis() et comparer avec la valeur stockée+la durée voulue.
si < --->la tempo n'est pas finie, on ne fait rien de spécial
si > --->la tempo est finie, alors :
-on stocke la nouvelle valeur pour la fois suivante
-on fait ce qu'on doit faire quand la tempo est finie
on restocke la nouvelle valeur pour la prochaine fois
et ainsi de suite
tout ça, c'est pas compliqué, mais c'est fastidieux. Il faut le faire pour comprendre, mais ensuite... pourquoi réinventer la roue ?
avec ma librairie, tu peux executer plusieurs taches en //, et faire une tempo est aussi simple que
if(tache1.elapsed(duree))
faire_un_truc();
moumoune:
Merci pour ces pistes et félicitations a toi Bricofoy, très beau projet effectivement cela rejoint un peu le mien, mais je ne vais pas faire de copie-colle bête et méchant car je veux comprendre ou je vais; par ailleurs on a tous une logique différente et donc le temps que j'arrive a comprendre la tienne ( même si pour toi c'est simple car tu y étais plonge des heures donc tu connais le truc par-coeur) cela me prendra ,je pense, autant de temps que d'avancer avec ma logique et l'aide des gens du forum;
c'est là où je pense que tu te trompes. c'est là aussi ce que je disais plus haut en parlant de ne pas réinventer la roue... sinon pourquoi utiliser une libraire existante pour lire la RTC ou les DS18B20 ? il faut créer la tienne pour en maîtriser la logique... D'un autre coté, tu peux aussi dire que c'est ce j'ai fait, c'est vrai, mais avant j'ai utilisé celles des autres, et j'ai toujours trouvé ça ou trop limité ou bien trop compliqué. D'ou la création d'un truc simple d'emploi mais qui évite toutes les limitations que j'ai trouvé ailleurs. Et si le projet est sur github, c'est justement pour que d'autres puissent l'utiliser soit tel quel soit le copier et le modifier pour l'adapter à leurs besoins.
Il en va de même pour le projet thermalduino, l donne déja un cadre de base qui permet d'enregistrer des sondes DS18B20 via un menu sur le LCD, de lire ces DS18B20, afficher les valeurs, exécuter des taches en fonction de ces valeurs, stocker les valeurs mesurées sur carte SD, régler les paramètres via un menu sur l'afficheur, etc
Tu peux parfaitement utiliser uniquement le squelette du projet, et mettre ensuite dedans ta propre logique pour gérer le servo, les démarrages de pompes etc etc. De toutes manières ma gestion du servo n'est pas encore au point
Mais la lecture des DS18B20, l’enregistrement des valeurs etc etc, ça fonctionne très bien