In questa guida vedremo come creare un semaforo e mezzo (per la mancanza di un secondo sensore ad ultrasuoni) ma comunque efficace e funzionale!
Ecco una tabella con i materiali necessari per la costruzione del progetto:
L'idea è di costruire un semaforo a rivelamento che tramite il sensore ad ultrasuoni riesca a rilevare un oggetto in avvicinamento per poi far scattare il verde e viceversa nell'altro semaforo.
Come già accennato in precedenza, per la mancanza di un sensore il primo semaforo non avrà il colore giallo, non una grande perdita dato che scatterà il verde solo al passare di un oggetto e poi diventerà di nuovo rosso immediatamente.
Vediamo la struttura del codice, inizialmente si specificano tutti i pin usati dall'Arduino come trigPin e echoPin per il sensore ad ultrasuoni e i vari pin dei led per i semafori.
semaforo1Verde
e semaforo2Giallo
sono variabili booleane usate in questo caso per controllare i semafori 1 e 2.
setup()
in questa funzione vengono impostati i pin come input o output e i semafori 1 e 2 vengono impostati con il rosso acceso.
loop()
come suggerisce il nome è la funzione che permette alle istruzioni di ripetersi all'infinito, importante specificare che la distanza misurata viene calcolata in base al tempo impiegato per ricevere un echo dal sensore.
Per il semaforo 1:
- Se la distanza < 10 cm, il semaforo 1 viene acceso (verde).
- Sennò il semaforo 1 viene spento (verde).
Per il semaforo 2:
- Se la distanza < 20 cm il semaforo 2 viene acceso (giallo).
- Dopo un ritardo di 1 secondo il giallo viene spento e il rosso viene acceso (giallo).
- Il semaforo 1 viene spento completamente (verde e rosso entrambi spenti).
Questo fatto dei 20 e 10 cm è stato aggiunto per gestire il ritardo che si sarebbe andato a creare con il giallo sebbene il significato del colore stesso sarebbe quello di rallentare, si suppone che per un oggetto che si muove in modo uniforme sia un ottimo compromesso.
Di logica il semaforo 1 deve essere posizionato nella zona con meno traffico.
Vi lascio il link Tinkercad del progetto QUI!
const int trigPin = 9;
const int echoPin = 10;
const int semaforo1VerdePin = 2;
const int semaforo1RossoPin = 3;
const int semaforo2VerdePin = 4;
const int semaforo2GialloPin = 5;
const int semaforo2RossoPin = 6;
bool semaforo1Verde = false;
bool semaforo2Giallo = false;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(semaforo1VerdePin, OUTPUT);
pinMode(semaforo1RossoPin, OUTPUT);
pinMode(semaforo2VerdePin, OUTPUT);
pinMode(semaforo2GialloPin, OUTPUT);
pinMode(semaforo2RossoPin, OUTPUT);
digitalWrite(semaforo1RossoPin, HIGH);
digitalWrite(semaforo2VerdePin, HIGH);
Serial.begin(9600);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration / 29 / 2;
Serial.print("Distanza: ");
Serial.println(distance);
if (distance < 10) {
if (!semaforo1Verde) {
digitalWrite(semaforo1RossoPin, LOW);
digitalWrite(semaforo1VerdePin, HIGH);
semaforo1Verde = true;
}
} else {
digitalWrite(semaforo1RossoPin, HIGH);
digitalWrite(semaforo1VerdePin, LOW);
semaforo1Verde = false;
}
if (distance < 20) {
if (!semaforo2Giallo) {
digitalWrite(semaforo2VerdePin, LOW);
digitalWrite(semaforo2GialloPin, HIGH);
delay(1000);
digitalWrite(semaforo2GialloPin, LOW);
delay(200);
digitalWrite(semaforo2RossoPin, HIGH);
semaforo2Giallo = true;
digitalWrite(semaforo1RossoPin, HIGH);
digitalWrite(semaforo1VerdePin, HIGH);
semaforo1Verde = false;
}
} else {
digitalWrite(semaforo2VerdePin, HIGH);
digitalWrite(semaforo2RossoPin, LOW);
semaforo2Giallo = false;
}
}
Simulazione con Tinkercad:
Schema elettrico:
Video dimostrazione: