[résolu] Calcul temps

pas de soucis, j ai zappé le fait que cela n allait pas être forcément clair (je l ai fait pour moi c'était clair :wink: )

donc c est la brumisation en journée qui fonctionne pas

j allume ou éteint la lumière lorsque current (heure3600+min60+second) est égal 28800 ou 73800 (8h et 20h)

ensuite la première et la dernière brumisation se fait à (28800+900) et (73800-3600) (8h15 et 19h30)

après selon le nombre de brumisation (période sèche ou période pluie) j ai le calcul suivant

((73800-3600)-(28800+900)) pour avoir le temps entre la 1ère et la dernière donc 40500 (11h15)

le nombre de brumi étant de 7 (période pluie)

40500/7=5785,74 ce qui fait que tous les 1h36min42s la brumisation se met en route

la condition suivante :

if ((compteur_brumi_T1<=current) && (current<(compteur_brumi_T1+temps_brumi)))

test le compteur_brumi_T1 pour savoir si on est dans la période de brumisation par rapport à current
enclenche la brumisation si ok

et ensuite lorsque la condition arrive à else

compteur_brumi_T1=compteur_brumi_T1+espacement_brumi_pluie_T1;

j ai le compteur_brumi_T1 qui est égal au précédent compteur : compteur_brumi_T1 + les 1h36

est ce que l on peut faire çà :

compteur_brumi_T1=compteur_brumi_T1+espacement_brumi_pluie_T1;

bonjour, tu va encore te faire taper sur les doigt toi ^^ on pige rien a ce que tu raconte... comment tu active tes brumisations? digitalwrite?

Et c'est coi ces calcule qui mène a rien la? que ce que ce L? que ce que c'est que ces premières ligne qui ce répète 4 fois et donc serve a rien?

lol c'est la misère ton programme, comment tu peut essayer de faire des choses régulé dans le temps sans RTC sans millis() ou sans aucun mesure de temps.. mets le code en entier ou explique nous ce qu'il y a dans l'intégralité de ton application, mais fait quelque chose la on est impuissant !!!

Skizo !

Je plussoie Skizoh.
Toujours pas très clair.

En fait je vais encore essayer de convertir quelqun'un à ma religion : LA MACHINE D'ETAT

Je suis sur que tout cela serait plus clair si tu raisonnais sous la forme d'une machine d'état.

Définit des états, notamment un état de départ.
Et définis ce qui te fait passer d'une état à un autre et ce que tu fais à ce moment là.
Dans ton cas çà veut dire par exemple :

  • Quand je suis dans l'etat "lampe éteinte en journée"
    Si ( heure courante > 28880 ) Alors
    J'allume la lumière
    Je passe dans l'Etat xxxx
  • Quand je suis dans l'Etat xxxx
    SI YYYYYY alors
    .....

Avec un petit dessin de ce genre ca devrait aller mieux

Ne cherche pas forcément à tout mettre dans la même machine d'état.
Il peut être plus intéressant d'avoir une machine d'état pour la lumière et une pour le brumisateur.
Toutes 2 peuvent être complètement et gérer leur cycle toute seule
Ou alors une peux être esclave de l'autre.

Par exemple, j'ai l'impression que le cycle du brumisateur est le même mais apparaît 2 fois dans la journée.
Donc tu peux avoir une machine d'état pour la gestion des phases de la journée qui 2 fois dans la journée à heure fixe va donner un ordre de démarrage à la machine d'état du brumisateur qui va assurer son cycle en temps relatif.

Compare çà à une machine à laver avec programmateur automatique.
le cycle de lavage est une machine d'état en temps relatif par rapport à l'heure de démarrage. Quelle que soit l'heure à laquelle le cycle de lavage démarre, il s'exécute de la même façon et ne dépend que de la programmation.
Et puis tu as des machines qui en plus intègre un retardateur ou même un déclenchement sur le passage aux heures creuses.

Donc d'un coté tu as un automate qui gère les phases de la journées (heures pleines/heures creuses) et d'un autre un automate qui gère le cycle de lavage.

Dans un premier temps ne penses pas au code C mais raisonne logiquement.
Quand cela sera clair, on te guidera sur le codage qui deviendra facile, clair, et debuggable si l'expression de besoin l'a aussi été.
Tant que l'expression de besoin est "fouilli" (désolé), ton code le restera et restera imperméable à la compréhension des autres.

A+

@skizoh

mode joke on :

alors le L, je crois que dans long, on met un L avec les chiffres, ex : long speedOfLight = 186000L; // see Integer Constants for explanation of the 'L' see : http://arduino.cc/hu/Reference/Long ]:smiley:

RTC sans millis() ou sans aucun mesure de temps

euh c est quoi çà

....lorsque current (heure3600+min60+second) ...

, faut lire aussi les posts pas uniquement le programme ]:smiley:

attention je ne l ai pas mal pris :wink: , mais si je peux charrier après que l on me l a fait je ne me gène pas :wink:

mode joke fin

j avais posé une question sur un problème de LONG, j ai retenu XD

Et c'est coi ces calcule qui mène a rien la? :

les calculs servent parce que je paramètre certain INT à partir d un écran TFT, donc pour arriver au but final je suis obligé de passer par des calculs, enfin, çà c est le comptable qui parle, qui a mis en programme les étapes de calcul, après si vous avez d autre idée, je suis preneur

que ce que c'est que ces premières ligne qui ce répète 4 fois et donc serve a rien?

ok, je repars du début

j ai 4 terrariums, avec des grenouilles de provenance différente.
J ai une gestion T° différente pour les 4, çà c est ok
J ai un relevé H° différent pour les 4 c est ok
J utilise un temps d'éclairage identique pour les 4

Par contre, en fonction des pays/régions, je souhaite avoir une pluviométrie (brumisation) différente par terra en fonction des périodes pluie/sèche (dans mon code, j ai mis des valeurs identiques pour un réglage modifié après par l'écran)

je voudrais que (exemple avec les chiffres du program) :

du mois juin inclus au mois de septembre exclue, j entre en période sèche, donc 4 pulvérisations par jour (inclus la première du matin et la dernière du soir) pendant 20s
du mois septembre inclus au mois de juin exclue, j entre en période pluie, donc 7 pulvérisations par jour (inclus la première du matin et la dernière du soir) pendant 20s

et que les brumisations se fassent dans la période d'éclairage à égal distance de temps

donc j ai actuellement :

1° condition lumière :
8h ----> allumage des lumières (digitalwrite High) -----> 20h ------> extinction des lumières (Digitalwrite, low) (çà fonctionne)

2° condition brumisation tout terra à 8h15
8h15 ---->brumisation des 4 terras (T1,T2, T3, T4) (digitalwrite High) -----> 8h15m20------>extinction de la brumisation (Digitalwrite, low) (çà fonctionne)

3° condition brumisation tout terra à 19h30
19h30 ---->brumisation des 4 terras (T1,T2, T3, T4) (digitalwrite High) -----> 19h30m20------>extinction de la brumisation (Digitalwrite, low) (çà fonctionne)

4° condition brumisation Terrarium 1 pendant la période de 8h15 et 19h30
Heure pulvérisation == current ------>brumisation T1 (digitalwrite High) -----> Heure pluvérisation +20s == current ------> extinction de la brumisation (Digitalwrite, low) et heure pulvérisation = (heure pulvérisation actuelle + période égal distance) -----> retour début de cette condition

est ce que c est mieux ?

Cool, c'est sympa de savoir a quoi çà sert et de voir au dela des lignes de code.
Après les canettons d'Infobarquee, v'la les grenouilles de Stef84.

Y'a un repas de Noël de prévu ?
Parce que magret et cuisses de grenouilles ca devrait être pas mal.
Si on bouffe en fonction du nombre de post ....

Sinon pour être sérieux, j'en revient à la méthodologie.
Essaye de traduire ce que tu viens d'exprimer sous la forme d'une machine d'état avec des durées/heures paramétrables.
Une machine d'état qui gère le cycle journalier avec deux cas : journée d'hivers d'hiver et journée d'été.
Une machine d'état brumisation qui sera déclenchée par la 1ère machine d'état.

A la fin tu pourra implémenter chaque machine d'état dans une classe C++ avec les paramètres et variables propors dans la classe.
Et tu pourra créer 4 instances de ces classes, une pour chacun des terrarium. D'ailleurs terrarium pourra être une classe qui contient les objets machine d'état jour et machine d'état brumisateur.

Pour les cuisses, je te les laisse volontiers, ce sont des "dart frogs", les mêmes espèces de grenouilles que les amazoniens se servent pour faire leur flèches empoisonnées :wink:

pour les périodes de mois, j ai pas de soucis, ce qui me pose problème, c est le nombre de pulvérisation sur une journée, j ai un soucis soit par ce que je me retrouve avec des virgules dans le long ou que l arduino ne sait pas faire les calculs, ou parce que je reprends une définition d un long pour le ré incrémenter mais çà je ne sais pas définir

je vais le faire avec des valeurs :

sur la période pluie (que je sais mettre en condition) :
donnée du problème :
1 ère pulverisation : 8h15
dernière pulverisation : 19h30
nombre pulverisation : 7 au total // 5 si on tient de celles prédéfinie au dessus (7-2)

donc je souhaite sur 11h15 faire 5 pulvérisations
11h15 / 5 = environ toutes les 2h20 une pulvérisation
1 ère pulverisation : 8h15
la suivante : 8h15 + 2h20
la suivante = la suivante + 2 h20

etc

mais est ce que l arduino accepte ce genre de ré-incrémentation de compteur (dans mon programme : compteur_brumi_T1=compteur_brumi_T1+espacement_brumi_pluie_T1;)

je programme en windev et access, ça se fait par contre en dérivé de c++ je ne sais pas

lol pour le L de long je savais pas ^^ pour le les variables de début ok je capte ( je pensai à une triplication ou coi au début ne sachant pas ce que tu brumisai ^^) et oui tu fait bien de te moquer quand les autres ce sont moqué j'aurais fait pareil ^^, mais essaie d'être plus précis la prochaine fois tu aura des réponse plus précise et plus rapide à mon avis, après je rejoint barbudor sur les machines d'état, ça te simplifiera la vie.

et pour finir une RTC c'est un horloge qui garde l'heure (même sans alimentation, pile intégré) ou la fonction milis() donne le temps depuis le début du programme en ms te permet de savoir combien c'est passer de temps entre deux échantillons, te permettrai d'avoir l'heure ou du moins une mesure de temps dans ton programme, il y en a d'autre mais bon tu ne parle d'aucune d'entre elles donc on est en droit de ce poser des questions :s

Et sinon je le répète mais oui tu peu utiliser ce genre d'addition:
var1=var1+var2;

bref peut être pas un soir de jour férié mais demain ou boulot je vais te faire une petite machine d'état avec tes valeurs un système de suivit du temps qui pourra te servir de structure si tu le veux =)

Skizo !

après le soucis d en mettre trop, c est qu on se noie dans l information

c est pour çà que j ai été au plus rapide :wink:

pas de soucis, la prochaine fois j en mettrais plus

par contre comment réagi une variable : long=long/long et que le résultat est avec des virgules, çà devient un entier ou c'est le bazard comme quand on utilise les long =60000 sans le L à la fin

merci pour la machine d'état, mais je me suis fait un organigramme par "section" : lumière/chauffage/brumisation etc avec un point de départ/arrivée et tout ce que je souhaite tenir compte entre le départ et l'arrivée :wink: au final on doit arriver à la même chose

mon rtc est géré par un ds1307 couplé à d32hz que j ai intégré sur une platine de proto megashield (un truc du genre), par contre je n utilise pas les fonctions delais, milli, je me suis fait un current, l avantage par rapport au milli (si j ai bien compris), c est que le milli s incrémente au démarrage du programme donc si une coupure, il repart à 0, alors que mon current est basé sur l heure courante en seconde

Stef84:
pour les périodes de mois, j ai pas de soucis, ce qui me pose problème, c est le nombre de pulvérisation sur une journée, j ai un soucis soit par ce que je me retrouve avec des virgules dans le long ou que l arduino ne sait pas faire les calculs, ou parce que je reprends une définition d un long pour le ré incrémenter mais çà je ne sais pas définir

bonsoir
J'ai lu jusqu'au dessus
en dehors de ce qui a été expliqué , je (tente de ) passer à la reduction de ton probleme

pour une Espèce de cuisses données :grin:

  • 2 saisons (pluie/seche) ? durée du jour (et nuit) fixe ? (simulation latitude équatoriale/tropicale moyenne ?) et fonction de la saison ?

  • Le Nb de brumisations est fonction de l'espece ET de la saison ?

  • Les brumisations interviennent à delais et durées constants (fonction des Parametres du dessus) ?

2 saisons (pluie/seche) : oui
durée du jour (et nuit) fixe ? : oui

(simulation latitude équatoriale/tropicale moyenne ?) je dirais oui en fonction de ce que moi je déduis de ta question
fonction de la saison ? oui
Le Nb de brumisations est fonction de l'espece ET de la saison ? oui

Les brumisations interviennent à delais et durées constants (fonction des Parametres du dessus) ? oui

je ne suis pas contrariant :slight_smile:

par contre, les valeurs sont susceptibles d'être changer par un écran TFT (les mois, le nombre de pulvérisation, heure debut/fin lumière), et c est là que çà se corse, au début j avais des heures de brumisations que j avais définis à la main que je comparais à mon current et mois de l année çà fonctionnait ; mais depuis que je jongle avec des formules de calculs çà ne marche plus sauf sur le papier

vient de voir que j ai oublié les L, sur les "Long brumi_seche_T1=4;"

je modifie et vous tient au courant

Stef84:
2 saisons (pluie/seche) : oui
durée du jour (et nuit) fixe ? : oui

(simulation latitude équatoriale/tropicale moyenne ?) je dirais oui en fonction de ce que moi je déduis de ta question
fonction de la saison ? oui
Le Nb de brumisations est fonction de l'espece ET de la saison ? oui

Les brumisations interviennent à delais et durées constants (fonction des Parametres du dessus) ? oui

je ne suis pas contrariant :slight_smile:

par contre, les valeurs sont susceptibles d'être changer par un écran TFT (les mois, le nombre de pulvérisation, heure debut/fin lumière), et c est là que çà se corse, au début j avais des heures de brumisations que j avais définis à la main que je comparais à mon current et mois de l année çà fonctionnait ; mais depuis que je jongle avec des formules de calculs çà ne marche plus sauf sur le papier

Ok
Je crois que ton probleme vient essentiellement du fait que tu veux construire une usine à gaz concernant la gestion du temps "en absolu), plutôt que de te "polariser" sur les délais fixes initiés par des paramètres initialement connus.
L'echelon de temps pour le process est là la minute, je suppose qu'il n'y a aucune étape qui n'accepte pas cet échelon ?
Tes "cuisses" ne vont pas se mettre à hurler parce que la brumisation aura debutée à 12H32.07 au lieu de 12H31.47 8) , ce qui est important c'est la constance.

le changement par ecran TFT ce n'est In fine qu'un nouveau paramétrage imposé, entre temps c'est une situation "automatique"

ok dac bon alors on y vient tu a une horloge ^^ donc pas besoin de ce genre de chose ton current est parfait :x

après je ne saisie toujours pas ce qu'est le vrai problème..?

deux brumisation ne ce font pas c'est ça?

Skizo !

Tes "cuisses" ne vont pas se mettre à hurler parce que la brumisation aura debutée à 12H32.07 au lieu de 12H31.47 smiley-cool , ce qui est important c'est la constance.

Non pas de soucis, mais comme la brumi ne doit pas dépasser 20s, j ai gérer çà en secondes et pas minutes

après je ne saisie toujours pas ce qu'est le vrai problème..?
deux brumisation ne ce font pas c'est ça?

en fait non, les 2 brumisations (1ère/dernière) définis sur des long rentrés manuellement ne posent pas de problème
ce sont celles que j'essaie de définir par des calculs qui ne fonctionnent pas

en fait ce morceaux là:
je souhaite sur 11h15 faire 5 pulvérisations
11h15 / 5 = environ toutes les 2h20 une pulvérisation
1 ère pulverisation : 8h15
la suivante : 8h15 + 2h20
la suivante = la suivante + 2 h20

okok, tu peut nous mettre tout le code qui plante qu'on y jete un oeuil =)

Skizo!

Stef84:

Tes "cuisses" ne vont pas se mettre à hurler parce que la brumisation aura debutée à 12H32.07 au lieu de 12H31.47 smiley-cool , ce qui est important c'est la constance.

Non pas de soucis, mais comme la brumi ne doit pas dépasser 20s, j ai gérer çà en secondes et pas minutes

après je ne saisie toujours pas ce qu'est le vrai problème..?
deux brumisation ne ce font pas c'est ça?

en fait non, les 2 brumisations (1ère/dernière) définis sur des long rentrés manuellement ne posent pas de problème
ce sont celles que j'essaie de définir par des calculs qui ne fonctionnent pas

en fait ce morceaux là:
je souhaite sur 11h15 faire 5 pulvérisations
11h15 / 5 = environ toutes les 2h20 une pulvérisation
1 ère pulverisation : 8h15
la suivante : 8h15 + 2h20
la suivante = la suivante + 2 h20

alors travaille en minute relative depuis minuit
tu a 1440 minutes par jour
8H15= minute 495 (brumisation N° 0, la premiere)
2H20=140 minutes
les 4 (ou x) brumisations suivantes
interviendront à la minute
brume[ib]=495+(140*ib)

etc
ne reste qu'à reconstituer ça en heure pour comparer avec le ds1307
heurebrume (un entier) =brume[ib]/60 (division)
minutebrume (un entier)= brume[ib] % 60 (modulo)

intuitivement je travaillerais avec un tableau des minutes de brumisation : brume[ib]
où ib est le numero (l'indice) de brumisation pour une journée (entre 0 et 4 pour 5 brumisations)

Y'a un truc que je comprends pas.
Tu as une horloge temps réel qui te donne des heures, minutes, secondes et tu t'embêtes à faire des calculs tordues avec des long sur des heures converties en minutes sur une journée. Serais-tu un pervers qui s'ignore?
Pourquoi ne pas travailler directement avec les heures et minutes pour le déclenchement des brumisations et utiliser le compte des secondes pour arrêter les brumisateurs?
Eventuellement, si tu es perfectionniste, créer un classe qui te permette de faire de l'arithmétique en heure,minute,seconde.

tu t'embêtes à faire des calculs tordues ... Serais-tu un pervers qui s'ignore?

Tu viens de le dire, je suis tordu XD

et peut être pervers aussi XD

Question idiote, vous appelez quoi une classe ? (un void temps() par exemple)

Pourquoi ne pas travailler directement avec les heures et minutes pour le déclenchement des brumisations et utiliser le compte des secondes pour arrêter les brumisateurs?

je souhaite paramétrer à travers mon écran TFT :

l heure et date du jour (fait) sous forme 8 h 15 1 (<---jour semaine) 12/12/2012
L heure d'allumage/extinction des feux sous forme 8 h 15

à faire par terra :

consigne de température :
delta
t° nuit
T° jour

brumisation :
Nbre de brumi période sèche
Nbre de brumi période pluie
mois période sèche
mois période pluie

et avec çà, je faits mes calculs (pervers :wink: ) pour essayer d obtenir ce que je souhaite et çà doit coincer lorsque je faits :
(heure de fin-heure de début)/nbre de brumisation =X , X me donne l'écart entre chaque brumisation

je ne dirais pas perfectionniste mais plutôt ne pas avoir à rebrancher l’ordinateur à chaque fois, bon d accord j’admets un pervers perfectionniste tordu, je l assume, je suis comme çà aussi au boulot et çà complique énormément les choses car personne ne suit :wink:

est ce que l on peut convertir un INT en LONG, car au niveau de la modification à travers l'écran comment je peux gérer le L avec un LONG=xxL
Il faut que je passe par :
int essai=5;
long=(essai)L
?

j ai trouvé çà :

Example Code

int x;
int y;
float z;

x = 1;
y = x / 2; // y now contains 0, ints can't hold fractions
z = (float)x / 2.0; // z now contains .5 (you have to use 2.0, not 2)

est ce que le long ne réagit pas comme ci-dessus pour le int

Question idiote, vous appelez quoi une classe

Une classe permet de regrouper dans une même entité des données et des fonctions membres (appelées aussi méthodes) permettant de manipuler ces données (Programmation C++/Les classes — Wikilivres)

Par exemple, pour ton application, on peut créer une classe HMS, qui définit en interne 3 données heure, minute,seconde et un ensemble d'opérateurs qui permettent de manipuler ces données. En premier on créé un constructeur c'est une méthode particulière qui va être appelée lors de la création d'un nouvel objet HMS et qui permet de l'initialiser. On peut ensuite redéfinir l'addition, la soustraction les opérateurs de comparaison sur cet objet . Comme ça ensuite ton programme manipule directement des objets HMS qui contiennent des heures minutes secondes de manière complètement transparente.
Par exemple une fois la classe définie tu peux écrire quelque chose comme ça

HMS HeureDebut(8,45,00);
HMS HeureCourante();
HMS deltaBrume(2,20,0);
HMS HeureBrumi();

DS1307 rtc

 rtc.get(&sec, &min, &hour, &day, &month, &year);
 HeureCourante.set(hour,min,sec);


 if (HeureCourante > HeureDebut){
   .......
}

ou bien

HeureBrumi = HeureCourante+deltaBrume;

Te remercie pour les explications

effectivement çà pourrait être plus simple d'utilisation après coup

par contre les classes sont à faire dans un .h et .cpp

ou on peut le faire directement dans le pde (c est un peu au dessus de mes compétences pour l instant)

j ai remodifié mon prog hier, en jouant sur les CAST, je verrais ce soir si çà a fonctionné ou pas, mais je suis intéressé parton exemple et remplacer ce que j ai fait, mais je voudrais savoir pourquoi ce que j ai fait initialement ne fonctionne pas