Go Down

Topic: Fonction Loop (Read 1 time) previous topic - next topic

moumoune

Merci a toi 68tjrs pour l'info et je pense avoir compris cela; mon soucis est que dans le programme global du projet, je ne sortirais pas de la boucle, car les sondes seront constamment en-train de prendre les températures extérieures, intérieures etc... avec un décalage de 1hre ou 2hre ou X temps et réajuster le réglage de la vanne 4 voies ainsi que des circulateurs et résistances de chauffe-eau....et tout ceci en fonction du jour et de l'heure, d'où mon soucis de combiner les deux " loop() ".

Suis-je assez explicite, car parfois j'ai tellement la tête dans ce truc en ce moment :smiley-confuse:

68tjs

Arrête une bonne fois pour toutes de dire "combiner deux loop()"
loop() avec deux parenthèses C'EST UNE FONCTION, et comme toute fonction dans un programme elle est unique, point barre.

Quote
je ne sortirais pas de la boucle, car les sondes seront constamment en-train de prendre les températures extérieures, intérieures etc.
C'est parce que tu t'y prend mal, ce cas se gère.
Tu veux aller plus vite que la musique en sautant les étapes.
Suis le tuto d'Eskimon, apprend à programmer avec des exemples simples au lieu de chercher d'emblée la difficulté.

Tel que tu pars c'est plantage assuré.
Tu mets la charrue avant les bœufs.

moumoune

Bonjours 68tjrs, j'ai un peu l'impression que cela te porte sur les nerfs; je ne trouve pas de lien sur le tuto d'Eskimon...mais aussi pour info ou j'en suis:  pour commencer sur Arduino j'ai fait un petit programme qui gère les sondes DS18B20 ( au nombre de 4), ensuite j'ai fait un petit programme pour gérer une RTC DS 1302 et en parcourant des postes je me suis dit que je devrais opter pour une RTC DS 3231 ( en commande), ensuite j'ai fait un petit programme pour gérer une carte avec 4 relais, puis un petit programme pour gérer un servo puis un petit programme pour un LCD et maintenant j'ai réussi a fusionner tout ces petits en un seul programme sauf que je n'arrive pas a gérer la RTC dans tout cela; alors si tu penses que le tuto de Eskimon pourra aider je suis preneur...Merci de me donner un lien.

68tjs

#18
Feb 09, 2018, 08:14 pm Last Edit: Feb 09, 2018, 08:15 pm by 68tjs
Quote
je ne trouve pas de lien sur le tuto d'Eskimon.
Elle est bien bonne celle là !

Tu n'as pas vu qu'il y a des messages en tête de forum avec une petite punaise !
Tu n'a pas vu qu'il en avait un dont le titre est "Coup de gueule" ?

Franchement tu n'a pas chercher à comprendre le fonctionnement de ce forum.


Aller lis donc celui dont je mets le lien. Entre autre tu y trouvera le lien vers le tuto d'Eskimon.
Il n'est pas de moi, j'ai juste fais le secrétaire, il est l'œuvre d'une vingtaine de "forumeur actifs" qui en avait marre que les questions soit mal posées et de réexpliquer continuellement les mêmes choses.
https://forum.arduino.cc/index.php?topic=324322.0

Bonne lecture.

_pepe_

#19
Feb 09, 2018, 08:15 pm Last Edit: Aug 19, 2018, 03:24 am by _pepe_
Supprimé

_pepe_

#20
Feb 09, 2018, 08:26 pm Last Edit: Aug 19, 2018, 03:24 am by _pepe_
Supprimé

_pepe_

#21
Feb 09, 2018, 08:38 pm Last Edit: Aug 19, 2018, 03:24 am by _pepe_
Supprimé

moumoune

Merci Pepe pour tout cela; en fait j'ai réussi a faire ce que je voulais a savoir: faire bouger le servo et afficher l'heure en même temps; je reprendrais la discution au sujet du servo plus tard, car pour l'instant je vais me consacrer a bien lire le tuto d'Eskimon comme le suggère tjrs68; juste une petite mise au point: dans la fonction " delay(2000)" il s'agit bien de 2 secondes en attente, alors que si je te comprends bien dans la fonction
 for (i=0; i<2000; i++)
loop_horloge(); on met environs 33mn en attente???? Est-ce bien cela? En piece jointe la version qui marche. Je prends tout commentaire a ce stade; merci

_pepe_

#23
Feb 09, 2018, 09:06 pm Last Edit: Aug 19, 2018, 03:24 am by _pepe_
Supprimé

_pepe_

#24
Feb 09, 2018, 09:14 pm Last Edit: Aug 19, 2018, 03:23 am by _pepe_
Supprimé

moumoune

Merci Pepe,

Ceci explique pour moi pourquoi je ne trouvais pas les fameuses 33mn, car le chiffre 2000 était le même pour moi dans les 2 fonctions  :smiley-confuse:

Ok pour le Ctrl+T cela clarifie la situation et je pense que ceci doit être explique dans le tuto!! :smiley-red:  Je rigole

bricofoy

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();


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 :P
Mais la lecture des DS18B20, l'enregistrement des valeurs etc etc, ça fonctionne très bien
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

moumoune

Bonjour a tous,

Me revoilà, j'ai enfin eu ma RTC DS3231 et je l'ai installée sur mon circuit et fait une programmation qui me convient assez pour l'instant :)
Je mets le programme en lien; pour info la carte est une Arduino MEGA, l'afficheur est un 2 x 16 rangées et les sondes sont des DS18B20, comme Librairie pour la RTC j'ai pris le lien ci-dessous:
http://gilles.thebault.free.fr/spip.php?article53

Je n'ai pas encore inclus la position d'exploitation du servo pour la vanne 4 voies....cela viendra par la suite ainsi qu'un petit schéma du montage.

S'il y a des commentaires pour améliorer l'existant ( je suis sur qu'il y en a ) je suis preneur :)

Bonne journée a vous tous. :)

moumoune

Bonjour tout le monde,

Me revoilà sur le site et je poste mon programme qui me convient pour l'instant  :) j'ai encore deux petites questions:

 concernant la ligne suivante:

if ((t.hour) == 19 || (t.hour) == 20 || (t.hour) == 21 || (t.hour) == 22 || (t.hour) == 23 || (t.hour) == 24 || (t.hour) == 0 etc... jusqu'a 6

Sachant que je dois gérer la plage horaire de 19 a 6 du matin; peut-on faire plus court?

L'autre étant: j'ai connecte 5 capteurs DS18B20 mais je ne peux en lire que 4 ( ce qui me suffit pour l'instant), pour le cinquième il m'affiche une valeur de -127C, sachant que j'ai branche  les 5 capteurs en parallèle sur la carte :smiley-confuse: et j'ai deja change le cinquieme capteur par un nouveau (en cas de défaut de fabrication :smiley-confuse: ) et revu les connexions, rien n'y fait!!!alors que les 4 autres fonctionnent très bien :smiley-confuse:

Concernant la partie Servo, je le démarre en position milieu pour ensuite ouvrir ou fermer en fonction des températures captées par les sondes avec des points maxi et mini.


Je joindrais un plan de montage des différents composants et du branchement un peu plus-tard.

En espérant que ceci pourra aider quelqu'un. :)

Go Up