[Resolu] IF sur une notion de temps en seconde

Bonsoir,

j ai un soucis avec ma condition qui bascule du if à else alors que la valeur current est dans les bornes:

long current;
long heureN=72000;  // 20h
long heureJ=28800; //8 h

loop :
current=((RTC.hour*3600)+(RTC.minute*60)+RTC.second);

if ((heureJ<current) && (current<heureN)) {
...}
else
{....}

je suis passé du int au long, car j avais pas fait gaffe qu il y avait une longueur dans les entiers

est ce qu il faut que je fasses un unsigned long à la place du long ?

Les constantes en long doivent être suffixées avec un L

long current;
long heureN=72000L;  // 20h
long heureJ=28800L; //8 h

Pareil pour le reste de ton code je ne connais pas la librairie RTC. Mais je suppose que les variables hour, minute et second associés à l'objet RTC retournent des entiers. il faudrait faire un cast pour que le résultat soit exprimé en long.

current=(((long)RTC.hour*3600L)+((long)RTC.minute*60L)+(long)RTC.second);

Je viens de regarder la lib rtc, et ils retournent tous un unsigned char (uint8_t) sauf year un unsigned int (uint16_t), enfin il ne devrait pas y avoir de problème pas besoin de cast normalement le compilateur a parfaitement compris.
Par contre je sais pas si c'est la même lib mais il ne manquerait pas quelque chose comme des () ?
Je suppose que ce ne sont pas des attributs public ...

current=((RTC.hour()*3600)+(RTC.minute()*60)+RTC.second());

oups j ai oublié la librairie c est la ds1307new. avant dernière version, la dernière étant pour l arduino1.0 (je suis actuellement en 23)

je vais jeté un coup d oeil sur vos remarques par rapport à la lib

alors dans le h

uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t dow; // day of week, 0 = sunday
uint8_t day;
uint8_t month;

si je rajoute les (), j ai une erreur en vérification

Ah be c'est du propre, je vois même pas pourquoi ils s'amusent avec une classe si c'est pour violé une règle de base de la poo, je suppose qu'ils n'ont jamais entendu parlé d'encapsulation, d'accesseur, etc ...

Et ils ont le culot de parlé de convention ...

// # Naming Convention:
// #	get...	Get information from the DS1307 hardware
// #	set...	Write information to the DS1307 hardware

du coup il y a une solution avec cette librairie ou faut la changer et dans ce cas laquelle prendre pour tourner sur une arduino 2560

du coup il y a une solution avec cette librairie

La librairie n'est pas en cause. Elle est peut être codée avec les pieds mais le problème pour lequel tu nous questionnes n'est pas là.

As-tu seulement essayé ce que j'ai proposé?

A minima il faut ajouter L à la fin des constantes long. C'est comme ça, c'est les règles de codage du C on ne peut pas déroger! Sinon les constantes sont tronquées à 16 bits. C'est même écrit dans la documentation Arduino Integer Constants - Arduino Reference
Tel que ton code est écrit, les calculs se font sur l'espace des entiers signés soit -32768 à 32767.

Maintenant le cast devant les variables c'était ceinture et bretelles. Dans les opérations s'il y a un opérande en int et un en long le compilateur fait l'opération sur un long. Mais c'est une bonne habitude de le préciser comme ça on sait ce que l'on fait. C'est une bonne pratique.

non j allais le lancer la maj, je me bats depuis ce matin avec mon congélo

ma réponse était par rapport à la réponse d osaka qui apparaissait négative

je tiens au courant

En effet la lib n'est pas en cause (normalement) là c'était plutôt un coup de gueule perso. ]:smiley:
Je suppose qu'il a fais le teste et que c'était effectivement ça 'L' parce que sinon je vois pas.
Il aurait fallu donner la valeur constatée de "current", on aurais pu confirmé.

J'y pensais depuis un moment, mais pour le coup j'ai commandé un module RTC. XD

j ai fait toute la modif comme fdufnews l avait conseillé, à priori ça a résolu le problème

merci

ps : comment met on [resolu] dans le titre

Stef84:
ps : comment met on [resolu] dans le titre

En éditant le premier message..... c'est fait :wink:

merci