Projet communication can bus entre deux arduino

Bonjour à tous ,
alors voilà , je fais communiquer deux arduino par can bus donc:
1 arduino émetteur équipé de 7 bouton poussoir qui envoie chacun un message différent à l’arduino récepteur.
1 arduino récepteur équipé de 7 led qui s’allume ou s’éteigne en fonction des messsages reçus par l’arduino émetteur
Le bp 1 envoi l’id 0x00 qui allume la led 1 et eteint la 2
le bp 2 envoi l’id 0x01 qui allume la led 2 et eteint la 1
le bp 3 envoi l’id 0x02 qui fonctionne comme un arret d’urgence donc allume ma led 3 et eteint toutes les autres ( 1,2,4,5,6,7)
le bp 4 envoi l’id 0x03 qui allume la led 4 et eteint la 5
le bp 5 envoi l’id 0x04 qui allume la led 5 et eteint la 4
le bp 6 envoi l’id 0x05 qui allume les led 6 ,4 et eteint les led 5,7
et pour finir le bp7 qui envoi l’id 0x06 qui allume la led 7 et eteint la 6 ET au bout de 10secondes allume la 5 et eteint la 4 sauf si j’envoi l’id 0x05 avant la fin des 10sec se qui allumerai ma led 6 et 4 et eteignerai la 7et 5

Quelqu’un pourrait il me faire le code pour l’id 0x06 car il me pose problème , j’ai déja créer mon programme mais je n’arrive pas à annuler la tempo
en gros je voudrais ecrire : "tant que la tempo est inferieur à 10sec je peux allumé ma led 6 qui éteignera les 7 et 5 et allumera la 4
Je vous met mon programme récépteur car c’est celui ci qu’il faut modifié

#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;//
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;

Il ne me manque que le case 0x06 mais je n’y arrive pas…

alex59420:
en gros je voudrais ecrire : "tant que la tempo est inferieur à 10sec je peux allumé ma led 6 qui éteignera les 7 et 5 et allumera la 4

Il y a 2 façons de réaliser ta boucle soit avec IF soit avec un WHILE.

Perso j’utilise plus le if que le while qui est bloquant et ça donne un effet de multitâche (ce qui n’est pas vrai ^^).

Tu procèdes comme suit.

boolean capture=false;
unsigned long dix_secondes=0;

 if (!capture)// équivalant à if(capture==false)
 {
     dix_secondes=millis(); // on capture le temps courant
     capture= true;
 }
 if (millis()-dix_secondes<10000) // tant que le temps courant est inférieur à 10s
 {
 
 // Tu allumes tes leds ici et le reste de ton code
 }

À mettre dans void loop() bien sûr

Bonjour,

Ça fait le troisième post que tu ouvres sur ce sujet.
Tu ne pense pas que tu aurais pu continuer sur le premier au lieu de repartir à zéro chaque fois?