Pages: [1] 2   Go Down
Author Topic: [Résolu]Fonction delay, taches paralelles et gestion du temps non-bloquant  (Read 2692 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
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.
« Last Edit: May 19, 2012, 06:43:09 pm by Maskim » Logged

Tokyo
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faut mettre à jour tempsPassé dans la condition. C'est seulement une fois que les 2000ms se sont écoulées que tempsPassé doit être remis à jour. Au tout début aussi, dans le setup(), il faut mettre tempsPassé égal à millis().
                    if (millis() - tempsPassé >= 2000)
                    {
                        //action quelquonque
                        tempsPassé = millis()
                    }

J'ai remplacé le == par un >= car il y a pas mal de chance que la différence ne soit pas exactement 2000.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà justement mon problème : c'est le tout premier delay de 2000 ms, pour les autres pas de soucis puisqu'il me suffira de placer les TempsPassé = millis() dans le if, mais pour le delay juste avant la toute première action je ne comprend pas : si je ne met pas le tempsPassé à jour juste avant, dès que quelqu'un appuis sur le bouton, le feux1 passe orange. Alors que en réalité il y a un certain temps entre l'appuie du piéton sur le bouton et le passage au feux orange.

C'est cette toute première temporisation que je ne voit pas comment écrire ...

Si je met uniquement à jour le temps passé dans le setup() comme tu me dit, il suffit qu'un piéton se présente plus de 2 secondes après le début du programme et hop le feux passe instantannément au orange après l'appuie sans attendre deux seconde ...
Logged

Tokyo
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans ce cas, il suffirait peut-être de mettre tempsPassé à millis() seulement lorsque un piéton appuie sur le bouton.
Et ajouter une condition (boolean sur l'état du bouton: tester la valeur de tempsPassé seulement si le bouton a été appuyé et remettre tout à jour une fois les actions effectuées).
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Effectivement j'ai essayé ça hier soir (tres tard) mais ça n'a pas marché, je pense effectivement que cela doit être la bonne piste. Je vais retenter ce soir.
Je te tiendrais au courant de si ça marche smiley-wink

Merci de l'aide
Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour bonjour, bon j'ai pas mal bidouiller ce genre de fonction ta solution est la !!!

déja dans millis tu a des ms donc pour 1sec c'est 1000 apres de la tu commence comme ça:

Code:
delay=1000; // seconde

temp1=millis();
if (temp1>=(temp2+delay))
{
temp2=millis();

action !!

}


la tu aura une seconde avant le premier passage et le second etc.. tu peut le modifier a chaque fois en faisant

Code:
if (temp1>=(temp2+delay))
{
temp2=millis();
delay=delay+1000; // 1 seconde de plus de delay a chaque passage
ou
delay=2000;//passage a 2 seconde de delay
action !!

}

voila quelque petit truc qui t'aiderons je l'espères, peace !!

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Skizoh, mauvais élève  smiley-twist

On l'a dit 100 fois, on ne compare jamais par les temps entre eux par une relation de grandeur.
Toujours une différence

Code:
if ( (millis() - ancien_temps) >= ATTENTE )
{
    ancien_temps = millis();
    //.....
}

Tu me le copieras 100 fois de plus.
 smiley-grin
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon bah non, définitivement, je n'arrive pas à faire quelque chose qui fonctionne sans utiliser la fonction delay   smiley-sad

Voila où j'en suis : mon problème maintenant viens du fait que le passage au feux orange se fait à chaque fois que la fonction demandePassagePieton() est appelée (heureusement que ce n'est qu'une maquette, sinon il y aurait des morts sur ce carrefour  smiley-roll-sweat )

Je ne voit vraiment pas comment faire pour que ce passage au feux orange ne soit pas refait à chaque fois car si j'utilise un if avec la TempoPassageOrange, le passage au feux orange s'effectuera quand même toutes les 2000 ms ....

Voici mon code au jour d'aujourd'hui :

Code:
void loop()
{
  etatBouton = digitalRead(bouton);   //Viens lire l'état du bouton
  
  if (etatBouton == HIGH && ((millis() - tempsDepuisDernierClick) >= 30000)
  {
    BoutonAppuye = 1;
    TempoPassageOrange = millis();
    tempsDepuisDernierClick = millis();
  }

  if (BoutonAppuye =! 1)
  {
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
    TempoPassageFeuxVert = millis();
  
  if (BoutonAppuye == 1 && ((millis() - TempoPassageOrange) >= 2000)
  {
    demandePassagePieton()
  }
}
demandePassagePieton()
{
    digitalWrite(FeuxVert1, LOW); //passage au feux orange
    digitalWrite(FeuxOrange1, HIGH);

  if (TempoPassageRouge >= 5000)
  {
    digitalWrite(FeuxOrange1, LOW); //passage au feux rouge
    digitalWrite(FeuxRouge1, HIGH);
    TempoPassageRouge = millis();
  }

  if (TempoPassagePietonVert >= 7000)
  {
    digitalWrite(PietonRouge, LOW); //passage au feux pieton vert
    digitalWrite(PietonVert, HIGH);
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
  }
  
  if (TempoPassagePietonRouge >= 12000)
  {
    digitalWrite(PietonVert, LOW);  //passage au feux pieton rouge
    digitalWrite(PietonRouge, HIGH);
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
  }

  if (TempoPassageFeuxVert >= 14000)
  {
    digitalWrite(FeuxRouge1, LOW); //passage au feux vert
    digitalWrite(FeuxVert1, HIGH);        
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
    TempoPassageFeuxVert = millis();
    BoutonAppuye = 0;
  }
}

Si quelqu'un a une idée, je suis preneur. Je ne pensais pas qu'il serait aussi compliqué d’allumer un feux de signalisation sans utiliser la fonction delay()  smiley-confuse
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

/!\ Je m'auto-répond :

Mais tu es trop bête garçon, il suffit de placer une variable qui s’incrémente pour savoir si tu est à ton premier passage dans ta fonction demandePassagePieton() comme ceci :

Code:
void loop()
{
  etatBouton = digitalRead(bouton);   //Viens lire l'état du bouton
 
  if (etatBouton == HIGH && ((millis() - tempsDepuisDernierClick) >= 30000)
  {
    BoutonAppuye = 1;
    TempoPassageOrange = millis();
    tempsDepuisDernierClick = millis();
  }

  if (BoutonAppuye =! 1)
  {
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
    TempoPassageFeuxVert = millis();
 
  if (BoutonAppuye == 1 && ((millis() - TempoPassageOrange) >= 2000)
  {
    NombreDePassages = NombreDePassages +1          [color=red]<==== ici [/color]
    demandePassagePieton()
  }



demandePassagePieton()
{
  if (NombreDePassages == 1)                     [color=red] <===== ici[/color]
  {
    digitalWrite(FeuxVert1, LOW); //passage au feux orange
    digitalWrite(FeuxOrange1, HIGH);
  }

  if (TempoPassageRouge >= 5000)
  {
    digitalWrite(FeuxOrange1, LOW); //passage au feux rouge
    digitalWrite(FeuxRouge1, HIGH);
    TempoPassageRouge = millis();
  }

  if (TempoPassagePietonVert >= 7000)
  {
    digitalWrite(PietonRouge, LOW); //passage au feux pieton vert
    digitalWrite(PietonVert, HIGH);
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
  }
 
  if (TempoPassagePietonRouge >= 12000)
  {
    digitalWrite(PietonVert, LOW);  //passage au feux pieton rouge
    digitalWrite(PietonRouge, HIGH);
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
  }

  if (TempoPassageFeuxVert >= 14000)
  {
    digitalWrite(FeuxRouge1, LOW); //passage au feux vert
    digitalWrite(FeuxVert1, HIGH);       
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
    TempoPassageFeuxVert = millis();
    BoutonAppuye = 0;
    NombreDePassages = 0;     [color=red]  <===== et ici ![/color]
  }
}

Rien de bien compliqué tu vois !
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La Verité Est Ailleurs

Elle s'appelle Machine d'Etat (je sais, je me répète)

Ton feux à un cycle normal avec des états.
Par exemple celui-ci

Feux   A       B
 Etat   
 1      Rouge   Vert
 2      Rouge   Orange
 3      Rouge   Rouge
 4      Vert    Rouge
 5      Orange  Rouge
 6      Rouge   Rouge

 

Normalement le feux tourne 1 -> 2 -> 3 -> 4 -> 5 -> 6 ->1 ... avec une tempo pour rester dans chaque état un certain temps

Quand le pieton appuye sur la demande, la machine d'état va sauter une étape

Il faut que tu concoive ton feux avec des etats.
Et des evenements qui faont changer d'état : soit le temps, soit la pression sur un bouton.

Une machine d'état se gère généralement avec un switch/case.
par exemple

Code:
switch( etat )
{
case ETAT_1:
    if ( temps écoulé )
    {
         // mettre les feux dans l'état 2
         etat = ETAT_2;
    }
  break;
...
}

Tu verra que c'est le plus simple a gérer.
« Last Edit: May 18, 2012, 06:49:43 am by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yop Yop,

Je vois une grosse confusion avec millis, millis() retourne le temps depuis le démarrage de ton arduino et continue jusqu'au prochaine reset ou autre extinction de celui-ci, il n'est pas remis à 0 à chaque appel de la fonction ...

Code:
.
.
  if (TempoPassageRouge >= 5000)
.
.

Donc plutôt ...
Code:
.
.
  if (millis()-TempoPassageRouge >= 5000) //millis actuel-le moment de départ
.
.
Imagine un chronomètre et tu veux mesurer le temps entre 2 tours de piste ta formule1 , tu le lance et tu laisse passer le premier tour de chauffe, une fois la formule1 passé ce premier tour tu lis le timing actuel qui est de 33 sec et tu l'enregistres (TempoPassageRouge), maintenant au second tour tu enregistre le timing (toujours dans sa lancée depuis le départ) qui est de 59 sec (millis ici dessus).
Et bien pour connaitre le temps entre le premier tour et le second il te suffira de soustraire le temps de passage entre le top du deuxième tours et le début de se second tour, donc 59-33=26 sec.
Maintenant pour l'arduino c'est pareil ta fonction loop (boucle infinie) et millis son comme ton chronomètre, tu as besoin d'un delay entre deux actions,le premier top sera  "TempoPassageRouge = millis();" ensuite temps que le temps entre ton premier top enregistré et le suivant est inférieure au delay désiré tu ne fais rien (ou tu reste dans l'action précédente) s'il est supérieur ou égal tu changes l'action.


!!! ici millis sera identique pour tous (+le temps de l'instruction mais bon), une seule variable aurait suffit pour les 4 cas puisque enregistré en même temps ...

Code:
    TempoPassageRouge = millis();
    TempoPassagePietonVert = millis();
    TempoPassagePietonRouge = millis();
    TempoPassageFeuxVert = millis();

par exemple :
Code:
    TempoPassage = millis();

et tu reprends celle ci pour chaque cas.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour vos réponses,

Quote
Je vois une grosse confusion avec millis

Pas de confusion mais une grosse étourderie, effectivement je voulais écrire
            if (millis()-TempoPassageRouge >= 5000)
Mais à force d'effacer tout mon programme et de tout recommencer j'en écrit n'importe quoi  smiley-yell

Quote
!!! ici millis sera identique pour tous (+le temps de l'instruction mais bon), une seule variable aurait suffit pour les 4 cas puisque enregistré en même temps ...

Le fait d'avoir plusieurs variables de Tempos me permettais de les remettre a jour à des moments différents dans ma fonction demandePassagePieton().

Quote
La Verité Est Ailleurs

Elle s'appelle Machine d'Etat

hallelujah ! Je ne connaissait pas le concept de la machine d'états mais tu viens de résoudre tout mes problème d'un coup ! (tout du moins dans mon esprit, mais le programme devrait suivre  smiley-grin )
Effectivement vu comme ça (avec le petit tableau que retrace les différentes possibilités) c'est vraiment beaucoup plus simple !

Merci de votre aide ! je continue sur cette voie et je vous tiens au courant si ça avance  smiley-cool
Vivement ce soir que je puisse tester tout ça !
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai un peut la tête dans le patté (grippé) mais en reprenant la machine à etat je verrais bien quelque chose comme ça

Code:
long topMillis = 0;
long leDelay = 0;
byte etat = 0;
byte nbAppuis = 0;

void setup() //on initialise le premier etat
{
   vertVoiture = on ...
   rougePieton = on ...
   leDelay = 7000;
   etat = 1;
   topMillis = millis();
}

void loop
{

    if(pietonboutonAppuyé ...)
    {
        nbAppuis+=1;
        if(nbAppuis > 3)
        {
            fonctionPassage(1); //on force l'etat
            nbAppuis = 0;
       }
    }

    if(millis()-topMillis >= leDelay)
    {
         fonctionPassage(etat);
    }

}

void fonctionPassage(byte changeEtat)
{
        switch(changeEtat)
        {
            case 1:
                vertVoiture = off ...
                orangeVoiture = on ...
                etat = 2;
                leDelay = 2000;
            break;
            case 2:
                orangeVoiture = off ...
                rougeVoiture = on ...
                vertPieton = on;
                etat = 3;
                leDelay = 8000;
            break;
            case 3:
                vertPieton = off ...
                rougePieton = on ...
                vertVoiture = on ...
                etat = 1;
                leDelay = 7000;
            break;
            .
            .
            .

        }
    topMillis = millis();
}
« Last Edit: May 18, 2012, 08:08:31 am by osaka » Logged


83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oh non je déteste copié des lignes moi :'( lol et tu m'a fait rêvé avec ton "La Verité Est Ailleurs" xDDDDD

Et sa y est ! un converti de plus a la machine d'état ! smiley-grin la machine d'état sera vainqueur   smiley-twist La PROPAGANDE quoi xD

Bon aller courage osaka tu va t'en sortir smiley

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Avis à tous les arduinoniens !

Mon carrefour de feux tricolore avec ses feux pour piétons le tout saupoudré de boutons poussoirs pour traverser plus vite fonctionne !
Et effectivement, la machine à états en est sortie grande gagnante !  smiley-lol

Voici le code que vous attendez tous (ou peut être pas, mais bref si cela peut aider quelqu'un qui souhaite lui aussi s'immerger dans le peau d'un ingénieur en feux de signalisation  smiley-sweat ) :

Code:
//  Programme Feux de signalisation d'un carrefour
//  avec feux pour traversee des pietons et boutons de demande de traversee
//  par Maskim avec l'aide des membres du forum Aduino (merci à eux).

//  Etats possibles du systeme :

//  Etat    Feux1   Feux2   Pieton1   Pieton2
//   
//   1      Rouge   Vert     Vert      Rouge
//   2      Rouge   Orange   Rouge     Rouge
//   3      Rouge   Rouge    Rouge     Rouge
//   4      Vert    Rouge    Rouge     Vert
//   5      Orange  Rouge    Rouge     Rouge
//   6      Rouge   Rouge    Rouge     Rouge

//  Cycle sans appuie sur bouton :             1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 1
//  Duree de chaque etat sans appuie         15s  5s   5s  15s   5s   5s  15s
//  Duree avec appuis sur bouton1             15s  5s   5s  7,5s  5s   5s  15s
//  Duree avec appuis sur bouton2            7,5s  5s   5s  15s   5s   5s  15s

int FeuxRouge1 = 9;    //variables pour les Feux de la rue 1
int FeuxOrange1 = 8;    //defini les PIN affectes
int FeuxVert1 = 7;

int FeuxRouge2 = 6;     //variables pour les Feux de la rue 2
int FeuxOrange2 = 5;    //defini les PIN affectes
int FeuxVert2 = 4;

int PietonRouge1 = 3;   //variables pour le feux des pietons de la rue 1
int PietonVert1 = 2;    //defini les PIN affectes

int PietonRouge2 = 10;  //variables pour le feux des pietons de la rue 2
int PietonVert2 = 11;   //defini les PIN affectes

int Bouton1 = 13;         //PINs affectes aux boutons
int Bouton2 = 12;         


unsigned long Tempo;
unsigned long TempsDepuisDernierAppuie1;
unsigned long TempsDepuisDernierAppuie2;
int etat;
int delai1;
int delai2;

void setup()
{
  pinMode(FeuxRouge1, OUTPUT);  //definit a  l'Arduino les PINs des Feux
  pinMode(FeuxOrange1, OUTPUT);
  pinMode(FeuxVert1, OUTPUT);

  pinMode(FeuxRouge2, OUTPUT); 
  pinMode(FeuxOrange2, OUTPUT);
  pinMode(FeuxVert2, OUTPUT);

  pinMode(PietonRouge1, OUTPUT);  //definit a  l'Arduino les PINs des Feux pietons
  pinMode(PietonVert1, OUTPUT);

  pinMode(PietonRouge2, OUTPUT);
  pinMode(PietonVert2, OUTPUT);

  pinMode(Bouton1, INPUT);
  pinMode(Bouton2, INPUT);

  digitalWrite(FeuxRouge1, HIGH);  //Definit les etats des LEDs à l'initialisation
  digitalWrite(FeuxVert2, HIGH);
  digitalWrite(PietonVert1, HIGH);
  digitalWrite(PietonRouge2, HIGH);

  Tempo = millis();
  delai1 = 15000;
  delai2 = 15000;
  TempsDepuisDernierAppuie1 = millis();
  TempsDepuisDernierAppuie2 = millis();
  etat = 1;
 
  Serial.begin(9600);
}

void loop ()
{
  if (digitalRead(Bouton1) == 1 && ((millis() - TempsDepuisDernierAppuie1) >= 10000))
  {
    Serial.print("Un connard appuie sur le bouton 1 \n");
    delai2 = 7500;
    TempsDepuisDernierAppuie1 = millis();
  }
 
  if (digitalRead(Bouton2) == 1 && ((millis() - TempsDepuisDernierAppuie2) >= 10000))
  {
    Serial.print("Un connard appuie sur le bouton 2 \n");
    delai1 = 7500;
    TempsDepuisDernierAppuie2 = millis();
  }
 
  routine();
}




void routine()
{
  switch (etat)
  {
    case 1 :                                   //Etat 1 (voir tableau des etats possible)
      if (millis() - Tempo >= 5000)                         
      {
        Serial.print("passage a l'etat 1 \n");
        digitalWrite(FeuxRouge1, HIGH);
        digitalWrite(FeuxRouge2, LOW);
        digitalWrite(FeuxVert2, HIGH);
        digitalWrite(PietonRouge1, LOW);
        digitalWrite(PietonVert1, HIGH);
        digitalWrite(PietonRouge2, HIGH);
        Tempo = millis();
        TempsDepuisDernierAppuie1 = millis();
        delai1 = 15000;
        etat = 2;
      }
      break;

    case 2 :                                   //Etat 2 (voir tableau des etats possible)
      if (millis() - Tempo >= delai1)
      {
        Serial.print("passage a l'etat 2 \n");
        digitalWrite(FeuxVert2, LOW);
        digitalWrite(FeuxOrange2, HIGH);
        digitalWrite(PietonVert1, LOW);
        digitalWrite(PietonRouge1, HIGH);
        Tempo = millis();
        etat = 3;
      }
      break;

     case 3 :                                   //Etat 3 (voir tableau des etats possible)
      if (millis() - Tempo >= 5000)
      {
        Serial.print("passage a l'etat 3 \n");
        digitalWrite(FeuxOrange2, LOW);
        digitalWrite(FeuxRouge2, HIGH);
        Tempo = millis();
        etat = 4;
      }
      break;

     case 4 :                                   //Etat 4 (voir tableau des etats possible)
      if (millis() - Tempo >= 5000)
      {
        Serial.print("passage a l'etat 4 \n");
        digitalWrite(FeuxRouge1, LOW);
        digitalWrite(FeuxVert1, HIGH);
        digitalWrite(PietonRouge2, LOW);
        digitalWrite(PietonVert2, HIGH);
        Tempo = millis();
        TempsDepuisDernierAppuie2 = millis();
        delai2 = 15000;
        etat = 5;
      }
      break;

     case 5 :                                   //Etat 5 (voir tableau des etats possible)
      if (millis() - Tempo >= delai2)
      {
        Serial.print("passage a l'etat 5 \n");
        digitalWrite(FeuxVert1, LOW);
        digitalWrite(FeuxOrange1, HIGH);
        digitalWrite(PietonVert2, LOW);
        digitalWrite(PietonRouge2, HIGH);
        Tempo = millis();
        etat = 6;
      }
      break;
   
     case 6 :                                   //Etat 6 (voir tableau des etats possible)
      if (millis() - Tempo >= 5000)
      {
        Serial.print("passage a l'etat 6 \n");
        digitalWrite(FeuxOrange1, LOW);
        digitalWrite(FeuxRouge1, HIGH);
        Tempo = millis();
        etat = 1;
      }
      break;
  }
}

Logged

Pages: [1] 2   Go Up
Jump to: