Go Down

Topic: [résolu] Calcul temps (Read 4196 times) previous topic - next topic

Stef84

May 08, 2012, 04:38 pm Last Edit: May 14, 2012, 04:44 pm by Stef84 Reason: 1
Bonjour,

petit problème de gestion/calcul temps

morceaux de mon prog :

Quote
// basculement heure/nuit
long heureN=73800L;  // 20h
long heureJ=28800L; // 8h

// brumi jour
long brumiJ=(heureJ+900L); // 08h15
long brumiN=(heureN-3600L); // 19h30

long temps_brumi=20;

long brumi_seche_T1=4; // Nombre brumi periode seche
int mois_sec_T1=6;     // Mois periode seche
long brumi_pluie_T1=7; // Nombre brumi periode pluie
int mois_pluie_T1=9;   // Mois periode Pluie

long brumi_seche_T2=4; // Nombre brumi periode seche
int mois_sec_T2=6;     // Mois periode seche
long brumi_pluie_T2=7; // Nombre brumi periode pluie
int mois_pluie_T2=9;   // Mois periode Pluie

long brumi_seche_T3=4; // Nombre brumi periode seche
int mois_sec_T3=6;     // Mois periode seche
long brumi_pluie_T3=7; // Nombre brumi periode pluie
int mois_pluie_T3=9;   // Mois periode Pluie

long brumi_seche_T4=4; // Nombre brumi periode seche
int mois_sec_T4=6;     // Mois periode seche
long brumi_pluie_T4=7; // Nombre brumi periode pluie
int mois_pluie_T4=9;   // Mois periode Pluie

long espacement_brumi_seche_T1=((brumiN-brumiJ)/(brumi_seche_T1-2L));
long espacement_brumi_pluie_T1=((brumiN-brumiJ)/(brumi_pluie_T1-2L));

long espacement_brumi_seche_T2=((brumiN-brumiJ)/(brumi_seche_T2-2L));
long espacement_brumi_pluie_T2=((brumiN-brumiJ)/(brumi_pluie_T2-2L));

long espacement_brumi_seche_T3=((brumiN-brumiJ)/(brumi_seche_T3-2L));
long espacement_brumi_pluie_T3=((brumiN-brumiJ)/(brumi_pluie_T3-2L));

long espacement_brumi_seche_T4=((brumiN-brumiJ)/(brumi_seche_T4-2L));
long espacement_brumi_pluie_T4=((brumiN-brumiJ)/(brumi_pluie_T4-2L));

long compteur_brumi_T1;
long compteur_brumi_T2;
long compteur_brumi_T3;
long compteur_brumi_T4;

Quote

void setup();


Quote
void loop(

 if (((brumiJ<=current) && (current<(brumiJ+temps_brumi))))  // première brumisation
     {
       compteur_brumi_T1=brumiJ+espacement_brumi_pluie_T1;
       compteur_brumi_T2=brumiJ+espacement_brumi_pluie_T2;
       compteur_brumi_T3=brumiJ+espacement_brumi_pluie_T3;
       compteur_brumi_T4=brumiJ+espacement_brumi_pluie_T4;
       digitalWrite(R31,HIGH);
     }
   else
     {
       digitalWrite(R31,LOW);
     }
     
   if (((brumiN<=current) && (current<(brumiN+temps_brumi)))) // dernière brumisation
     {
       compteur_brumi_T1=0;
       compteur_brumi_T2=0;
       compteur_brumi_T3=0;
       compteur_brumi_T4=0;
       digitalWrite(R31,HIGH);
     }
   else
     {
       digitalWrite(R31,LOW);
     }      
     
     
   if ((compteur_brumi_T1<=current) && (current<(compteur_brumi_T1+temps_brumi)))  // brumisation en journée
     {
       digitalWrite(R31,HIGH);
     }
   else
     {
       digitalWrite(R31,LOW);
       compteur_brumi_T1=compteur_brumi_T1+espacement_brumi_pluie_T1;
     }


les 2 premièrs digitalwrite fonctionne, les autres non

j essaie quelque chose qui n est pas possible ?

barbudor

Le jeu c'est quoi ?
Essayer de deviner ce que le programme est sensé faire alors qu'il ne le fait pas ?

;)

Peux être pourrais tu être plus précis sur là où tu veux aller et donner tout le code, parce que dans l'état des choses, je ne comprend rien a ton programme qui est en plus incomplet.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Stef84

#2
May 08, 2012, 06:30 pm Last Edit: May 08, 2012, 06:37 pm by Stef84 Reason: 1
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  ;) )

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

j allume ou éteint la lumière lorsque current (heure*3600+min*60+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 :
Quote

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
Quote
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 çà :
Quote
compteur_brumi_T1=compteur_brumi_T1+espacement_brumi_pluie_T1;


skizoh

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 !
Un tien vaux mieux que deux tu l'auras !

barbudor

#4
May 08, 2012, 07:18 pm Last Edit: May 08, 2012, 07:21 pm by barbudor Reason: 1
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+

     
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

AlienArea51

Quote
Le jeu c'est quoi ?
Essayer de deviner ce que le programme est sensé faire alors qu'il ne le fait pas ?


Quote
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 !!!


Pardon ,c'est dégueussale , mais je me fends la gueule  :D :D
OUUUUUFF ,pitié .
Pardon Stef84 , sans rancune ,j'espère , mais les collègues m'ont fait rire  ;)
Mais j'avoue ,ne rien avoir Bité  ;)
@+


The truth is elsewhere !!

Stef84

#6
May 08, 2012, 08:02 pm Last Edit: May 08, 2012, 08:26 pm by Stef84 Reason: 1
@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  ]:D

Quote
RTC sans millis() ou sans aucun mesure de temps

euh c est quoi çà
Quote
....lorsque current (heure*3600+min*60+second) ...
, faut lire aussi les posts pas uniquement le programme  ]:D



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

mode joke fin

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

Quote
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



Quote
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 ?

barbudor

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.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Stef84

#8
May 08, 2012, 08:42 pm Last Edit: May 08, 2012, 08:52 pm by Stef84 Reason: 1
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  ;)

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

skizoh

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 !
Un tien vaux mieux que deux tu l'auras !

Stef84

#10
May 08, 2012, 09:17 pm Last Edit: May 08, 2012, 09:24 pm by Stef84 Reason: 1
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 ;)

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

Artouste



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  :smiley-mr-green:
- 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) ?


-

Stef84

#12
May 08, 2012, 09:31 pm Last Edit: May 08, 2012, 09:38 pm by Stef84 Reason: 1
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  :)

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

Artouste


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  :)

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"

skizoh

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 !
Un tien vaux mieux que deux tu l'auras !

Go Up