Utiliser millis();

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)
    {
      //....
    }

bonjour,
projet bac?

pourquoi mettre en double des include?

ne sert a rien non plus, juste =0 suffit

unsigned long time_debut = millis();
unsigned long time_fin = millis();
unsigned long time_attente = time_fin - time_debut;

sers toi du code blink ICI

hello, c'est bien d'avoir refait ton code.

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

A mon avis notre ami dfgh s'est un peu 'mélangé les pinceaux' entre deux posts dans le code transmis.

:slight_smile: oups, effectivement, je me suis planté.
voici ton code

#include <SPI.h>
#include <mcp_can.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>

unsigned long time_debut = 0;

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)
    {
      digitalWrite(LED4, HIGH);
      digitalWrite(LED3, LOW);
      time_debut = millis();
      int flag_annulation = 0;
      while(( millis() - time_debut)<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==0x05)
         {
         digitalWrite(LED3, HIGH);
         digitalWrite(LED4, LOW);
         time_debut=(millis()-10001);
         flag_annulation=1;
         }
      }   
    }
    if (flag_annulation == 0)
    {
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
    }
  }
 }//rajouté pour compilation
}//rajouté pour compilation

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

hello Alex

je m'étais engagé dans ton code sur tes posts précédents
c'est pourquoi, j'ai tenu à faire cette partie de prg.

mais tu es quand même en train de préparer un projet BTS.

pour ma part, j'en reste là.

tu dois au moins savoir faire une gestion de surveillance d'un arrêt d'urgence.

étudie bien et comprends le code actuel, car tu devras probablement le "soutenir" le jour de l'examen.

bonne suite

Salut Alex,

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.

Courage