Bonsoir à tous !
Je me pose des questions concernant le fait de lancer des fonctions en parallèle sur Arduino. Je vous donne un exemple : Je tente de reproduire un feux tricolore d'un carrefour, il y a donc 2 feux à gérer (quatre en réalité, mais ils font la même chose deux par deux, donc pour simplifier j'utilise deux feux).
Pour la clarté du programme, j'ai créé deux fonctions : CycleFeux1 et CycleFeux2
évidemment quand je lance mon programme (code en fin de mon poste), le problème est le suivant : l'Arduino attend que la fonction CycleFeux1 se termine pour lancer CycleFeux2.
J'ai lu sur le forum que c'est la fonction delay qui pose problème dans ce cas, mais en essayant de refaire mon code en supprimant toutes les fonction delay et en remplaçant par des actions conditionnels du genre :
tempsPassé = millis()
if (millis() - tempsPassé == 2000)
{
//action quelquonque
}
Comme la variable tempsPassé est changé juste avant de rentrer dans le if, je n'ai donc jamais cet équart de 2000ms. J'ai bien tenté de déplacé le tempsPassé = millis() un peut partout ailleur dans mon code, mais toujours le même problème : le programme le fait quelques millisecondes avant le if donc jamais cet équart de 2000 ms.
Quelqu'un a t'il une idée pour me permettre de réaliser mes fonctions CycleFeux1 et CycleFeux2 plus ou moins en même temps ?
Voici mon code initial à base de la fonction delay pour gérer les timmers :
int FeuxRouge1 = 10;
int FeuxOrange1 = 9;
int FeuxVert1 = 8;
int FeuxRouge2 = 7;
int FeuxOrange2 = 6;
int FeuxVert2 = 5;
int PietonRed1 = 11;
int PietonVert1 = 12;
int Boutton = 2;
int TempsDeTraverser = 5000;
unsigned long TempsDepuisAppuisBoutton;
void setup()
{
pinMode(FeuxRouge1, OUTPUT);
pinMode(FeuxOrange1, OUTPUT);
pinMode(FeuxVert1, OUTPUT);
pinMode(FeuxRouge2, OUTPUT);
pinMode(FeuxOrange2, OUTPUT);
pinMode(FeuxVert2, OUTPUT);
pinMode(PietonRed1, OUTPUT);
pinMode(PietonVert1, OUTPUT);
pinMode(Boutton, INPUT);
digitalWrite(FeuxVert1, HIGH);
digitalWrite(FeuxRouge2, HIGH);
digitalWrite(PietonRed1, HIGH);
Serial.begin(9600);
}
void loop()
{
int state = digitalRead(Boutton);
if (state == HIGH && (millis() - TempsDepuisAppuisBoutton) > 5000)
{
CycleFeux1();
Serial.print("CycleFeux1 acheve (fonction loop) \n");
CycleFeux2()
}
}
void CycleFeux1()
{
Serial.print("Debut CycleFeux1 \n");
delay(2000);
digitalWrite(FeuxVert1, LOW);
digitalWrite(FeuxOrange1, HIGH);
delay(3000);
digitalWrite(FeuxOrange1, LOW);
digitalWrite(FeuxRouge1, HIGH);
delay(2000);
digitalWrite(PietonRed1, LOW);
digitalWrite(PietonVert1, HIGH);
delay(TempsDeTraverser);
digitalWrite(PietonRed1, HIGH);
digitalWrite(PietonVert1, LOW);
delay(2000);
digitalWrite(FeuxRouge1, LOW);
digitalWrite(FeuxVert1, HIGH);
delay(1000);
Serial.print("CycleFeux1 acheve (fonction CycleFeux1) \n");
TempsDepuisAppuisBoutton = millis();
}
void CycleFeux2()
{
Serial.print("Debut CycleFeux2 \n");
delay(6000);
digitalWrite(FeuxRouge2, LOW);
digitalWrite(FeuxVert2, HIGH);
delay(5000);
digitalWrite(FeuxVert2, LOW);
digitalWrite(FeuxOrange2, HIGH);
delay(3000);
digitalWrite(FeuxOrange2, LOW);
digitalWrite(FeuxRouge2, HIGH);
Serial.print("CycleFeux2 acheve (fonction CycleFeux2) \n");
}
Merci d'avance.