Catégories
Algorithme Arduino Projets Arduino Projets électroniques

Arduino #43: Exemple Temporisation non bloquante

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;
}

Accueil Arduino

Laisser un commentaire