Allumer et éteindre des leds à heure précise avec Uno ou Mega2560

Bonjour à toutes et tous
J’ai un problème ! (Vous me direz, si je n’en avais pas, je ne serais pas sur ce forum :wink:
Je voudrai allumer 3 leds, de manière progressive, à une heure précise et les éteindre, toujours progressivement, à une autre heure, et cela tous les jours.
Je ne vois vraiment pas pourquoi mon programme ne fonctionne pas. Dans l’exemple, je télécharge le programme, par exemple à 17h00 et, immédiatement les 3 leds s’allument, sans progression, alors que le programme indique qu’elles doivent s’allumer à 18h00. Pour l’extinction, il ne semble pas y avoir de problème. J’ai essayé avec une Arduino Uno et une Méga2560. Pour l’heure, j’utilise un DS3231. Quand je télécharge l’heure, sur le port série, elle est normalement prise en compte et affichée.
Si l’un(e) de vous peut m’aider… Car là, je ne comprends plus rien.
Cependant, ça eut marché il y a quelques années !
Merci pour votre aide

#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 RTC;

int ledR=8;
int ledV=9;    
int ledB=10;   
 int i = 255 ;  //intensité lumineuse (de 0 à 255 pour le maxi)
 void setup() 
 {  
  Wire.begin(); 
  RTC.begin();

  delay(10);   
          
pinMode (ledR, OUTPUT);                
  pinMode (ledV, OUTPUT); 
    pinMode (ledB, OUTPUT);     
}
void loop() 
{  
  DateTime now = RTC.now(); 

//                                        1     ALLUMAGE      MATIN     
// -----------------------------------------------------------------------------------------------------------------
if (now.hour() >= 18 && now.minute() >= 0  && now.second() >= 0)    
  {
                             for (i = 0; i <= 255; i++)                                                                    
  {     
    analogWrite (ledR,i);
         analogWrite (ledV,i);
               analogWrite (ledB,i);
  delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
  }                                   
  while (i=255) //  i maximum 
  {
    analogWrite (ledR,i);
         analogWrite (ledV,i);
              analogWrite (ledB,i);    
    }  }

//                                        1     EXTINCTION      SOIR    
// -----------------------------------------------------------------------------------------------------------------
  if (now.hour() >= 19 && now.minute() >= 0 && now.second() >= 0)
 {
                            for (i = 255; i >= 0; i--)                                                                   
 {     
    analogWrite (ledR,i);
         analogWrite (ledV,i);
               analogWrite (ledB,i);
 delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
}                                   
 while (i=255) 
 {
    analogWrite (ledR,i);
         analogWrite (ledV,i);
              analogWrite (ledB,i);
  }  }  }

Cette rubrique est réservée aux "Réalisations et Projets Finis".
STP utilise le lien "Report to moderator" pour demander au modo de déplacer ton message dans le forum principal.

D'accord avec Henri. Demande au modérateur de déplacer ton message.

Une condition c'est ==
Mais fais attention au while qui peut devenir une boucle sans fin. Si i ne change pas, tu n'en sortiras pas...

Merci de vos conseils et réponses. J'ai fait hier immédiatement la demande au modérateur.
Pour la condition ==, si l'heure est plus grande ou plus petite, il ne se passera rien, car la condition veut dire "égal à ". C'est pour cela que j'ai utilisé >=, soit "plus grand ou égal à ".
J'ai supprimer while, mais rien n'y fait.

Je parlais de cette condition
while (i=255)

Dans ton test, tu peux ôter les conditions sur les minutes et les secondes, elles sont toujours positives.

Il faut faire des tests plus complets.

Si heure == 18 && minutes == 0 && secondes == 0 alors allumage progressif
Sinon si heure == 18 alors allumage à 255
Sinon si heure == 19 && minutes == 0 && secondes == 0 alors extinction progressive
Sinon extinction totale

Sujet déplacé...

En relisant ma réponse numéro 4, je dois ajouter qu'il faut utiliser une variable (booléenne a priori) pour garder en mémoire l'état d'allumage des leds et la tester. Si les leds sont déjà allumées, il est inutile de refaire l'allumage. De même pour l'extinction.

Essaye ca pour voir.

#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 RTC;

int ledR=9;
int ledV=10;   
int ledB=11;   
int i = 255 ;  //intensité lumineuse (de 0 à 255 pour le maxi)
int DemandeEtatLeds = 0;
int Etat = 0;

void setup()
  { 
    Wire.begin();
    RTC.begin();
    Serial.begin(9600);
    delay(10);           
    pinMode (ledR, OUTPUT);               
    pinMode (ledV, OUTPUT);
    pinMode (ledB, OUTPUT); 
    pinMode(3,INPUT_PULLUP);    
  }
void loop()
  { 
    DateTime now = RTC.now();
    boolean etatBouton=digitalRead(3);
    delay(1000);
    if (now.hour() == 18 && now.minute() >= 0 && now.second() >= 0){
      DemandeEtatLeds = 1;
      Serial.println ("DemandeAllumageLeds");   
    }
    if (now.hour() == 19 && now.minute() >= 0 && now.second() >= 0){
      DemandeEtatLeds = 0;
      Serial.println ("DemandeArretLeds"); 
    }
  //                                        1     ALLUMAGE      MATIN     
  // -----------------------------------------------------------------------------------------------------------------
  
    if (DemandeEtatLeds == 1 && Etat == 0)   
    {
      for (i = 0; i <= 255; i++){     
        analogWrite (ledR,i);
        analogWrite (ledV,i);
        analogWrite (ledB,i);
        Etat = 1 ;
        delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
      }
    }
    if(Etat == 1){
      analogWrite (ledR,255);
      analogWrite (ledV,255);
      analogWrite (ledB,255);
    }                        
    
  
  //                                        1     EXTINCTION      SOIR   
  // -----------------------------------------------------------------------------------------------------------------
    if (DemandeEtatLeds == 0 && Etat == 1)   
    {
      for (i = 255; i >= 0; i--){     
        analogWrite (ledR,i);
        analogWrite (ledV,i);
        analogWrite (ledB,i);
        Etat = 0 ;
        delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
      }                                  
    }
    if(Etat == 0){
      analogWrite (ledR,0);
      analogWrite (ledV,0);
      analogWrite (ledB,0);
    } 
  }

17h00 et, immédiatement les 3 leds s'allument, sans progression, alors que le programme indique qu'elles doivent s'allumer à 18h00

if (now.hour() >= 18 && now.minute() >= 0  && now.second() >= 0)
if (now.hour() >= 19 && now.minute() >= 0  && now.second() >= 0)

Il faut que tu cible 1 heure précise car la >= 18 va prendre en compte 18 heure, 19 heure, 20 heure etc...
Pour ca que je tes mit plutôt == 18

Bonjour,

Plutôt que de comparer des heures minutes secondes ce qui est source de complexité et d’erreurs, il vaut mieux manipuler des nombres de minutes ou encore mieux des heures sous forme HHMM obtenu par 100*heures+minutes.
Ensuite pour éviter d’almumer ou éteindre progressivement continuellement, il faut mémoriser l’état allumage/extinction.

Ca donne quelquechose comme ça:

const unsigned h100Allumage = 1800;
const unsigned h100Extinction = 1900;
void loop()
{
  static enum {ALLUME, ETEINT,INCONNU} etat = INCONNU;
  DateTime now = RTC.now();

  unsigned h100 = 100 * now.hour() + now.minute();

  //                                        1     ALLUMAGE      MATIN
  // -----------------------------------------------------------------------------------------------------------------
  if (h100 >= h100Allumage && h100 < h100Extinction)
  {
    if (etat!=ALLUME)
    {
      for (int i = 0; i <= 255; i++)
      {
        analogWrite (ledR, i);
        analogWrite (ledV, i);
        analogWrite (ledB, i);
        delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
      }
      etat=ALLUME;
    }
  }
  //                                        1     EXTINCTION      SOIR
  // -----------------------------------------------------------------------------------------------------------------
  else
  {
    if (etat!=ETEINT)
    {
      for (int i = 255; i >= 0; i--)
      {
        analogWrite (ledR, i);
        analogWrite (ledV, i);
        analogWrite (ledB, i);
        delay (155);  //  1150 cycles pour atteindre i = 255 ==> +/- = 5"    115 cycles pour +/- 1"
      }
      etat=ETEINT;
    }
  }
}