Go Down

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

Stef84

Quote
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

Quote
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


skizoh

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

Skizo!
Un tien vaux mieux que deux tu l'auras !

Artouste

#17
May 09, 2012, 12:25 pm Last Edit: May 09, 2012, 12:37 pm by Artouste Reason: 1

Quote
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

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


fdufnews

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.

Stef84

#19
May 09, 2012, 01:49 pm Last Edit: May 09, 2012, 02:08 pm by Stef84 Reason: 1
Quote
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)

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

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
?



Stef84

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

fdufnews

Quote
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 (http://fr.wikibooks.org/wiki/Programmation_C%2B%2B/Les_classes)

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

Code: [Select]
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

Code: [Select]
HeureBrumi = HeureCourante+deltaBrume;

Stef84

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

skizoh

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

fdufnews

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

fdufnews

#25
May 10, 2012, 01:44 pm Last Edit: May 10, 2012, 01:52 pm by fdufnews Reason: 1
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
Code: [Select]
typedef struct var_temps{
 unsigned char heure;
 unsigned char min;
 unsigned char sec;
}

ensuite tu crées tes variables
Code: [Select]
var_temps heureDebut;
var_temps heureBrumi;

et tu peux les manipuler comme ça
Code: [Select]
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.
Code: [Select]

/*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
Code: [Select]

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
Code: [Select]
// pour tester si une échéance est passée
if (compTemps(curTime,heureDebut)==1){
.....}

skizoh

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

Artouste

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)



fdufnews

#28
May 10, 2012, 03:59 pm Last Edit: May 10, 2012, 04:21 pm by fdufnews Reason: 1
Quote
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.

Artouste


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



Go Up