Non avevo capito il posizionamento dei led. Aggiorno lo schema elettrico e te lo rinvio.
Per il wireless e il rilavatore IR... piano! Va bene che il proverbio dice che l'appetito vien mangiando, ma anche che non bisogna mettere troppa carne al fuoco. Comincia con lo stop manuale, poi vediamo. Il wireless per ora sembra rispondere bene, ma devo testare distanza e disturbi. Se si reinizializza durante una corsa sono guai. E una volta è successo. Devo capire perché.
Ho corretto e fatto un passo avanti col programma. Cerca di capire quello che ho aggiunto/corretto e fallo tuo. Togli i commenti che ho aggiunto per farti capire dove ho messo le mani.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
//DEFINIZIONI //======commento aggiunto
#define BUTTONSTART 11 //pulsante di start //======istruzione modificata
#define BUTTON1 A0 //pulsante stop corsia 1
#define BUTTON2 A1 //pulsante stop corsia 2
#define BUTTON3 A2 //pulsante stop corsia 3
#define BUTTON4 A3 //pulsante stop corsia 4
#define BUTTONSTART 11 //pulsante di start
#define LEDVERDE1 2 //led start corsia 1 //======istruzione modificata
#define LEDVERDE2 3 //led start corsia 2 //======istruzione modificata
#define LEDVERDE3 4 //led start corsia 3 //======istruzione modificata
#define LEDVERDE4 5 //led start corsia 4 //======istruzione modificata
#define LEDROSSO1 6 //led stop corsia 1 //======istruzione modificata
#define LEDROSSO2 7 //led stop corsia 2 //======istruzione modificata
#define LEDROSSO3 8 //led stop corsia 3 //======istruzione modificata
#define LEDROSSO4 9 //led stop corsia 4 //======istruzione modificata
//VARIABILI //======commento aggiunto
int val;
bool statoCorsia1; //flag corsia1 //======istruzione aggiunta
bool statoCorsia2; //flag corsia2 //======istruzione aggiunta
bool statoCorsia3; //flag corsia3 //======istruzione aggiunta
bool statoCorsia4; //flag corsia4 //======istruzione aggiunta
void setup()
{
// pinMode(BUTTON, INPUT_PULLUP); //======istruzione tolta
pinMode(BUTTON1, INPUT_PULLUP); //======istruzione aggiunta
pinMode(BUTTON2, INPUT_PULLUP); //======istruzione aggiunta
pinMode(BUTTON3, INPUT_PULLUP); //======istruzione aggiunta
pinMode(BUTTON4, INPUT_PULLUP); //======istruzione aggiunta
pinMode(BUTTONSTART, INPUT_PULLUP); //======istruzione aggiunta
pinMode(LEDVERDE1, OUTPUT); //======istruzione aggiunta
pinMode(LEDVERDE2, OUTPUT); //======istruzione aggiunta
pinMode(LEDVERDE3, OUTPUT); //======istruzione aggiunta
pinMode(LEDVERDE4, OUTPUT); //======istruzione aggiunta
pinMode(LEDROSSO1, OUTPUT); //======istruzione aggiunta
pinMode(LEDROSSO2, OUTPUT); //======istruzione aggiunta
pinMode(LEDROSSO3, OUTPUT); //======istruzione aggiunta
pinMode(LEDROSSO4, OUTPUT); //======istruzione aggiunta
//spegni tutti i led //======commento aggiunto
digitalWrite(LEDVERDE1, LOW); //======istruzione aggiunta
digitalWrite(LEDVERDE2, LOW); //======istruzione aggiunta
digitalWrite(LEDVERDE3, LOW); //======istruzione aggiunta
digitalWrite(LEDVERDE4, LOW); //======istruzione aggiunta
digitalWrite(LEDROSSO1, LOW); //======istruzione aggiunta
digitalWrite(LEDROSSO2, LOW); //======istruzione aggiunta
digitalWrite(LEDROSSO3, LOW); //======istruzione aggiunta
digitalWrite(LEDROSSO4, LOW); //======istruzione aggiunta
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("CORSIA 1 ");
lcd.setCursor(0,1);
lcd.print("CORSIA 2 ");
lcd.setCursor(0,2);
lcd.print("CORSIA 3 ");
lcd.setCursor(0,3);
lcd.print("CORSIA 4 ");
//inizializza flag corsie //======commento aggiunto
statoCorsia1 = false; //======istruzione aggiunta
statoCorsia2 = false; //======istruzione aggiunta
statoCorsia3 = false; //======istruzione aggiunta
statoCorsia4 = false; //======istruzione aggiunta
}
void loop()
{
//======commento aggiunto
/*Il programma si svolge in due fasi. La prima è una "loop infinita" che serve
* solo a verificare lo stato di attività delle 4 corsie. Da questa loop
* infinita si esce con l'istruzione "break;". In questo caso si esce nel
* momento in cui viene premuto il pulsante di start. Alla pressione del
* pulsante di start parte il cronometraggio e si entra in una seconda loop
* infinita durante la quale si controllano i pulsanti rossi di stop relativi
* ALLE SOLE CORSIE PRONTE. Per fare questo è necessario "tenere memoria" delle
* corsie attive e di quelle non attive al momento della pressione del tasto
* start all'uscita dalla prima loop infinita. Questo si ottiene tramite il
* meccanismo delle "flag" che non sono altro che variabili booleane che vengono
* posizionate a "true" o "false" a seconda dello stato che vogliono significare.
* Al tuo programma ho aggiunto queste variabili (statoCorsia1, ...2, etc.) e il
* loro posizionamento.
* Ho aggiunto la gestione del led verde e della flag della prima corsia.
* Alle altre pensaci tu
*/
for (;;) { //inizio loop infinita scansione corsie //======istruzione aggiunta
val = digitalRead(BUTTON1); //======istruzione modificata
if (val == HIGH) { //il pulsante è rilasciato
lcd.setCursor(9,0);
lcd.print("PRONTA ");
digitalWrite(LEDVERDE1, HIGH); //======istruzione aggiunta
statoCorsia1 = true; //======istruzione aggiunta
}
if (val == LOW) { //il pulsante è premuto
lcd.setCursor(9,0);
lcd.print("NON ATTIVA");
digitalWrite(LEDVERDE1, LOW); //======istruzione aggiunta
statoCorsia1 = false; //======istruzione aggiunta
}
val = digitalRead(BUTTON2); //======istruzione modificata
if (val == HIGH) { //il pulsante è rilasciato
lcd.setCursor(9,1);
lcd.print("PRONTA ");
}
if (val == LOW) { //il pulsante è premuto
lcd.setCursor(9,1);
lcd.print("NON ATTIVA");
}
val = digitalRead(BUTTON3); //======istruzione modificata
if (val == HIGH) { //il pulsante è rilasciato
lcd.setCursor(9,2);
lcd.print("PRONTA ");
}
if (val == LOW) { //il pulsante è premuto
lcd.setCursor(9,2);
lcd.print("NON ATTIVA");
}
val = digitalRead(BUTTON4); //======istruzione modificata
if (val == HIGH) { //il pulsante è rilasciato
lcd.setCursor(9,3);
lcd.print("PRONTA ");
}
if (val == LOW) { //il pulsante è premuto
lcd.setCursor(9,3);
lcd.print("NON ATTIVA");
}
val = digitalRead(BUTTONSTART); //======istruzione aggiunta
if (val == LOW) { //======istruzione aggiunta
//è stato premuto il pulsante di start, si esce dalla prima loop infinita
break; //======istruzione aggiunta
}
} //FINE LOOP INFINITA SCANSIONE CORSIE //======istruzione aggiunta
//inizia il cronometraggio e la scansione del pulsante rosso delle SOLE corsie
//attive
}
Ciao,
P.