DS3231 sur ARDUINO MINI PRO / Probleme de comparaison d'heure

Bonjour ,
Débutant dans l’univers ARDUINO , je cherche à réaliser un petit montage pour créer des séquences différentes en fonction de l’heure de la journée ( 12h 15h : ventilo ; 16h17h: chauffage … ).
Pour cela j’utilise ARDUINO MINI PRO associé à la RTC DS3231 .
Tout fonctionne parfaitement , je récupère bien les informations sur le moniteur série , j’arrive à exploiter la donnée MONTH dans une boucle conditionnelle
En revanche j’ai du mal exploiter la donnée TIME ( Au format HH:MM:SS ) dans une boucle conditionnelle IF .
J’ai essayé cette syntaxe :

// Comparaison de l’heure à partir de la RTC
if (rtc.getTimeStr()> 12:00:00 && rtc.getTimeStr()< 14:00:00)
{Serial.print("Fonctionnement ventilateur ");}

ou rtc.getTimeStr() est l’instruction qui me permet de récupérer la donnée TIME (: 20:37:10)

Mais cela ne fonctionne pas .
Une idée ??
Merci d’avance de votre aide

Salut

getTimeStr() retourne une chaîne caractères, à comparer donc avec une autre chaîne de caractères.
En C/C++ une chaîne est encadrée de doubles quotes : "12:00:00" et "14:00:00" donc.

@+

Hbachetti merci beaucoup pour ta réponse rapide.
Cela fonctionne mais à moitie , j’ai fait un test :
if (rtc.getTimeStr()> 22:00:00 ) {Serial.print("Fonctionnement ventilateur ");} à 22:42 aucune réponse
en revanche la synthaxe suivante à fonctionnée
if (rtc.getTimeStr()< 22:00:00 ) {Serial.print("Fonctionnement ventilateur ");}
La chaine de caractères à mettre entre les quotes doit elle avoir le format HH:mm:SS ?
Merci d’avance

En C, la comparaison de chaine de caractères peut être faite avec la fonction strcmp()

strcmp(chaine1, chaine2) retourne 0 si les 2 chaines sont identiques
strcmp(chaine1, chaine2) retourne une valeur négative si chaine1 est inférieure à chaine2
strcmp(chaine1, chaine2) retourne une valeur positive si chaine1 est supérieure à chaine2

dans ton cas

if(strcmp(rtc.getTimeStr(), "22:00:00")==0) { 
   // chaines egales
   }

Alain46 a raison.
Simple omission de ma part.
Cela paraît tellement évident quand on passe son temps à écrire du C tous les jours.

@+

Excusez moi mais je pense que le problème est mal posé au départ ( ou alors c'est encore un coup de la dictature des bibliothèques).
Retour à la base :
La question est de comparer des heures --> donc des nombres et non pas de l'alphanumérique.

Le DS3231 ne gère pas l'alphanumérique, il gère des nombres codés en BCD (binaire codé décimal)
Un nombre décimal est composé de chiffres compris entre 0 et 9.
En BCD chaque chiffre (unité, dizaine, centaines, etc) est codé séparément en binaire.
Exemple 231 -> 010 011 001
Il existe des fonctions très simples qui permettent de passer du BCD au décimal et vice versa.
Les bibliothèques pour RTC en comportent toutes.

S'il y a des l'alphanumérique c'est la bibliothèque que le créé.

Dans cette "bibliothèque miracle" il n'y a pas moyen de récupérer directement la valeur numérique ?

Parce que passer du numérique à l'alpha puis repasser en numérique pour avoir un nombre correspondant à la différence entre deux heures c'est : Pourquoi faire simple quand on peut faire compliqué !

Bonjour

Manipuler des horaires dans des chaînes de caractères beurk beurk beurk :slight_smile:

La voie standard est de convertir toutes les heures / minutes en un simple entier.
Par exemple en adoptant une valeur entière qui représente le nombre de minutes écoulées depuis minuit.

 int maintenant = now.hour * 60 + now.minute; //valeur comprise entre 0 et 1339
const int debut = 9*60 + 30; //debut à 9h30
const int fin = 18*60; //fin à 18h00
int duree = fin - debut;//les entiers c'est quand même plus simple à manipuler

if (debut <= maintenant && maintenant < fin)
{
  faireQuelquechose();
}

La bibliothèque RTClib, en plus de gérer la RTC DS3231, fournit tout ce qu’il faut pour faire des calculs sur les dates (class DateTime) et les intervalles de temps (classe TimeSpan)

#include <RTClib.h>
RTC_DS3231 rtc;
.../...
// Date et heure courante:
DateTime now = rtc.now();
// Zéro heure, aujourd'hui:
DateTime minuit ( now.year(), now.month(), now.day() );
// Durée écoulée depuis Zéro heure:
TimeSpan ce_jour = now - minuit;
// secondes écoulées depuis Zéro heure:`
long secondes = ce_jour.totalseconds();
etc...

Merci pour votre aide .
J’ai finalement trouver un compromis intéressant . Greuh Ah les opérations sur les dates, heures , c’est jamais simple , c’est plutôt déroutant voir compliqué
J’ai commencé par changer de librairie , j’ai utilisé la bibliothèque RTCLib.h (exit DS3231.h )
Comme cela la RTC renvoi des valeurs décimales plus facilement exploitables .
Encore merci pour votre aide

voila mon code de débutant :

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // Avec cette librairie on déclare le DS3231 comme un DS1307

int heure_debut = 21 ; // variable Heure de debut
int minute_debut = 32; // variable minute de debut
int heure_fin = 21 ; // variable Heure de fin
int minute_fin = 48; // variable minute de fin

void setup() {
Serial.begin(9600);
Wire.begin();
RTC.begin();
}

void loop() {

//Affichage de l’heure
DateTime now = RTC.now(); // Lit l’heure du module
int Valeur_heure_inst = now.hour();
int Valeur_minute_inst = now.minute();
int Valeur_second_inst = now.second();
int Valeur_inst_HMS= Valeur_second_inst+(Valeur_minute_inst60)+(Valeur_heure_inst3600);
int Valeur_debut_HMS=(minute_debut60)+(heure_debut3600);
int Valeur_fin_HMS=minute_fin60+heure_fin3600;

if (Valeur_debut_HMS - Valeur_inst_HMS <=0 && Valeur_inst_HMS - Valeur_fin_HMS <=0)
{Serial.println("Hello World ");}
else
{Serial.println("Byebye World ");}

delay(4500);
}

Tu sais qu'il y a des messages épinglés en tête de forum ?
Il faudrait les lire.

La présentation de ton code est est illisible, si tu veux qu'il soit lu regarde dans les messages épinglés comment le mettre en balise code.
Indente aussi ton code dans l'IDE --> toujours pour la même raison : personne n'est obligé de lire et si la présentation est brouillonne eh bien c'est simple on passe au sujet suivant.

arnaudkite29:

RTC_DS1307 RTC; // Avec cette librairie on déclare le DS3231 comme un DS1307

Tu cherches des ennuis, toi ! Commence par déclarer un RTC_DS3231, non ?

  if (Valeur_debut_HMS - Valeur_inst_HMS <=0 && Valeur_inst_HMS - Valeur_fin_HMS  <=0)

{Serial.println("Hello World ");}
else
    {Serial.println("Byebye World ");}

delay(4500);

Ce code va faire un print toutes les 4.5 s.
Si tu veux démarrer ou arrêter une action, une seule fois quand tu rentres ou quand tu sors de l’intervalle de temps, il te faut une variable qui mémorise l’état (ACTIVE ou DESACTIVE):

si on est dans l'intervalle horaire:
  si état == DESACTIVE:
    état = ACTIVE
    Activer()
  fin si
sinon (on est hors intervalle )
  si état == ACTIVE:
    état = DESACTIVE
    Desactiver()
  fin si
fin si