Go Down

Topic: [Resolu] IF sur une notion de temps en seconde (Read 1 time) previous topic - next topic

Stef84

Mar 16, 2012, 07:47 pm Last Edit: Mar 17, 2012, 10:23 pm by Jean-François Reason: 1
Bonsoir,

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

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


fdufnews

#1
Mar 16, 2012, 09:35 pm Last Edit: Mar 16, 2012, 09:41 pm by fdufnews Reason: 1
Les constantes en long doivent être suffixées avec un L
Code: [Select]
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.
Code: [Select]
current=(((long)RTC.hour*3600L)+((long)RTC.minute*60L)+(long)RTC.second);

osaka

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

Code: [Select]
current=((RTC.hour()*3600)+(RTC.minute()*60)+RTC.second());


Stef84

#3
Mar 16, 2012, 10:42 pm Last Edit: Mar 16, 2012, 10:53 pm by Stef84 Reason: 1
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


osaka

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

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

Stef84

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

fdufnews

#6
Mar 17, 2012, 01:28 pm Last Edit: Mar 17, 2012, 01:34 pm by fdufnews Reason: 1
Quote
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 http://arduino.cc/en/Reference/IntegerConstants
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.

Stef84

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

osaka

En effet la lib n'est pas en cause (normalement) là c'était plutôt un coup de gueule perso.  ]:D
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

Stef84

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

Jean-François


ps : comment met on [resolu] dans le titre


En éditant le premier message..... c'est fait  ;)
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa


Go Up