[résolu] Calcul temps

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

si tu veux mon avis, personne ne sera précisément ce qui marche pas a moins de prendre le code le tester et lignes après lignes bien surveiller tes variable etc, vue comme c'est fait je pense que tu a du te mélanger les pinceau et comme tu n'a pas choisie une structure claire il est dur de trouver facilement l’erreur, à mon avis une simple petite erreur, mets ça au claire et tu t'en sortira mieux, sinon tu mets des Serial.print partout histoire de suivre tes variable dans ton programme et bien voir que leur état est bon après déjà tu sera situer ou ce trouve le problème. bon courage quoi ^^

Skizo !

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)

On peut créer une classe localement. Elle ne sera alors vue que dans le code où elle est déclarée.
Ou alors on la crée dans un code extérieur et on l'inclut comme une librairie.

Je reste persuadé que l'utilisation des long est une complication qui peut masquer des problèmes et en plus on ne voit pas ce que l'on manipule.
Avant d'en arriver à la création d'une classe, il y a une solution plus light.
Création d'un type var_temps

typedef struct var_temps{
  unsigned char heure;
  unsigned char min;
  unsigned char sec;
}

ensuite tu crées tes variables

var_temps heureDebut;
var_temps heureBrumi;

et tu peux les manipuler comme ça

heureDebut.heure=8;
heureDebut.min=25;
heureDebut.sec=0;

il faut ensuite faire quelques outils
une addition, une comparaison qui recevront en argument des variables de type var_temps.
C'est quasiment le début d'une classe.

/*Comparaison de 2 variables var_temps
  retourne 0 si égales
             1 si t1 supérieure à t2
            -1si t1 inférieure à t2
*/
int compTemps(var_temps t1, var_temps t2){
   if (t1.heure==t2.heure) and (t1.min==t2.min) and (t1.sec==t2.sec) return(0);
   if (t1.heure>t2.heure) return(1);
   if (t1.heure==t2.heure) and (t1.min>t2.min) return(1);
   if (t1.heure==t2.heure) and (t1.min==t2.min) and (t1.sec>t2.sec) return(1);
   if (t1.heure<t2.heure) return(-1);
   if (t1.heure==t2.heure) and (t1.min<t2.min) return(-1);
   if (t1.heure==t2.heure) and (t1.min==t2.min) and (t1.sec<t2.sec) return(-1);
}

C'est juste un exemple, c'est un peu boeuf comme codage et c'est pas testé.

Pour utiliser ton DS1307

vat_temps curTime;

rtc.get(&h,&m,&s,....);
curTime.heure=h;
curTime.min=m;
cur_Time.sec=s;

après tu peux utiliser les opérateurs créés

// pour tester si une échéance est passée
if (compTemps(curTime,heureDebut)==1){
.....}

je rejoins fdufnews sur les long, une réel source de problème, toujours moyen de perdre des donné, dépassement, manipulation difficile, enfin bref, si tu peut faire autrement (on ce doute que ça va retourner ton code de la cave au grenier mais vaux mieux ça plutôt que ça ne marche pas, fait plusieurs versions au k ou ^^) fait le ça te simplifiera la vie !

Skizo !

même constat
vouloir absolument utiliser du long avec toutes les contraintes que cela implique pour gérer/comparer simplement de l'horodatation/temporisation est AMHA s'exposer à deconvenues.

en contraignant le raisonnement à (heures*60)+minutes
la max est de 1440 (progression continue)

en contraignant le raisonnement en notation directe heure.minute
le max est de 2400 (progression hachée)

en contraignant le raisonnement en notation directe heure.minute
le max est de 2400 (progression hachée)

Si je comprends bien tu proposes de coder heure minute sur un float.
Ce n'est pas sans danger. Il y a régulièrement des problèmes avec les arrondis dus au codage des flottants. Par exemple, les tests d'égalité stricte sont à proscrire.

Puis le système a ses limites. Si notre petit camarade désire ajouter le mois et la date on ne va plus y arriver.
Je continue à militer pour une classe ou une structure avec les opérateurs associés.

fdufnews:

en contraignant le raisonnement en notation directe heure.minute
le max est de 2400 (progression hachée)

Si je comprends bien tu proposes de coder heure minute sur un float.
Ce n'est pas sans danger. Il y a régulièrement des problèmes avec les arrondis dus au codage des flottants. Par exemple, les tests d'égalité stricte sont à proscrire.

Puis le système a ses limites. Si notre petit camarade désire ajouter le mois et la date on ne va plus y arriver.
Je continue à militer pour une classe ou une structure avec les opérateurs associés.

bonjour fdfunews
ha non surtout pas de float :grin:
de la concaténation entiere pouvant tout autant etre facilement derivée, c'est comme en tout , il faut aussi savoir ce que l'on manipule et comment.

mais une bonne classe simple d'utilisation de manipulation de datation est surement la meilleure méthode, je suis étonné d'ailleurs que cela n'existe pas déjà simplement ?

suis pas contre remanier mon code, et puis je suis là pour apprendre aussi (du coup j en aurai trois, ma gestion de radiateur, qui fonctionne, me reste le paramétrage à travers l'écran, ma gestion d' aqua marin à revoir, et les terras :roll_eyes: )

j ai moins de problème avec mes bases de données XD

sinon oui je ferais X version, une fois m a servi de leçon :wink:

@ artouste : tu sais ce qu il te reste à faire XD

merci pour votre aide

pour les mois, je comptais faire une condition voir un switch

en comparant le mois courant au mois défini et collé ensuite les actions à faire

juste une question, on fait comment pour avoir le delta de brumisation à partir de

heure debut : 8h15
heure fin : 19h30
nombre de pulvérisation : 7

le calcul va faire appel à des divisions et ça ne peut se faire qu a partir d un float non ?

J ai trouvé d ou venait le problème dans mon code :

voila comment il est fait maintenant :

dans l'entête :

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

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

int temps_brumi=20;

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

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

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

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

float espacement_brumi_seche_T1;
float espacement_brumi_pluie_T1;

float espacement_brumi_seche_T2;
float espacement_brumi_pluie_T2;

float espacement_brumi_seche_T3;
float espacement_brumi_pluie_T3;

float espacement_brumi_seche_T4;
float espacement_brumi_pluie_T4;

float compteur_brumi_T1;
float compteur_brumi_T2;
float compteur_brumi_T3;
float compteur_brumi_T4;

dans le void setup :

espacement_brumi_seche_T1=(((float)brumiN-(float)brumiJ)/(float)brumi_seche_T1);
espacement_brumi_pluie_T1=(((float)brumiN-(float)brumiJ)/((float)brumi_pluie_T1));

espacement_brumi_seche_T2=(((float)brumiN-(float)brumiJ)/((float)brumi_seche_T2));
espacement_brumi_pluie_T2=(((float)brumiN-(float)brumiJ)/((float)brumi_pluie_T2));

espacement_brumi_seche_T3=(((float)brumiN-(float)brumiJ)/((float)brumi_seche_T3));
espacement_brumi_pluie_T3=(((float)brumiN-(float)brumiJ)/((float)brumi_pluie_T3));

espacement_brumi_seche_T4=(((float)brumiN-(float)brumiJ)/((float)brumi_seche_T4));
espacement_brumi_pluie_T4=(((float)brumiN-(float)brumiJ)/((float)brumi_pluie_T4));

et dans le void loop :

myLCD.gText(75, 170, Serial_LCD::rgb16(254, 254, 1), (long) espacement_brumi_seche_T1);
myLCD.gText(75, 150, Serial_LCD::rgb16(254, 254, 1), (long)espacement_brumi_pluie_T1);

les compteurs étaient à 0, jusqu’à ce que je mette les calculs dans le setup et non plus dans l’entête

mais je vais le modifier comme cela a été suggéré :wink:

Stef84:
juste une question, on fait comment pour avoir le delta de brumisation à partir de

heure debut : 8h15
heure fin : 19h30
nombre de pulvérisation : 7

le calcul va faire appel à des divisions et ça ne peut se faire qu a partir d un float non ?

pourquoi ?
il faut raisonner echelon entier , tes "cuisse"s sont sensibles au nombre de brumisations, à leur frequence et à leur durée , pas au fait qu'elles démarrent à la seconde prés (meme si la durée de brumisation est calibrée à la seconde)

sauf plantage dans le calcul
il y a 1170-495 minutes =675 minutes entre 8H15 et 19H30
675/7=96 minutes (entieres) entre brumisations
1ere à 495 = 8H15
2eme à 495+96=591 = heure(entiere) = 591/60 =9heure , minute(entiere)= 591 modulo 60=51 =9H51
3eme à 591+96=687 =" "
etc

je suis d accord : pas à la seconde prêt, mais de ce que j ai compris int=entier et les divisions avec int ne se font pas et donnent comme résultat : 0 et dans ce cas on doit passer par un float mais tenant compte de ce que vous avez dit plus haut les long et float posent des problèmes, je voulais en fait savoir comment vous passez le problème ou si exceptionnellement, vous les utilisez

Le code est pour l'instant (comme çà fonctionne) comme indiqué ci dessus, en attendant de faire les modifications suggérées par les membres.
Les pauvres, le ricard était sec ces derniers temps XD

lol j'ai pas passer beaucoup de temps en compagnie de mon arduino dernièrement, on s'y mets demain allé :slight_smile:

Skizo !