Objectifs
- Savoir utiliser une temporisation non bloquante
- Savoir l’importance d’une temporisation non bloquante
- Exemple de la gestion de deux défauts
- Etc.
Voir le tuto Arduino #42: Temporisation non bloquante pour plus de détails
Code Arduino
// Exemple: Surveillance des défauts
#define N 2 // Déclaration de 3 Timers
// Nombre des Timers 1-255 (Mémoire)
// Résolution (LSB) 4 µS
// Précision ~1-2 LSB
// Résolution binaire 32 bits
// Tempo Max: (2^32-1)*1µs ~71,5827882667 Minutes!
#define PinLED1 52 // MEGA
#define PinLED2 53
unsigned long TimerX[N][4];
bool TimerCtrl[N][3];
bool StateLED[2]={0,0};
long Imax=500;
bool Defaut1=false, Defaut2=false;
void setup()
{
// Définition des valeurs des tempos en µS
TimerX[0][0]=50000; // 0.1s
TimerX[1][0]=100000; // 5s
// Désactivions des Timers par défaut
for(int i=0; i<N; i++)
{
TimerCtrl[i][0]=false;
TimerX[i][3]=0;
}
// Sorties des LEDs
pinMode(PinLED1, OUTPUT);
pinMode(PinLED2, OUTPUT);
// Init port série
Serial.begin(19200);
}
void loop()
{
// Activation des Tempo
TimerCtrl[0][0]=true; quickDelay(TimerX,TimerCtrl, 0);
TimerCtrl[1][0]=true; quickDelay(TimerX,TimerCtrl, 1);
// Commande de la LED 1
if(TimerCtrl[0][2]==true)
{
// Commande de la LED
digitalWrite(PinLED1,StateLED[0]);
// Inversion de l'état de la LED
StateLED[0]=!StateLED[0];
}
// Commande de la LED 2
if(TimerCtrl[1][2]==true)
{
// Commande de la LED
digitalWrite(PinLED2,StateLED[1]);
// Inversion de l'état de la LED
StateLED[1]=!StateLED[1];
}
// Lecture des Défauts (A0, A1)
long I1=analogRead(A0);
long I2=analogRead(A1);
if(I1>Imax) Defaut1=true;
if(I2>Imax) Defaut2=true;
// Surveillance des défauts
Serial.print(I1); Serial.print( "\t");
Serial.print(I2); Serial.print( "\t");
Serial.print(1023*Defaut1); Serial.print( "\t");
Serial.println(1023*Defaut2);
}
void quickDelay(unsigned long TimerX[][4],bool TimerCtrl[][3], byte NumTimer)
{
unsigned long Time_us =TimerX[NumTimer][0];
unsigned long t_start =TimerX[NumTimer][1];
unsigned long t_stop =TimerX[NumTimer][2];
unsigned long t_val =TimerX[NumTimer][3];
bool TimerEN =TimerCtrl[NumTimer][0];
bool TimerIsStart =TimerCtrl[NumTimer][1];
bool TimerState =TimerCtrl[NumTimer][2];
// Déclanchement du Timer
if((TimerEN==true) && (t_val==0))
{
// Lancement du Timer
t_start = micros();
TimerIsStart=true;
// Init de l'état du Timer
TimerState=false;
}
// Mise à jour de la valeur du Timer
t_stop=micros();
t_val=t_stop-t_start;
// Génération du Timer
if((TimerIsStart==true) && (t_val > Time_us))
{
TimerState = true;
t_val=0;
}
// Arrêt du Timer
if(TimerEN==false)
{
t_start=0;
t_stop=0;
TimerIsStart=false;
TimerState=false;
t_val=0;
}
// Mise à jour des valeurs du Timer
TimerX[NumTimer][0]=Time_us;
TimerX[NumTimer][1]=t_start;
TimerX[NumTimer][2]=t_stop;
TimerX[NumTimer][3]=t_val;
TimerCtrl[NumTimer][0]=TimerEN;
TimerCtrl[NumTimer][1]=TimerIsStart;
TimerCtrl[NumTimer][2]=TimerState;
}