Abonnez-vous à notre Chaîne YouTube "Devenir Ingénieur " pour bénéficier de nouveaux projets et suivre l'actualité du blog
VIDEO
Objectifs
Savoir ordonnancer les taches avec Arduino
Savoir définir les conditions de départs et arrêts des taches
Savoir initialiser l’ordonnanceur
Etc.
Initialisation: Durée & temps de départ
void setup()
{
// Init écheances des taches (en ms)
Tache_duree[0]=5000;
Tache_duree[1]=5000;
Tache_duree[2]=5000;
// Init temps de début des tâches (en ms)
Tache_start[0]=10000;
Tache_start[1]=20000;
Tache_start[2]=30000;
// Init affichage de la tache active
Serial .begin(9600);
// Init des sorties
pinMode (PinLED1,OUTPUT);
pinMode(PinLED2,OUTPUT);
pinMode(PinLED3,OUTPUT);
}
Lecture de l’ordonnanceur
Initialisation de l’ordonnanceur avec la période de répétition
Master_time=(Master_time % DureeRep_ms);
Génération des conditions de début des taches
for (i=0;i<NumTache;i++)
{
Tache_on[i]=(Master_time>Tache_start[i]);
}
Génération des conditions d’arrêts
for (i=0;i<NumTache;i++)
{
Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));
}
Exécution des tâches
// Tâche 1
if(Tache_off[0])
{
analogWrite(PinLED1,255);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=1;
}
// Tâche 2
else if(Tache_off[1])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,255);
analogWrite(PinLED3,0);
Tache_Active=2;
}
// Tâche 3
else if(Tache_off[2])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,255);
Tache_Active=3;
}
// Autres: Désactivation des sorties
else
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=0;
}
// Affichage de la tache active
Serial.print(Master_time/1000);
Serial.print(":");
Serial.println(Master_time%1000);
}
Exemple de 3 tâches
#define NumTache 3
#define DureeRep_ms 40000
#define PinLED1 2
#define PinLED2 3
#define PinLED3 4
unsigned char Tache_on[NumTache],Tache_off[NumTache];
unsigned long Tache_start[NumTache],i;
unsigned long Master_time=0, Tache_duree[NumTache];
unsigned char Tache_Active=0;
void setup()
{
// Init écheances des taches (en ms)
Tache_duree[0]=5000;
Tache_duree[1]=5000;
Tache_duree[2]=5000;
// Init temps de début des tâches (en ms)
Tache_start[0]=10000;
Tache_start[1]=20000;
Tache_start[2]=30000;
// Init affichage de la tache active
Serial.begin(9600);
// Init des sorties
pinMode(PinLED1,OUTPUT);
pinMode(PinLED2,OUTPUT);
pinMode(PinLED3,OUTPUT);
}
void loop()
{
// Lecture de l'ordonnanceur
Master_time=millis();
// Init de l'ordonnanceur avec la période de répétition
Master_time=(Master_time % DureeRep_ms);
// Génération des conditions de début des taches
for (i=0;i<NumTache;i++)
{
Tache_on[i]=(Master_time>Tache_start[i]);
}
// Génération des conditions d'arrêts
for (i=0;i<NumTache;i++)
{
Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));
}
// Exécution des tâches
// Tâche 1
if(Tache_off[0])
{
analogWrite(PinLED1,255);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=1;
}
// Tâche 2
else if(Tache_off[1])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,255);
analogWrite(PinLED3,0);
Tache_Active=2;
}
// Tâche 3
else if(Tache_off[2])
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,255);
Tache_Active=3;
}
// Autres: Désactivation des sorties
else
{
analogWrite(PinLED1,0);
analogWrite(PinLED2,0);
analogWrite(PinLED3,0);
Tache_Active=0;
}
// Affichage de la tache active
Serial.print(Master_time/1000);
Serial.print(":");
Serial.println(Master_time%1000);
}
Sujets connexes
arduino boucles simultanées
arduino actions simultanées
plusieurs loop arduino
arduino plusieurs capteurs
arduino temporisation non bloquante
arduino multitâche avec timer
arduino astuces
programme arduino complexe
arduino multitâche
machine d’état arduino
[Total : 1 Moyenne : 5 /5]