Bonjour,
J'ai deux arduino qui communique par can bus, si j'envoie un id avec l'émetteur , le récépteur lis cette id et fais quelque chose :
Si 0x01: allume led1
eteint led 2
Si 0x02: allume led 2
éteint led 1
si 0x03: allume led 1 et 3
éteint led 2 et 4
si 0x04: allume led 4
éteint led 3
déclanche tempo
si tempo arrive à 10 seconde => eteint led 1
allume led 2
Si on reçoit l'id 0x05 avant la fin de la tempo celle ci s'annule et donc => allume led 3
éteint led 4
Mon problème est que je n'arrive pas à utiliser la fonction millis(); pour mon id 0x04
je vous met le code que j'ai commencé à faire
#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>
#include <SPI.h>
#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>
#include <SPI.h>
#include "mcp_can.h"
unsigned long time_debut = millis();
unsigned long time_fin = millis();
unsigned long time_attente = time_fin - time_debut;
const int SPI_CS_PIN = 10;
const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 5;
int canId;//
MCP_CAN CAN(SPI_CS_PIN);
void setup()
{
Serial.begin(115200);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
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()
{ time_debut = millis();
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();
if (canId == 0x01)
{
digitalWrite(LED1, HIGH); //allume la led 1
digitalWrite(LED2, LOW);//eteint la led 2
}
if (canId == 0x02)
{
digitalWrite(LED2, HIGH);
digitalWrite(LED1, LOW);
}
if (canId == 0x03)
{
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED4, LOW);
}
if (canId == 0x04)
{
//....
}
bien que le cahier des charges soit beaucoup plus clair avec tes nouvelles explications,
tu ne précises pas ce que tu fais des leds 1 et 2 si tu ne vas pas au bout de la tempo.
j'ai considéré que si tu reçois 0x05, tu traites les leds 3 et 4 puis tu sors de la tempo et tu ne t'occupes pas des leds 1 et 2.
nota: j'ai rajouté 2 accolades en fin du prg pour verifier la compilation. à toi de les enlever
/*
l'adressage du multiplexeur se fait sur 10, 11, 12 arduino uno
lesquels correspondent à PB2, PB3, PB4 du µ 328
enable du multiplexeur est sur PB0
INT0 est sur PD2
la fréquence est juste
le débit ????
pour 2560 prendre PB4,PB5,PB6
soit 10,11,12 platine arduino
vers respectivement
A, B, C du multiplexeur
*/
unsigned long currentMilis;
unsigned long lastMilis = 0;
unsigned long temps = 2000 ;// durée de la mesure en ms
int adresse=0;
float F;
float Debit;
volatile unsigned long numPulses;
void setup()
{
lastMilis = millis();
Serial.begin(115200);
pinMode(2, INPUT); // meme entrée pour UNO et MEGA2560
//DDRB = 0b01111101; //1 sortie, 0 entreepour UNO
DDRB = 0b11111101; //1 sortie, 0 entree pour 2560
currentMilis = millis();
}
void loop()
{
currentMilis = millis();
if ((currentMilis - lastMilis) > temps)
{
detachInterrupt(0);
calcul();
//int mask_adresse = adresse << 2;//pour UNO
int mask_adresse = adresse << 4;//pour 2560
int mask_enable=1;// pour UNO
//pour UNO
//PORTB = (((PORTB & 0b00000010) | mask_adresse)|mask_enable); Serial.print(" valeur du port B en binaire = "); Serial.println(PORTB, BIN);
//pour 2560
PORTB = (((PORTB & 0b10001111) | mask_adresse)); Serial.print(" valeur du port B en binaire = "); Serial.println(PORTB, BIN);
//calcul();
numPulses = 0;
attachInterrupt(0, isr, FALLING);
lastMilis = millis();
affichage();
adresse++;if (adresse > 7){adresse = 0;}
}
else
{
//faire autre chose en attendant que "temps" soit terminé
//Serial.println("je fais autre chose");
}
}
void calcul()
{
F = (numPulses/((currentMilis - lastMilis)/1000));
//F = (numPulses/(temps/1000));
//F = ((1000000.0 * (float)(numPulses - 2)) / (float)(temps) / 2);
Debit = ((F) / 0.45) * 60;//débit pour 1 minute
}
void affichage()
{
Serial.print("Frequence "); Serial.print(adresse); Serial.print(" = ");Serial.println(F);
//if (numPulses == 0) {Serial.print("0");} else {Serial.print(F);} Serial.println();
Serial.print("Debimetre "); Serial.print(adresse); Serial.print(" = "); Serial.println(Debit);
Serial.println("");
}
void isr()
{
numPulses++;
}
Si je ne vais pas au bout de la tempo les leds 1 et 2 reste dans leurs états ,
Vous êtes sur d'avoir mis le bon programme ? il a l'air bien compliqué ...
Il fonctionne très bien j'ai presque mon programme final , comment faire pour ajouter un arret d'urgence ? je voudrais mettre une led en plus et retenir son etat dans un booléean :
quand etatLed = 1 on est en arret d'urgence
quand etatLed = 0 on est pas en arret d'urgence
mais je ne vois pas comment faire ..
idem dfdh, nous t'avons beaucoup aider par des remarques et des morceaux de code. Tout est dans les 2 posts que tu a initié. La suite dépend de ta capacité à t’investir dans le projet et dans l'analyse du code. Ce n'est pas beaucoup plus compliqué que ce que tu as déjà fait.