[RESOLU] executer une action pendant un delay

Bonjour , alors voilà j'ai un programme qui me permet de d'allumé des led grâce à des bp
mon problème est que je voudrais lorsque ma led7 est allumé elle en eteint ma led 4 10seconde après SAUF SI j'allume ma led 6 avant la fin du delay .
mais dans mon programme une fois que ma led 7 est allumé je n'ai plus aucun contrôle de mes led pendant le delay de 10sec
voila mon morceau de programme

case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
        {digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
        digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
        delay(10000);
        
        digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
        digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
        }
        else
        digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
        }
        break;
    }
        }
        }

bonjour,
le delay est une fonction bloquante.
voir l'exemple blink without delay dans l'ide

j'ai essayé ceci mais ça ne marche pas non plus...

case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {
          if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
          {
            digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
            digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
            unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;
            flag6=0;
            while time_attente < 10000)
            {
            if (digitalRead(LED6))
            {
             int flag6=1;
            } 
            time_attente = time_fin-time_debut;
            }
            if (flag6==0)
            {
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            }
         else
            digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
         }
        break;
    }
        }
        }
           unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;

ca donnera toujours zéro

A l'intérieur du while tu ne relis pas millis() et donc dans cette boucle le temps n'avance pas.

je n'arrive pas du tout à comprendre , ce que je dois faire c'est mettre une boucle while qui dis que tant que la tempo n'est pas fini je peux allumé ma led 6 mais je besoin (ne comprend pas la fonction millis que j'ai besoin (je pense)

           unsigned long time_debut=millis();
 
            flag6=0;
            while time_attente < 10000)
            {
         unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;

OUPS!!!
désolé, c'est moi qui ai donné cette solution. je devais être très fatigué

il faut réactualiser les conditions de la boucle while, dans la boucle while

while time_attente < 10000)
            {
            if (digitalRead(LED6))
            {
             int flag6=1;
            }
            time_fin = millis();
            time_attente = time_fin-time_debut;
            }
            if (flag6==0)
            {

Merci beaucoup DFGH!!!!
cela fonctionne , le seul soucis et que je ne peux pas annulé l'action d'eteindre la led 4 en allumant ma led 6 avant que les 10secondes soit écoulé..
pendant la tempo je n'ai aucun contrôle de mes led ..
J'ai deux question ,
1)que signifie le flag ?
2) Pourquoi lorsque ma led 7 est allumé je ne reçoit plus les infos de mes bp dans le moniteur série ?

si, si tu mets un digitalRead de bouton dans le while :wink:

mes bouton se trouve sur un autre arduino car mon projet consiste a faire communiqué deux arduino par can bus
1 arduino emetteur avec les bp et un arduino recepteur avec les led

la ligne pour lire le can bus, tu la met dans le while.

si tu ne donne pas toutes les données, on ne peut deviner.
vu ton code, cela aurait pu être via une télécommande aussi :wink:

je vous donne les codes pour que vous puissiez mieux comprendre
emetteur :

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

// demo: CAN-BUS Shield, send data
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int BP = 3; // bp1 en broche 3
const int BP2 = 4; //bp2 en broche 4
const int BP3 = 5; //bp3 en broche 5
const int BP4 = 6; // bp4 en broche 6
const int BP5 = 7; // bp5 en broche 7
const int BP6 = 8; //bp6 en broche 8
const int BP7 = 9; // bp7 en broche 9 
const int BP8 = 10; // bp8 en broche 10
const int BP9 = 11; // bp9 en broche 11

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
  Serial.begin(115200);
  pinMode(BP, INPUT); //bp en entrée
  pinMode(BP2, INPUT); //bp2 en entrée
  pinMode(BP3, INPUT); //bp3 en entrée
  pinMode(BP4, INPUT); //bp4 en entrée
  pinMode(BP5, INPUT); //bp5 en entrée
  pinMode(BP6, INPUT); //bp6 en entrée
  pinMode(BP7, INPUT); //bp7 en entrée
 

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
    goto START_INIT;
  }
}

unsigned char bp1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char bp2[8] = {0, 0, 0, 0, 0, 0, 0, 1};
unsigned char bp3[8] = {1, 1, 1, 1, 1, 1, 1, 0};
unsigned char bp4[8] = {0, 2, 2, 2, 2, 2, 2, 2};
unsigned char bp5[8] = {0, 0, 2, 2, 2, 2, 2, 2};
unsigned char bp6[8] = {0, 0, 0, 2, 2, 2, 2, 2};
unsigned char bp7[8] = {0, 3, 3, 3, 3, 3, 3, 3};





void loop() {
  static int testPrecedent1 = LOW;
  static int testPrecedent2 = LOW;
  static int testPrecedent3 = LOW;
  static int testPrecedent4 = LOW;
  static int testPrecedent5 = LOW;
  static int testPrecedent6 = LOW;
  static int testPrecedent7 = LOW;
  static int testPrecedent8 = LOW;
  static int testPrecedent9 = LOW;

  int test1 = digitalRead(BP);//test est égal à l'etat du bp1
  if (test1 == HIGH && testPrecedent1 == LOW)
    CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message
  testPrecedent1 = test1;

  int test2 = digitalRead(BP2);//test est égal à l'etat du bp2
  if (test2 == HIGH && testPrecedent2 == LOW)
    CAN.sendMsgBuf(0x01, 0, 8, bp2);// envoyé données:  id = 0x01, tram standars car 0, longueur de la tram = 8, bp2: contenu du message
  testPrecedent2 = test2;

  int test3 = digitalRead(BP3);//test est égal à l'etat du bp3
  if (test3 == HIGH && testPrecedent3 == LOW)
    CAN.sendMsgBuf(0x02, 0, 8, bp3);// envoyé données:  id = 0x02, tram standars car 0, longueur de la tram = 8, bp3: contenu du message
  testPrecedent3 = test3;

  int test4 = digitalRead(BP4);//test est égal à l'etat du bp4
  if (test4 == HIGH && testPrecedent4 == LOW)
    CAN.sendMsgBuf(0x03, 0, 8, bp4);// envoyé données:  id = 0x03, tram standars car 0, longueur de la tram = 8, bp4: contenu du message
  testPrecedent4 = test4;

  int test5 = digitalRead(BP5);//test est égal à l'etat du bp5
  if (test5 == HIGH && testPrecedent5 == LOW)
    CAN.sendMsgBuf(0x04, 0, 8, bp5);// envoyé données:  id = 0x04, tram standars car 0, longueur de la tram = 8, bp5: contenu du message
  testPrecedent5 = test5;

  int test6 = digitalRead(BP6);//test est égal à l'etat du bp6
  if (test6 == HIGH && testPrecedent6 == LOW)
    CAN.sendMsgBuf(0x05, 0, 8, bp6);// envoyé données:  id = 0x05, tram standars car 0, longueur de la tram = 8, bp6: contenu du message
  testPrecedent6 = test6;

  int test7 = digitalRead(BP7);//test est égal à l'etat du bp7
  if (test7 == HIGH && testPrecedent7 == LOW)
    CAN.sendMsgBuf(0x06, 0, 8, bp7);// envoyé données:  id = 0x06, tram standars car 0, longueur de la tram = 8, bp7: contenu du message
  testPrecedent7 = test7;

 

  delay(20);
}
[/co

recepteur :

#include <mcp_can.h>
#include <mcp_can_dfs.h>

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>




// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


#include <SPI.h>
#include "mcp_can.h"


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED1 = 2;//led1 en broche 2 (start machine)
const int LED2 = 3;//led2 en broche 3 (stop machine)
const int LED3 = 4;//led3 en broche 4 (arret d'urgence)
const int LED4 = 5;//led4 en broche 5 (start compresseur)
const int LED5 = 6;//led5 en broche 6 (stop compresseur)
const int LED6 = 7;//led6 en broche 7 (start feuille)
const int LED7 = 8;//led7 en broche 8 (stop feuille)
int canId;//
int flag6;
boolean ledON = 1;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
  Serial.begin(115200);
  pinMode(LED1, OUTPUT); //led1 en sortie
  pinMode(LED2, OUTPUT); //led2 en sortie
  pinMode(LED3, OUTPUT); //led3 en sortie
  pinMode(LED4, OUTPUT); //led4 en sortie
  pinMode(LED5, OUTPUT); //led5 en sortie
  pinMode(LED6, OUTPUT); //led6 en sortie
  pinMode(LED7, OUTPUT); //led7 en sortie

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");//ecrire dans le moniteur série (can bus shield init ok)
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");//ecrire dans le moniteur série (can bus shield init fail)
    Serial.println("Init CAN BUS Shield again");//ecrire dans le moniteur série (init can bus shield again)
    delay(100);//(delay de 100ms)
    goto START_INIT;
  }
}


void loop()
{
  unsigned char len = 0;
  unsigned char buf[8];

  if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
  {
    CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

    unsigned char canId = CAN.getCanId();

    Serial.println("-----------------------------");
    Serial.println("get data from ID: ");
    Serial.println(canId);

    for (int i = 0; i < len; i++) // print the data
    {
      Serial.print(buf[i]);
      Serial.print("\t");
    }
    Serial.println();
   
    switch (canId)//Test les conditions pour les differents id reçu
    {
      case 0x00://Dans le cas ou on obtien l'id 0x00(start machine)
        if (digitalRead(LED3)==LOW)   // si on n'est pas en arrêt d'urgence
        {
          if (digitalRead(LED1) == LOW) //Si l'état de la led est à 0
            {digitalWrite(LED1, HIGH); //allume la led 1
            digitalWrite(LED2, LOW);//eteint la led 2
         }else
            digitalWrite(LED1, LOW); //eteint la led 1
        }
        break;

      case 0x01://Dans le cas ou l'on obtient l'id 0x01(stop machine)
        if (digitalRead(LED3) == LOW) //si la led 3 est eteinte
          {
            if (digitalRead(LED2)== LOW) //si la led 2 est eteinte
         { digitalWrite(LED2,HIGH);//allume la led 2
          digitalWrite(LED1,LOW);//eteint la led 1
          } else
          digitalWrite(LED2, LOW); //eteint led2 LOW
    }
   
        break;
      case 0x02://Dans le cas ou l'on obtient l'id 0x02  ! ARRET D'URGENCE !
        if (digitalRead(LED3) == LOW) //si l'état de la led est a 0
          {digitalWrite(LED3, HIGH); //alors led3 HIGH
          digitalWrite(LED1,LOW);//eteint led 1
          digitalWrite(LED2,LOW);//eteint led 2
          digitalWrite(LED4,LOW);//eteint led 4
          digitalWrite(LED5,LOW);//eteint led 5
          digitalWrite(LED6,LOW);//eteint led 6
          digitalWrite(LED7,LOW);//eteint led 7
          }
          else
          digitalWrite(LED3, LOW); //sinon led3 LOW
        break;

        case 0x03://Dans le cas ou on obtien l'id 0x03 (marche compresseur)
        if (digitalRead(LED3) == LOW)//si la led 3 est eteinte (si on est pas en arret d'urgence)
        {if (digitalRead(LED4)==LOW)//si la led 4 est eteinte
        {digitalWrite(LED4, HIGH);//allume led 4
        digitalWrite(LED5,LOW);//eteint led 5
        }
        else
        digitalWrite(LED4,LOW);//eteint led 4
        }
        break;

        case 0x04://Dans le cas ou on obtient l'id 0x04(stop compresseur)
        if(digitalRead(LED3) == LOW)//si la led 3 est eteinte (si on est pas en arret d'urgence)
        {if (digitalRead(LED5) == LOW)//si la led 5 est eteinte
        {digitalWrite(LED5,HIGH);//allume led 5
        digitalWrite(LED4,LOW);//eteint led 4
        }
        else
        digitalWrite(LED5,LOW);//eteint led 5
        }
        break;

        case 0x05://Dans le cas ou on obtient l'id 0x05(start feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {if(digitalRead(LED6) == LOW) //si la led 6 est eteinte
        {digitalWrite(LED6,HIGH); //allume led 6 (start feuille allumé)
        digitalWrite(LED4,HIGH); //allume led 4 (start compresseur allumé)
        digitalWrite(LED5,LOW); //eteint led 5  (stop compresseur eteint)
        digitalWrite(LED7,LOW); //eteint led 7 ( stop feuille eteint)
        }
        else
        digitalWrite(LED6,LOW); //eteint led 6 (start feuille eteint)
       
        }
        break;
        
 case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {
          if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
          {
            digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
            digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
            unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;
            flag6=0;
            while (time_attente < 10000)
            {
            if (digitalRead(LED6))
            {
             int flag6=1;
            } 
            time_fin = millis();
            time_attente = time_fin-time_debut;
            }
            if (flag6==0)
            {
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            }
         else
            digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
         }
        break;
    }
       
        }
        }
}

Maintenant que vous avec les code quelqu'un pourrait repondre à mes questions ?

  1. Que signifie flag dans mon programme ?
flag6=0;

2)2) Pourquoi lorsque ma led 7 est allumé je ne reçoit les infos de mes bp dans le moniteur série qu'une fois que la led est eteinte ?

flag est un "drapeau" comprendre un témoin de passage.

il est armé ou pas. par exemple, il permet de mémoriser le résultat d'une action

si telle condition et ok alors flag =1 sinon flag =0.

un test

case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {
          if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
          {
            digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
            digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
            unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;
            flag6=0;
            while (time_attente < 10000)
            {
            if (digitalRead(LED6))
            {
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            }
            time_fin = millis();
            time_attente = time_fin-time_debut;
            }
            
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            
         else
            digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
         }
        break;
        }
      
        }
        }
}

J'ai essayé le test j'ai juste du modifié car il fallait mettre un "}" avant le else
mais ça ne fonctionne pas , ma led 7 s'allume , elle eteint la 6 et 10 seconde après allume la 5 et eteint la 4 mais pendant les 10secondes je ne peux toujours pas annulé , pendant la tempo si j'appuie sur mes bp mon moniteur serie n'affiche les messages qu'une fois que la tempo est terminé

case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {
          if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
          {
            digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
            digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
            unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;
            flag6=0;
            while (time_attente < 10000)
            {
            if (digitalRead(LED6))
            {
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            }
            time_fin = millis();
            time_attente = time_fin-time_debut;
            }
           
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
          }
         else
            digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
         }
        break;
        }
     
        }
        }

je dois bien mettre le flag6 dans un int au debut de mon programme ?

oublies le flag, on ne l'utilise plus

reprenons ton prg
ta loop, attends de recevoir qqchose.

dès que c'est fait, tu regardes si c'est 0,1,2,3,4,5,6 et tu exécutes le "case" correspondant.

dans le case0x06:
tu veux pouvoir sortir de la tempo si tu presses sur un BP de ta machine (ou de la 2ème platine arduino), mais cette info passe par le bus CAN et tu le lis comment pendant la tempo ?
testes ce code après avoir modifier l'autre prg pour qu'il t'envoie un 0x08 si tu appuies sur le BP led6

case 0x06://dans le cas ou on obtient l'id 0x06 (stop feuille)
        if(digitalRead(LED3) == LOW) //si on est pas en arret d'urgence
        {
          if(digitalRead(LED7) == LOW) //si la led 7 est eteinte
          {
            digitalWrite(LED7,HIGH); //allume led 7 (stop feuille allumé)
            digitalWrite(LED6,LOW); //eteint led 6 (marche feuille eteint)
            unsigned long time_debut=millis();
            unsigned long time_fin=millis();
            unsigned long time_attente = time_fin-time_debut;
            canId=0x255;
            while (time_attente < 10000)
            {
            if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
                CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
                canId = CAN.getCanId();
             if (canId==0x08)
            {
            digitalWrite(LED6,HIGH);  
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
            }
            }
            time_fin = millis();
            time_attente = time_fin-time_debut;
            }
           
            digitalWrite(LED5,HIGH); //allume led 5 (stop compresseur allumé)
            digitalWrite(LED4,LOW); //eteint led 4 (marche compresseur eteint)
          }
         else
            digitalWrite(LED7,LOW);//eteint led 7 (stop feuille eteint)
         }
        break;
        }
     
        }
        }
}

Si j'ai bien compris cela voudrait dire que mon bp qui gere la led 6 enverrai 2 id? l'id 0x05 et l'id 0x08 ?
donc rajouté un id dans cette ligne de code :

int test6 = digitalRead(BP6);//test est égal à l'etat du bp6
  if (test6 == HIGH && testPrecedent6 == LOW)
    CAN.sendMsgBuf(0x05, 0, 8, bp6);// envoyé données:  id = 0x05, tram standars car 0, longueur de la tram = 8, bp6: contenu du message
    testPrecedent6 = test6;