- Arduino partiamo da zero - n°4
Pulsanti e Led -- Simuliamo un semaforo pedonale
Per questo lavoro si utilizza la gestione pulsanti illustrata nel precedente post.
Si aggiungono tre led e si toglie un pulsante ( ma si può anche lasciare ).
Materiale occorrente:
6 Led ( 2 Rosso, 2 Giallo, 2 Verde )
6 Resistenze da 330 ohm. ( R1 - R6)
2 Resistenze da 10K. ( R7 - R8 )
2 Pulsanti.
Una BB, filo per collegamenti.
Vediamo qui sotto i collegamenti
( Si !! lo so il mio montaggio non è così ma non lo volevo smontare)
Questo è lo schema
Qui sotto trovate lo sketch, ho descritto tutto il funzionamento nei commenti.
/* Sergio & Adriano Prenleloup 20/03/2013 Semaforo v. 1.0 In questo sketch si utilizza la procedura generica per la gestione pulsanti già presentata nel post precedente. I pulsanti simuleranno l'arrivo dei pedoni che attendono al semaforo per attraversare. Inizialmente si ha la seguente situazione: 1) Semaforo auto Verde ---- Semaforo pedoni Rosso Con la pressione di un pulsante si lascia trascorrere (xT) poi si attiva la procedura semaforo. che eseguirà i seguenti cambiamenti: 2) Semaforo auto Verde-Giallo ---- Semaforo pedoni Rosso 3) Semaforo auto Rosso ------ Semaforo pedoni Verde 4) Semaforo auto Rosso ------ Semaforo pedoni Verde-Giallo 5) semaforo auto Verde ------ Semaforo pedoni Rosso (come al passo 1) I tempi per questi passaggi sono più brevi del reale per non allungare troppo il filmato di prova ma si possono cambiare facilmente. */ //pulsanti = pin int Pulsante_pedoni_a = 8; // simulano i pulsanti dei pedoni int Pulsante_pedoni_b = 9; //stato corrente dei bottoni int stato_bottoni[2]; boolean stato_switch[2]; // led = pin ( semaforo pedoni) int Rosso_ped = 2; int Giallo_ped = 1; int Verde_ped = 0; // led = pin ( semaforo auto ) int Rosso_auto = 6; int Giallo_auto = 5; int Verde_auto = 4; int Pedoni = 0; //ritornerà a 0 dopo la funzione semaforo. void setup() { // Pulsanti pedoni pinMode (Pulsante_pedoni_a, INPUT); pinMode (Pulsante_pedoni_b, INPUT); // Led semaforo pedoni pinMode (Rosso_ped, OUTPUT); pinMode (Giallo_ped, OUTPUT); pinMode (Verde_ped, OUTPUT); // Led semaforo auto pinMode (Rosso_auto, OUTPUT); pinMode (Giallo_auto, OUTPUT); pinMode (Verde_auto, OUTPUT); stato_bottoni[0] = 0; stato_bottoni[1] = 0; // condizione iniziale semaforo pedoni digitalWrite (Rosso_ped, HIGH); digitalWrite (Giallo_ped, LOW); digitalWrite (Verde_ped, LOW); // condizione iniziale semaforo auto digitalWrite (Rosso_auto, LOW); digitalWrite (Giallo_auto, LOW); digitalWrite (Verde_auto, HIGH); } // questa è la procedura generica per utilizzare pulsanti // chiamata dalla "controllaPulsante" void aggiornaStato(int bottone, int& statoBottoneVecchio, boolean& statoSwitch) { //Si legge lo stato corrente del bottone (se premuto o no) int statoBottoneCorrente = digitalRead (bottone); //Se lo stato corrente del bottone è cambiato (diverso dal vecchio stato) //si deve gestire il nuovo stato if (statoBottoneCorrente != statoBottoneVecchio) { //se stiamo passando da rilasciato a premuto allora gestiamo la //logica antirimbalzo e attiviamo/disattiviamo lo swith if (statoBottoneCorrente == HIGH) { delay(15); statoSwitch = !statoSwitch; } //il nuovo stato diventa lo stato corrente statoBottoneVecchio = statoBottoneCorrente; } } void controllaPulsante() { aggiornaStato(Pulsante_pedoni_a, stato_bottoni[0], stato_switch[0]); aggiornaStato(Pulsante_pedoni_b, stato_bottoni[1], stato_switch[1]); } //con questa procedura si conteggiano i pedoni ( numero delle volte premuto il pulsante) // in realtà con i tempi di attesa attuali non è utilissima // ma se si allungano i tempi iniziali di attesa si potrebbe conteggiare più di un pedone. void conta_pedoni() { if (stato_switch[0] == 1 { Pedoni = Pedoni + 1; } if (stato_switch[1] == 1) { Pedoni = Pedoni + 1; } } // questa procedura simula il semaforo // si avvia con la presenza di almeno un pedone // Per una migliore lettura // Ho riportato sempre i tre led (auto) ed i tre led ( pedoni ) // anche se era più compatto scrivere solo i led che cambiano stato. // I tempi utilizzati sono più brevi del realistico. void semaforo() { // auto fase 1 ( verde) digitalWrite (Rosso_auto, LOW); digitalWrite (Giallo_auto, LOW); digitalWrite (Verde_auto, HIGH); // pedoni fase 1 (rosso) digitalWrite (Rosso_ped, HIGH); digitalWrite (Giallo_ped, LOW); digitalWrite (Verde_ped, LOW); delay (2000); // le auto passano pedoni fermi // auto fase due giallo e verde digitalWrite (Rosso_auto, LOW); digitalWrite (Giallo_auto, HIGH); digitalWrite (Verde_auto, HIGH); //pedoni fase 2 ( rosso) digitalWrite (Rosso_ped, HIGH); digitalWrite (Giallo_ped, LOW); digitalWrite (Verde_ped, LOW); delay (2000); // il giallo ferma le auto // auto fase 3 scatta il rosso digitalWrite (Rosso_auto, HIGH); digitalWrite (Giallo_auto, LOW); digitalWrite (Verde_auto, LOW); //pedoni fase 3 ( verde) delay (300); digitalWrite (Rosso_ped, LOW); digitalWrite (Giallo_ped, LOW); digitalWrite (Verde_ped, HIGH); delay (6000); // pedoni attraversano // auto fase 4 rimane rosso digitalWrite (Rosso_auto, HIGH); digitalWrite (Giallo_auto, LOW); digitalWrite (Verde_auto, LOW); //pedoni fase 4 giallo e verde digitalWrite (Rosso_ped, LOW); digitalWrite (Giallo_ped, HIGH); digitalWrite (Verde_ped, HIGH); delay (2000); // il giallo ferma i pedoni // auto fase 1 ( verde) digitalWrite (Rosso_auto, LOW); digitalWrite (Giallo_auto, LOW); digitalWrite (Verde_auto, HIGH); // pedoni fase 1 (rosso) digitalWrite (Rosso_ped, HIGH); digitalWrite (Giallo_ped, LOW); digitalWrite (Verde_ped, LOW); delay (100); // siamo tornati alla confizione iniziale // ripristiniamo lo stato iniziale dei Pulsanti e dei pedoni Pedoni = 0; stato_switch[0] = 0; stato_switch[1] = 0; } void loop() { for ( int i = 0; i < 50; i++) // questo ciclo simula l'attesa per i pedoni { controllaPulsante(); conta_pedoni(); delay (100); } if (Pedoni >= 1 ) //se il pulsante è stato premuto si esegue "semaforo" // poi tutto torna alla fase iniziale. { semaforo(); } }Qui scaricate lo sketch SemaforoPedoni.ino
Questo è un breve filmato.
Attendo Vostri commenti.
Un saluto a tutti.
Sergio
Nessun commento:
Posta un commento
Vi ringrazio per la lettura e vi invito al prossimo post.
Se il post vi è stato utile, vi è piaciuto oppure no, scrivete un commento.
Un saluto a tutti.
Sergio
Copyright - Condizioni d’uso - Disclaimer
http://avventurarduino.blogspot.it/2012/10/inizia-lavventura-arduino-12-settembre.html