problème RTC 3231 arduino nano

Bonjour à tous
j’ai dans l’idée de commander, via un arduino nano, l’éclairage de mon aquarium.
En cherchant un peu partout, j’ai réussi à concocter un code qui fonctionne, mais en apparence seulement !

Vous pourrez voir que je demande la commutation d’un relais à 7H00 et l’extinction à 21H30 tous les jours de la semaine.

Hors, chose incompréhensible, à chaque heure, le relais décroche pendant 4 minutes !
(exemple: de 8H00 à 8H04, de 9H à 9H04, etc.)

Auriez vous une petite idée du souci ?
Merci d’avance

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

RTC_DS3231 RTC;                 
const int RELAIS = 2;          
float temp;
boolean etatRelais = 0;

void setup() {
 pinMode(RELAIS, OUTPUT);       
 digitalWrite(RELAIS,0);        
 Wire.begin();
 RTC.begin();


//                                                # IMPORTANT #                                                    
// Décommenter la ligne ci-dessous pour mettre le module RTC à l'heure, téléverser, 
// recommenter et téléverser #
//                                                                                                                
// RTC.adjust(DateTime(__DATE__, __TIME__)); // Mise à jour du module RTC avec la date et l'heure
// du pc connecté    

}

void loop(){
heure();                        
}

void heure()
{
 DateTime now = RTC.now();  
    
 if (now.dayOfTheWeek() >=0 && now.hour() >=07 && now.minute() >=00 and now.dayOfTheWeek() >=0 && now.hour() <=21 && now.minute() <=30)
 {
 etatRelais=1;      
 digitalWrite(RELAIS,etatRelais);
 }
 else                         
 {
 etatRelais=0;                   
 digitalWrite(RELAIS,etatRelais);// envoi commande relais
 }  
}

Bonjour,

Le mot clé "and" n'existe pas en C/C++, sauf si tu l'as défini.

Bonjour,

Ta comparaison est incorrecte, car minutes doit être <=30 quelle que soit l’heure (mais ça n’explique pas l’arrêt de 4mn).
Le plus simple est de convertir en mn

void heure()
{
  DateTime now = RTC.now();

  int nbMinutes=now.hour()*60+now.minute();
  if (nbMinutes>=7*60 && nbMinutes <= 21*60+30)
  {
    etatRelais = 1;
    digitalWrite(RELAIS, etatRelais);
  }
  else
  {
    etatRelais = 0;
    digitalWrite(RELAIS, etatRelais); // envoi commande relais
  }
}

@bilbo83: and est défini dans l’ide arduino dans un des fichiers.h (tout comme boolean).
A mon avis ce n’est vraiment pas une bonne idée car si on se met à redéfinir les mots clefs du langage, plus personne ne va rien y comprendre.

Si si le mot clé and existe en c++, c'est la même chose que &&

now.dayOfTheWeek() >=0 est répété 2 fois dans le if, ce n'est pas nécessaire

Comme le dit kamill le test tel qu'il est écrit devrait éteindre le relai toutes les 30 minutes car dès que vous atteignez 7h31 par exemple les minutes ne sont plus sous 30 et donc l'expression du if est évaluée faux et vous allez dans le else et éteignez la lumière.

Êtes vous sûr que ce n'est que pour 4 minutes?

Attention aux notations des constantes. Le C++ autorise la représentation en decimal, octal ou hexadécimal par exemple et si vous avez une constante qui commence par un zéro vous dites en fait au préprocesseur que c'est une constante représentée en octal ( base 8 ). 07 que vous utilisez passe encore parce que c'est 7 mais 09 ce serait un problème et 010 par exemple serait ok mais ne vaut pas 10 en décimal.

Merci beaucoup pour vos réponses rapides

Je vais tester la solution de kamill, et il est vrai que J-M-L me met la puce à l'oreille, je me souviens avoir vu des erreurs lors de la compilation du style : erreur nombre décimal

Toutefois, je ne vois pas dans le code de kamill le moyen de commuter le relais de 07H00 à 21H30, je m’égare et comprends de moins en moins, si vous pouvez m’éclairer, je vous en remercie d’avance.

au lieu de comparer l'heure et les minutes (ce qui peut être est source d'erreur), il est beaucoup plus simple de convertir l'heure/minute en minutes et tu compares les minutes

Merci à vous tous, le code de kamill fonctionne à merveille, je vais pouvoir terminer mon montage en hard et le mettre en œuvre ;)

Si ça peut aider quelqu'un je peux mettre le code complet et montage à disposition, n'hésitez pas. Encore merci kamill ;)

bonjour, je sais que ce post est ancien, mais est-ce encore possible d'avoir le code merci jean

Euh reytronic n’est plus revenu depuis octobre 2016…

C’est tout bête Pour convertir un Temps en secondes on fait (3600ULheures + 60ULminutes + secondes) le UL c’est pour lui dire qu’on veut un calcul en Unsigned Long
Ensuite c’est simple de comparer temps1 avec temps2 c’est juste avec < ou > ou ==