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..