Go Down

Topic: AQUABOUN'S /// GESTION D'AQUARIUM RECIFAL (Read 78860 times) previous topic - next topic

J-M-L

#45
Oct 13, 2017, 09:27 am Last Edit: Oct 13, 2017, 09:31 am by J-M-L
je ne comprends pas la question

(généralement on code l'heure sous forme de secondes depuis le début de la journée 3600 x h + 60 x m + s) comme ça on peut ajouter ou soustraire pour calculer des durées plus simplement que dans l'autre représentation )

il me semble que vous avez une horloge RTC dans votre projet, vous pouvez donc aussi utiliser les classes DateTime et TimeSpan de la RTCLib pour représenter le temps de manière compatible avec votre RTC
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Dans mon code d'origine :

long LEVER = 100000; // heure debut levé

Pour :

if ((time >= LEVER) && (time < finLEVER)){


Maintenant que je veut modifier cette variable par le click d'un bouton, si :
variable = 125500  donc 12h50
Que le click d'un bouton ajoute 10 minute, je vais me retrouver a 126500 ...
et vu cette long variable il me paraissait compliquer de mettre un condition pour que si les 4 dernier chiffre égal ou au dessus de 6000 sa passe a 0000 et ajoute 10000.

djbouns

vous pouvez donc aussi utiliser les classes DateTime et TimeSpan de la RTCLib pour représenter le temps de manière compatible avec votre RTC
a ... connait pas ... je vais tout de suite voir sa

J-M-L

#48
Oct 13, 2017, 09:57 am Last Edit: Oct 13, 2017, 10:41 am by J-M-L
si au lieu de coder h*1000 + m*100 + s vous tenez compte réellement des secondes et faites h*3600 + m*60 + s le nombre obtenu est moins "compréhensible" pour les humains mais les maths sont ensuite super simples. ajouter 1h 10 minutes et 22 secondes c'est simplement ajouter 1 * 3600 + 10*60 + 22 par exemple

et les tests du genre
Code: [Select]
if ((time >= LEVER) && (time < finLEVER)){vont continuer à fonctionner. Faut juste vous assurer de coder le temps partout pareil.

- dans l'absolu j'utiliserai des unsigned long, le temps c'est positif
- si vous faites des macros, pensez au signe ul au bout des constantes pour forcer l'évaluation non pas en entier mais en unsigned long

Code: [Select]
unsigned long t = 12*3600 + 35*60 + 10; // 12h35 et 10 secondes (pas bon en entier!!!)va bugger car le calcul numérique est effectué en int soit sur 2 octets signés par le pré-processeur et donc il faut l'écrire
Code: [Select]
unsigned long t = 12*3600ul + 35*60 + 10; // 12h35 et 10 secondes pour forcer le calcul en unsigned long

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Ok cela va fonctionner pour faire varier le programme mais après impossible(difficile) de pouvoir afficher l'heure modifier puisque elle est devenu un nombre du genre 46530 (12h55 30s)

kamill

Bonjour,

Code: [Select]
heure=t/3600;
minute=(t%3600)/60;
seconde=t%60;

J-M-L

#51
Oct 13, 2017, 10:29 am Last Edit: Oct 13, 2017, 10:38 am by J-M-L
Non c'est facile - en calcul entier:

(46530 / 3600) = les heures

(46530 / 60) % 60 = les minutes

(46530 % 60) = les secondes

EDIT: grillé par kamill :)

on n'a pas la même formule pour les minutes. le résultat et le même
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Arf ... sa marche ...
Vous avez réponse a tout ...
C'est agacent :)   :)   :)
Je commence a comprendre ce que ressente mes alternant BTS que j'ai dans mon équipe au boulo ...  :smiley-razz:

djbouns

jmet tout sa en forme ... j'ai pris ma journée, j'espère avoir bien avancer ce soir.

J-M-L

Arf ... sa marche ...
Vous avez réponse a tout ...
C'est agacent :)   :)   :)
Je commence a comprendre ce que ressente mes alternant BTS que j'ai dans mon équipe au boulo ...  :smiley-razz:
:)  :smiley-mr-green:
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

Donc, pour ne pas avoir a modifier tout mon code d'origine if ((time >= LEVER) && (time < finLEVER)){
(car foncion "time" lit hhmmss) et les fonctions j'ai fait ca :
Code: [Select]
unsigned long LEVERV = 36000; // 10h00 00
unsigned long LEVER;



void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

}

void loop() {

  // put your main code here, to run repeatedly:

LEVERV = LEVERV +40*60 ; // +40 min

LEVER = ((LEVERV/3600*10000ul)+(((LEVERV%3600)/60)*100ul)+(LEVERV%60));
Serial.print(LEVER);
Serial.println();
delay (5000);
}



Si sa vous paret correct jme lance dans toute la modif sur mon code principal

djbouns

et une autre petit question,
Il faut que je fixe des condition pour certaine variable (par exemple pompe a 100% pour ne pas passer a 101%)

Cela pose t'il problème si elle sont juste après l'action du bouton ?

Code: [Select]
case 4:
          puissanceblanc += labelValue;
            if (puissanceblanc >100){
            puissanceblanc = 100;
          }
          else if (puissanceblanc <0){
            puissanceblanc = 0;
          }
          break;

djbouns

Et encore une :)
Certain bouton doivent modifier des variable de 0.1
Visiblement ça ne marche pas.
du au  " long int labelValue;" ?
J'ai tenté de le remplacer par un double mais sans succès non plus

J-M-L

#58
Oct 13, 2017, 11:52 am Last Edit: Oct 13, 2017, 11:53 am by J-M-L
préférez l'utilisation de fonctions plutôt que de coder les trucs en dur partout dans le code.

Code: [Select]
unsigned long LEVERV = 36000ul; // 10 h00 00

void printTime(unsigned long t)
{
  unsigned int h, m, s;

  h = t / 3600;
  m = (t / 60) % 60;
  s = t % 60;
  Serial.print(h);
  Serial.print(F(":"));
  if (m < 10)  Serial.print(F("0"));
  Serial.print(m);
  Serial.print(F(":"));
  if (s < 10)  Serial.print(F("0"));
  Serial.println(s);
}


void setup() {
  Serial.begin(115200);
  printTime(LEVERV);
}

void loop() {
  delay (1000);
  LEVERV +=  40 * 60 ; // +40 min
  printTime(LEVERV);
}


attention bien sûr au débordement, rien dans ce code ne vérifie que vous allez au delà de minuit

Quote
Cela pose t'il problème si elle sont juste après l'action du bouton ?
Non, je ne vois pas pourquoi ce serait un soucis
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

#59
Oct 13, 2017, 11:54 am Last Edit: Oct 13, 2017, 11:55 am by J-M-L
Quote
Certain bouton doivent modifier des variable de 0.1
un long c'est un nombre entier, donc ajouter 0.1 ne change rien...

je suppose que ce n'est pas pour le temps? si quelque chose varie de 0.1 en 0.1 alors il faut stocker cela dans un float ou un double (même représentation sur 4 octets sur un MEGA). Ensuite quand vous afficher la valeur il faut vous assurer de ne pas uniquement représenter la valeur entière.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up