Problème millis et delay

Bonjour a tous !

Voila je suis assez inexpérimenté en prog et je suis bloqué sur un code pour un projet de lampe bébé commandé par télécommande.

Entre autre il s’agit tous simplement d’une télécommande 433mhz qui envoie des codes permettant de contrôler des relais ou envoyer des commande à un MP3

Ci-dessous le code que j’ai déjà testé est qui marche bien sauf 1 mode (eh oui il y à toujours un mais :()

En fait quant on envoie le code pour le mode 2 les relais bouges et le MP3 se met en marche et au bout de 20 min le tout s’éteint mais à cause de delay qui d’après ce que j’ai compris est une fonction bloquante je ne peux plus commander les autres fonctions du MP3 (<<,>>,++,–) durant ces 20 min.

J’ai fait pas mal d’essai en passant par millis mais pas moyen de trouver la bonne façon de faire.

Pouvez-vous m’aider ? :slight_smile:

//Initialisation recepteur télécommande;
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


//Initialisation MP3 ;
const byte COMMAND_BYTE_START = 0x7E;
const byte COMMAND_BYTE_VERSION = 0xFF;
const byte COMMAND_BYTE_STOP = 0xEF;
const byte DEVICE_SDCARD = 0x02;

//Commandes du MP3 ;
void resetPlayer() {
  send_kt_command(0x0C, 0, 0, 100);}
void playResumeMusic() {
  send_kt_command(0x0D, 0, 0, 20);}
void stopMusic() {
  send_kt_command(0x16, 0, 0, 20);}
void playNextSong() {
  send_kt_command(0x01, 0, 0, 10);}
void playPreviousSong() {
  send_kt_command(0x02, 0, 0, 10);}
void volumeUp() {
  send_kt_command(0x04, 0, 0, 10);}
void volumeDown() {
  send_kt_command(0x05, 0, 0, 10);}
void shufflePlay() {
  send_kt_command(0x18, 0, 0, 20);}
void loopAllMusic(byte enabled) {
  send_kt_command(0x11, 0, !!enabled, 10);}
void setVolume(byte volume) {
    if (volume > 30) volume = 30;
  send_kt_command(0x06, 0, volume, 10);}
void selectSourceDevice(byte device) {
  send_kt_command(0x09, 0, device, 200);}


//Comande controle led 13 ;
void ledcontrol() {
  digitalWrite (13, HIGH);
        delay (50);
        digitalWrite (13, LOW);
        delay (50);
        digitalWrite (13, HIGH);
        delay (50);
        digitalWrite (13, LOW); }

// Fonction de bas niveau pour envoyer une commande au module KT403A ;
void send_kt_command(byte command, byte data_h, byte data_l, unsigned long cmd_delay) {
  Serial.write(COMMAND_BYTE_START);
  Serial.write(COMMAND_BYTE_VERSION);
  Serial.write((byte) 0x06);
  Serial.write(command);
  Serial.write((byte) 0x00);
  Serial.write(data_h);
  Serial.write(data_l);
  Serial.write(COMMAND_BYTE_STOP);
  // 16-bits checksum is optionnal
  delay(cmd_delay); }


void setup() {

Serial.begin(9600);

  resetPlayer();
  selectSourceDevice(DEVICE_SDCARD);
  setVolume(15);

  mySwitch.enableReceive(0);
  
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);

  pinMode (13, OUTPUT);

  digitalWrite (8, LOW);
  digitalWrite (9, HIGH);
  digitalWrite (10, HIGH);
  digitalWrite (11, HIGH);
  
}

void loop() {

switch(mySwitch.getReceivedValue ()){

// Mode 1 lumieres nuit ;
  case 5510485 :
        Serial.println("Lumieres nuit");
        ledcontrol();
        delay (100);
        digitalWrite (8, HIGH);
        digitalWrite (9, LOW);
        digitalWrite (10, LOW);
        break ;

// Mode 2 sleep mode ;
  case 5510484 :
        Serial.println("Sleep mode");
        ledcontrol();
        digitalWrite (8, HIGH);
        digitalWrite (9, LOW);
        digitalWrite (10, LOW);
        shufflePlay();
        delay (1200000);
        digitalWrite (8, HIGH);
        digitalWrite (9, HIGH);
        digitalWrite (10, HIGH);
        stopMusic();
        break ;
        
// MP3 Music play ;
  case 5522773 :
        Serial.println("play");
        ledcontrol();
        delay (100);
        shufflePlay();
        break ;

// MP3 Music stop ;       
  case 5522772 :
        Serial.println("stop");
        ledcontrol();
        delay (100);
        stopMusic();
        break ;

// MP3 ++ ;
  case 5525844 :
        Serial.println("++");
        ledcontrol();
        delay (100);
        volumeUp();
        break ;

// MP3 -- ;
  case 5525845 :
        Serial.println("--");
        ledcontrol();
        delay (100);
        volumeDown();
        break ;

// MP3 >> ;
  case 5526612 : 
        Serial.println(">>");
        ledcontrol();
        delay (100);
        playNextSong();
        break ;

// MP3 << ;
  case 5526615 :
        Serial.println("<<");
        ledcontrol();
        delay (100);
        playPreviousSong();
        break ;
        
}
 mySwitch.resetAvailable();
  delay (100); 
}

Analysez l'exemple blink without delay ou en français lisez le tuto d'eskimon sur le temps et surtout la partie à la fin sur millis()

Il faudra ré-architecturer votre code, sortir le delay des case pour le mettre au niveau de la boucle principale avec millis() en testant si vous êtes dans un mode nécessitant une attente d'un certain délai et uniquement utiliser le switch pour traiter les commandes

Attention aux relais bas de gamme chinois non certifiés CE ni de bonne qualité surtout proche d'un bébé qui ne pourra pas s'enfuir en cas de soucis...

Re bonjour

Merci de t’a réponse J-M-L en effet j’ai modifié l’architecture du code et j’ai crée une variable pur déclencher le timer.

Entre autre cela donne si on à appuyé sur le timer et si les 20 min sont passé alors le MP3 et les lumières se coupe et on réinitialise la variable ,sinon on attend une info de la télécomande.

Ci dessous le code final pour ceux que sa intéresse. (c’est pas pro mais ça marche !! :smiley: :smiley: :smiley: )

//Initialisation recepteur télécommande;
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


//Initialisation MP3 ;
const byte COMMAND_BYTE_START = 0x7E;
const byte COMMAND_BYTE_VERSION = 0xFF;
const byte COMMAND_BYTE_STOP = 0xEF;
const byte DEVICE_SDCARD = 0x02;

//Commandes du MP3 ;
void resetPlayer() {
  send_kt_command(0x0C, 0, 0, 100);}
void playResumeMusic() {
  send_kt_command(0x0D, 0, 0, 20);}
void stopMusic() {
  send_kt_command(0x16, 0, 0, 20);}
void playNextSong() {
  send_kt_command(0x01, 0, 0, 10);}
void playPreviousSong() {
  send_kt_command(0x02, 0, 0, 10);}
void volumeUp() {
  send_kt_command(0x04, 0, 0, 10);}
void volumeDown() {
  send_kt_command(0x05, 0, 0, 10);}
void shufflePlay() {
  send_kt_command(0x18, 0, 0, 20);}
void loopAllMusic(byte enabled) {
  send_kt_command(0x11, 0, !!enabled, 10);}
void setVolume(byte volume) {
    if (volume > 30) volume = 30;
  send_kt_command(0x06, 0, volume, 10);}
void selectSourceDevice(byte device) {
  send_kt_command(0x09, 0, device, 200);}


//Comande controle led 13 ;
void ledcontrol() {
  digitalWrite (13, HIGH);
        delay (50);
        digitalWrite (13, LOW);
        delay (50);
        digitalWrite (13, HIGH);
        delay (50);
        digitalWrite (13, LOW); }

// Fonction de bas niveau pour envoyer une commande au module KT403A ;
void send_kt_command(byte command, byte data_h, byte data_l, unsigned long cmd_delay) {
  Serial.write(COMMAND_BYTE_START);
  Serial.write(COMMAND_BYTE_VERSION);
  Serial.write((byte) 0x06);
  Serial.write(command);
  Serial.write((byte) 0x00);
  Serial.write(data_h);
  Serial.write(data_l);
  Serial.write(COMMAND_BYTE_STOP);
  // 16-bits checksum is optionnal
  delay(cmd_delay); }

// Commandes de temps et compteur ;
unsigned long previousMillis = 0;
int Timer = 0;

void setup() {

Serial.begin(9600);

  resetPlayer();
  selectSourceDevice(DEVICE_SDCARD);
  setVolume(15);

  mySwitch.enableReceive(0);
  
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);

  pinMode (13, OUTPUT);

  digitalWrite (8, HIGH);
  digitalWrite (9, HIGH);
  digitalWrite (10, HIGH);
  digitalWrite (11, HIGH);
  
}

void loop() {

if (Timer >= 1){
  if (millis() - previousMillis >= 1200000){
        digitalWrite (8, LOW);
        digitalWrite (9, HIGH);
        digitalWrite (10, HIGH);
        stopMusic();
        Timer =0;
  }}

switch(mySwitch.getReceivedValue ()){

// Mode 1 lumieres nuit ;
  case 5510485 :
        Serial.println("Lumieres nuit");
        ledcontrol();
        delay (100);
        digitalWrite (8, LOW);
        digitalWrite (9, LOW);
        digitalWrite (10, LOW);
        break ;

// Mode 2 sleep mode ;
  case 5510484 :
        Serial.println("Sleep mode");
        ledcontrol();
        digitalWrite (8, LOW);
        digitalWrite (9, LOW);
        digitalWrite (10, LOW);
        loopAllMusic (true);
        Timer ++ ;
        previousMillis = millis();;
        break ;
        
// MP3 Music play ;
  case 5522773 :
        Serial.println("play");
        ledcontrol();
        delay (100);
        loopAllMusic (true);
        break ;

// MP3 Music stop ;       
  case 5522772 :
        Serial.println("stop");
        ledcontrol();
        delay (100);
        stopMusic();
        break ;

// MP3 ++ ;
  case 5525844 :
        Serial.println("++");
        ledcontrol();
        delay (100);
        volumeUp();
        break ;

// MP3 -- ;
  case 5525845 :
        Serial.println("--");
        ledcontrol();
        delay (100);
        volumeDown();
        break ;

// MP3 >> ;
  case 5526612 : 
        Serial.println(">>");
        ledcontrol();
        delay (100);
        playNextSong();
        break ;

// MP3 << ;
  case 5526615 :
        Serial.println("<<");
        ledcontrol();
        delay (100);
        playPreviousSong();
        break ;
        
}
 mySwitch.resetAvailable();
  delay (100); 
}

Tu as raison sur le point de la sécurité (surtout qu’il s’agit de ma futur filleule :blush: ) de ce coté j’ai bien fait attention à la qualité des switch mais de toute façon j’avais pour projet de couler toute la partie électronique dans du power gel pour protéger un maximum.

En tous cas merci beaucoup. :wink:

super !

oui un peu de nettoyage à faire (pressez sur ctrl-T dans l'IDE et vous verrez l'indentation sera mieux!), les pins pourraient être déclarées avec un petit nom sympa plutôt que d'avoir les nombre en dur dans le code, les grand nombres seraient mieux avec ul à la fin pour signifier unsigned long etc mais l'important c'est que ça fonctionne !