Articles - Arduino

Feux tricolores

  |   1018  |  Poster commentaire  |  Arduino
Voici un décor à la fois esthétique et utile.
Et oui utile !!! tout simplement parce qu'il ajoute un peu d'animation à votre piste si vous le faites fonctionnel .

Pour mon association, j'ai donc fabriqué un jeu de feux tricolores fonctionnelles sur base d'arduino (Oui je suis un maniaque de l'arduino).

J'ai commencé par dessiner les feux, que j'ai imprimé grâce à l'imprimante 3D d'un copain.


Côté fonctionnement, c'est assez simple a programmer et c'est l'idéal pour apprendre le langage ARDUINO.
Dans le sketch ci dessous, j'ai ajouté quelques fonctions histoire de dynamiser un peu le tout.
En gros le feu fonctionne normalement pendant 20 minutes, puis passe en mode "EN PANNE" (orange clignotant) pendant 5 minutes puis repasse en mode "NORMAL" .........
Code CPP :
//**************** Entête déclarative *********************************************
 
const int ROUGE_1=7; //declaration constante de broche
const int ORANGE_1=8; //declaration constante de broche
const int VERT_1=9; //declaration constante de broche
const int ROUGE_2=4; //declaration constante de broche
const int ORANGE_2=5; //declaration constante de broche
const int VERT_2=6; //declaration constante de broche
 
 
static uint32_t tempomode = millis(); ; // variable memoire de temps de changement de mode
//static boolean valmode = HIGH ; // variable mode de clignotement low=derangement high=normal
long tempsderrang = 300000 ; //variable temps de derangement 5min
long tempsnormal = 1200000 ; //variable temps de normal 20min
long tempscycle = tempsderrang +tempsnormal ;
 
//**************** FONCTION SETUP *********************************************
 
void setup()   { // debut de la fonction setup()
 
pinMode(ROUGE_1, OUTPUT); //met la broche en sortie
pinMode(VERT_1, OUTPUT); //met la broche en sortie
pinMode(ORANGE_1, OUTPUT); //met la broche en sortie
pinMode(ROUGE_2, OUTPUT); //met la broche en sortie
pinMode(VERT_2, OUTPUT); //met la broche en sortie
pinMode(ORANGE_2, OUTPUT); //met la broche en sortie
 
digitalWrite(ROUGE_1,LOW); // met la broche au niveau BAS
digitalWrite(VERT_1,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_1,HIGH); // met la broche au niveau HAUT
digitalWrite(ROUGE_2,LOW); // met la broche au niveau BAS
digitalWrite(VERT_2,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_2,HIGH); // met la broche au niveau HAUT
delay(500); // pause de 0,5 seconde
digitalWrite(ORANGE_1,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_2,LOW); // met la broche au niveau BAS
delay(500); // pause de 0,5 seconde
digitalWrite(ORANGE_1,HIGH); // met la broche au niveau HAUT
digitalWrite(ORANGE_2,HIGH); // met la broche au niveau HAUT
delay(500); // pause de 0,5 seconde
digitalWrite(ORANGE_1,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_2,LOW); // met la broche au niveau BAS
tempomode = millis() ;
} // fin de la fonction setup()
// ********************************************************************************
 
//*************** FONCTION LOOP ***************************************************
 
void loop(){ 
 
if (millis() - tempomode <= tempsnormal) {  //feu en mode normal
 
  //--- le feu 2 passe au vert
digitalWrite(ROUGE_1,HIGH); // allume rouge feu 1
digitalWrite(ROUGE_2,LOW); // éteint rouge feu 2
digitalWrite(VERT_2,HIGH); // allume vert feu 2
 
delay (20000); // pause longue 20 secondes
 
//--- le feu 2 passe à l'orange
digitalWrite(VERT_2,LOW); // éteint vert feu 2
digitalWrite(ORANGE_2,HIGH); // allume orange feu 2
 
delay (1000); // pause 1 secondes
 
//--- le feu 2 passe au rouge
digitalWrite(ORANGE_2,LOW); // éteint orange feu 2
digitalWrite(ROUGE_2,HIGH); // allume rouge feu 2
 
delay (1000); // pause courte 1 seconde
 
//--- le feu 1 passe au vert
digitalWrite(ROUGE_1,LOW); // éteint rouge feu 1
digitalWrite(VERT_1,HIGH); // allume vert feu 1
 
delay (20000); // pause longue 20 secondes
 
//--- le feu 1 passe à l'orange
digitalWrite(VERT_1,LOW); // éteint vert feu 1
digitalWrite(ORANGE_1,HIGH); // allume orange feu 1
 
delay (1000); // pause 1 secondes
 
//--- le feu 1 passe au rouge
digitalWrite(ORANGE_1,LOW); // éteint orange feu 1
digitalWrite(ROUGE_1,HIGH); // allume rouge feu 1
 
delay (1000); // pause courte 1 seconde
      }        
                     else { // feu en mode derangement
digitalWrite(ROUGE_1,LOW); // met la broche au niveau BAS
digitalWrite(VERT_1,LOW); // met la broche au niveau BAS
digitalWrite(ROUGE_2,LOW); // met la broche au niveau BAS
digitalWrite(VERT_2,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_1,HIGH); // met la broche au niveau HAUT
digitalWrite(ORANGE_2,HIGH); // met la broche au niveau HAUT
delay(1000); // pause de 1 seconde
digitalWrite(ORANGE_1,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_2,LOW); // met la broche au niveau BAS
delay(1000); // pause de 1 seconde
digitalWrite(ORANGE_1,HIGH); // met la broche au niveau HAUT
digitalWrite(ORANGE_2,HIGH); // met la broche au niveau HAUT
delay(1000); // pause de 1 seconde
digitalWrite(ORANGE_1,LOW); // met la broche au niveau BAS
digitalWrite(ORANGE_2,LOW); // met la broche au niveau BAS
delay(1000); // pause de 1 seconde 
                        }
if (millis() - tempomode >= tempscycle) { tempomode = millis() ; }
} // fin de la fonction loop**************************************************************
 
// --- Fin programme ---


Pour alimenter ce montage, j'utilise une batterie de secours (pour téléphone portable) à batterie solaire que j'ai intégré dans le toit de mon snack, se qui me permet de faire fonctionner les feux presque une journée complète.