Programmation Arduino - Problème de code...

Bonjour,

Je me suis lancé récemment dans des projet arduino. Pour mon premier projet je souhaite réaliser un panneau lumineux pour m'aider a me souvenir de sortir les poubelles :

Le Jeudi les led de la poubelles verte s'allume
Le lundi et vendredi les led de la poubelle noir s'allume. (pendant les 24h)

Dès que j'appuie sur un bouton poussoir je souhaite que les led s'éteigne car la poubelle est déja sortie, et ce jusqu'au jour suivant ou elle doit être allumé.

J'ai codé ceci, mais je pense qu'il y a un bug...
Des conseils?

#include <Wire.h>
#include "RTClib.h"
 
RTC_DS1307 RTC;
 int LedPoubelleNoir =4;
 int LedPoubelleVerte=5;
 int bouton =3;
 long tempsRestantJourSuivant;
 
void setup () {
  Serial.begin(57600); //Démarrage de la communication
  Wire.begin(); //Démarrage de la librairie wire.h
  RTC.begin(); //Démarrage de la librairie RTClib.h
  
  //Si RTC ne fonctionne pas
  if (! RTC.isrunning()) {
    Serial.println("RTC ne fonctionne pas !");
    
    //Met à l'heure à date à laquelle le sketch est compilé
    RTC.adjust(DateTime(__DATE__, __TIME__)); 
    }
  pinMode(LedPoubelleNoir, OUTPUT);
  pinMode(LedPoubelleVerte, OUTPUT);
  pinMode(bouton, INPUT_PULLUP);
  digitalWrite(LedPoubelleNoir,0);
  digitalWrite(LedPoubelleVerte,0);
  }
 
void loop() {
  
  digitalWrite(LedPoubelleNoir,0);
  digitalWrite(LedPoubelleVerte,0);
  DateTime now = RTC.now();
  //Alarme se déclenchant le jeudi
  if(now.dayOfTheWeek() == 4) {   
    //Day of week : 1 pour lundi, 2 pour mardi, ...
    digitalWrite (LedPoubelleVerte,1);
   
    boolean etatBouton;
    
    etatBouton = digitalRead(bouton);
    //test de l'état du bouton avec boolean etatBouton
    if (etatBouton==0){
      digitalWrite(LedPoubelleVerte,0);
      tempsRestantJourSuivant=(86400L-now.unixtime());
      delay(tempsRestantJourSuivant);
    }
    
  } 
  //alarme Pouvelle Noir Lundi ou Vendredi
    if(now.dayOfTheWeek() == 1||5) {   
    //Day of week : 1 pour lundi, 2 pour mardi, ...
    digitalWrite (LedPoubelleNoir,1);
    boolean etatBouton;
    
    etatBouton = digitalRead(bouton);
    //test de l'état du bouton avec boolean etatBouton
    if (etatBouton==0){
      digitalWrite(LedPoubelleNoir,0);
      tempsRestantJourSuivant=(86400L-now.unixtime());
      delay(tempsRestantJourSuivant);
    }

    
  }   
  else {
  digitalWrite(LedPoubelleNoir,0);
  digitalWrite(LedPoubelleVerte,0);
    
  }
 
  delay(1000);
}

bonjour,

J'ai codé ceci, mais je pense qu'il y a un bug...

quel bug?
ca serait bien de dire ce qui ne va pas ou ne fonctionne pas.

Effectivement, il y a des bugs.

  • Déjà, la logique du programme codé ne respecte pas ce que tu décris.Il faut commencer par écrire en français le comportement attendu du programme. Ensuite on code.

  • Il ne faut pas oublier que loop() comme son nom l'indique est une boucle qui s'exécute en permanence.

  • Il ne faut pas hésiter à se reporter à la doc du langage. Cette écriture, par exemple, n'est pas valide:
    if(now.dayOfTheWeek() == 1||5) {
    il faut écrire:
    if(now.dayOfTheWeek() == 1 || now.dayOfTheWeek() == 5) {

  • delay() compte le temps en millisecondes.Le temps que tu as programmé est complètement faux.
    Tu as manifestement cru que l'unité de delay() était la seconde.
    Tu devrais chercher à quoi correspond unixtime() et tu comprendrais que l'opération que tu as effectuées ne va pas fonctionner comme tu le veux.
    delay() est une fonction bloquante. Le programme s'arrête jusqu'à la fin du délai programmé. Ce n'est pas une bonne habitude de bloquer le programme pendant de longues périodes.