Go Down

Topic: Comparaison de Char (Read 138 times) previous topic - next topic

guigui76

Bonjour, suite à une remarque de Heloderma-kris dasn le topic http://forum.arduino.cc/index.php?topic=284727.45
sur l'affichage de l'heure sur écran TFT et l'utilisation de char, j'essaye déclencher une action en comparant le char de l'heure avec deux autres soit:
char debut
char fin
char heure

ce qui donne dans le loop
Code: [Select]
if(( heure>=debut) && (heure <= fin))// si l'heure actuelle est comprise entre l'heure de début et l'heure de fin

mais le résultat n'est pas probant.
Comment feriez-vous pour vérifier ceci?

Merci

Mon exemple complet:
Code: [Select]
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTFT_tinyFAT.h>
#include <UTouch.h>
#include <Wire.h>
#include "RTClib.h"
#include <Arduino.h>
#include <OneWire.h>

RTC_DS1307 rtc;
extern uint8_t BigFont[];

UTFT myGLCD(ITDB32WD,38,39,40,41); // Mega standard pinout for control pins
UTouch myTouch(62,63,64,65,66); //A8 up to A12 Pins on Arduino board

int relais=A0;

int Hdebut=10;
int Mdebut=10;
char debut[20];

int Hfin=Hdebut;
int Mfin=23;
char fin[20];

           void setup(){
myGLCD.InitLCD(LANDSCAPE);
myGLCD.setFont(BigFont);
myTouch.InitTouch(LANDSCAPE);
myTouch.setPrecision(PREC_HI);
file.initFAT(SPISPEED_VERYHIGH); // Optional, this can be tried to increase the reading
Wire.begin();
rtc.begin();
pinMode(relais, OUTPUT);
digitalWrite (relais, LOW);
}
           void loop(){
myGLCD.setColor(255, 255, 255);myGLCD.setBackColor(0,0,0);//couleur de l'écran et couleur de la olice d'ecriture
DateTime now = rtc.now();
int h=now.hour();
int m=now.minute();
int s=now.second();

char heure[20];
sprintf(heure,"%2i:%2i:%2i",h,m,s);// on transforme nos variable en chaine de caracter et on les place dans le buffer
myGLCD.print(heure,200,10);// on affiche la chaine de carracter au pixel x=100 y=100

myGLCD.print("Heure debut",10,50);
sprintf(debut,"%2i:%2i",Hdebut,Mdebut);
myGLCD.print(debut,200,50);

myGLCD.print("Heure fin",10,100);
sprintf(fin,"%2i:%2i",Hfin,Mfin);
myGLCD.print(fin,200,100);

if(( heure>=debut) && (heure <= fin))// si l'heure actuelle est comprise entre l'heure de début et l'heure de fin
{digitalWrite (relais, HIGH);
myGLCD.print("Eclairage",200,200);}
else{myGLCD.print("  rien        ",200,200);}// Sinon
}

XavierMiller

#1
Mar 03, 2015, 01:25 pm Last Edit: Mar 03, 2015, 01:25 pm by XavierMiller
Bonjour,

La comparaison de chaînes de caractères ne se fait pas comme çà, mais avec strcmp().

Dans ton cas, ce n'est pas une bonne idée de comparer des représentations "humaines" alors que tu as les valeurs brutes juste en haut (en entiers).

Calcule des temps en minutes ou secondes (selon la précision souhaitée) dans un long ou float, et compare celà.

Christian_R

Une conversion de type temps = heure/60 + minutes suivie d'un test sur des nombres est plus simple.
Christian

caape

Bonjour

C'est pas bon
Quote
Une conversion de type temps = heure/60 + minutes suivie d'un test sur des nombres est plus simple.
plutot 
Code: [Select]
temps=heures*60 + minutes;

a+
StandAlone domotique<br />Volet roulant, Capteur T° sur p iles, (Eclairage Salon SAM en cour)(Pilotage via WEB + Mobile (base ok))(Sonnette)(Alarme)...

guigui76

Donc si je comprends bien cela donnerai:
if ((Hdebut*60+Mdebut)<(h*60+m) <(Hfin*60+Mfin))
{//Action
}

Else
etc...

Je vais tester ceci ce soir.

Merci

XavierMiller

#5
Mar 03, 2015, 08:23 pm Last Edit: Mar 03, 2015, 08:23 pm by XavierMiller
Tu y es presque, sauf qu'un comparateur à 3 membres n'existe pas en C. Tu devras jouer avec (A <= B) ET (B < C)

guigui76

Merci

J'avais fait le rajout de parenthèse, j'avais deux if pour séparer les conditions, j'avais oublié l'existence des &&.

une dernière question dans l'exemple suivant char fin[20]; le nombre indique la place nécessaire pour le char soit 20 octets.
J'ai bien compris?

Merci à tous.

guigui76

et voilà ma solution
Code: [Select]
if ((Hdebut*60+Mdebut <=(h*60)+m)&&((h*60)+m <=Hfin*60+Mfin))

Merci

XavierMiller

Merci

J'avais fait le rajout de parenthèse, j'avais deux if pour séparer les conditions, j'avais oublié l'existence des &&.

une dernière question dans l'exemple suivant char fin[20]; le nombre indique la place nécessaire pour le char soit 20 octets.
J'ai bien compris?

Merci à tous.
Oui, tu as un vecteur de 20 caractères, soit maximum 19 caractères + le zéro final.

Et ton IF semble OK. Reste à toi à voir s'il faut mettre "=" dans les bornes inférieures et supérieures (c'est juste un détail).

guigui76

Hello, merci du coups de main.
Si j'ai bien compris les variables qui sont liés à l'heure étant déclarés dans le Loop, ne peuvent pas être utiliser dans une autre boucle sans être de nouveau déclaré.

J'ai tord au raison?

Merci

XavierMiller

La visibilité d'une variable est dans le bloc courant. Hors de ce bloc la variable n'existe plus.
Tu dois donc déclarer et définir une variable dans le scope le plus large, par exemple la fonction loop(), voire en global si nécessaire.

guigui76

J'ai tenté de mettre
Code: [Select]
DateTime now = rtc.now();
int h=now.hour();
int m=now.minute();
int s=now.second();

char heure[20];
sprintf(heure,"%2i:%2i:%2i",h,m,s);// on transforme nos variable en chaine de caracter et on les place dans le buffer
myGLCD.print(heure,200,10);// on affiche la chaine de carracter au pixel x=100 y=100


en dehors du Loop mais comme j'ai besoin de l'heure dans plusieurs endroit, je suis bien dans l'obligation de faire la déclaration dans toutes les zones qui vont utiliser l'heure.

XavierMiller

Sépare la déclaration de tes variables de l'affectation de leur valeur. Mets à jour une fois, lors de l'appel à la librairie RTC (dans loop()), puis utilise la valeur encodée ailleurs.

bigben99

Il y a une différence entre déclarer une variable et lui affecter une valeur.

La déclaration doit se faire au niveau de portée maximum dont tu as besoin :
avant setup si tu as besoin d'une variable globale
dans la méthode dans laquelle tu as besoin de la variable (tu pourras la passer en paramétré de méthodes appelées)

L'affectation d'une valeur doit se faire lorsque tu en as besoin mais dans une méthode (setup, loop, autres méthodes).
"...Quand vous avez un problème, essayez de donner le maximum d'informations..."
"...Vous indiquerez dans le contenu, la description précise de votre problème..."
(http://forum.arduino.cc/index.php?topic=102175.0)

guigui76

Bonsoir,
j'ai fait cela
Au  début avec le reste des variables
Code: [Select]
int h,m,s;

Puis dans un méthode Time j'ai mis cela
void heure(){
 char heure[20];
sprintf(heure,"%2i:%2i:%2i",h,m,s);
myGLCD.print(heure,200,10);

}

puis dans le Loop, je fais l'appelle de la méthode par
Code: [Select]
heure();

Cela vous semble cohérent?

Et merci de votre patient

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy