Cronometro particolare x gare di pattinaggio

Alcune osservazioni:

  • A mio avviso sarebbe meglio che le luci verdi si accendessero allo start, indicando l'inizio del cronometraggio e, come dici tu, solo per le corsie attive. Quelle non attive restano con le luci rosse accese- Ma se a te piace più come hai scritto va benissimo.
  • All'accensione il display potrebbe riportare lo stato delle corsie, esaminando il pulsante rosso. Le scritte potrebbero essere:
CORSIA 1 PRONTA
CORSIA 2 PRONTA
CORSIA 3 NON ATTIVA
CORSIA 4 PRONTA
  • Alla pressione del tasto start il display potrebbe diventare:
CORSIA 1 CRONOMETRO
CORSIA 2 CRONOMETRO
CORSIA 3 NON ATTIVA
CORSIA 4 CRONOMETRO
  • Alla pressione dell'ULTIMO tasto rosso attivo il display potrebbe diventare:
CORSIA 2 T= 1.07.023
CORSIA 4 T= 1.12.006
CORSIA 3 T= 1.13.786
CORSIA 1 NON ATTIVA

segnalando oltre al tempo anche l'ordine di arrivo.

Bene per la libreria. Ora prova a fargli scrivere sul display le righe all'inizio.

Poi devi scrivere un pezzetto di programma che testi lo stato del pulsante rosso e aggiorni la scritta sul display. Se il pulsante è premuto la prima riga deve essere

CORSIA n NON ATTIVA

Se il pulsante è rilasciato la prima riga deve diventare:

CORSIA n PRONTA

dove "n" è il numero della corsia.
La scritta deve cambiare dinamicamente, perché non è stato ancora premuto il pulsante di start

Buon lavoro.

Ciao,
P.

Ciao Pgiagno,
Allora per quel che riguarda le scritte di corsia, non ci sono problemi, ho scritto "CORSIA x - " che sarebbe la parte fissa. per la parte che cambia con la pressione del pulsante, non riesco a capire come scrivere il programma.

Adesso ci studio un po su e poi vi aggiorno!!!

Grazie

Ivan

per ora sto scrivendo cosi,
c'è un errore che non riesco a capire.....

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // 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 - ");

}
#define BUTTON 11
int  val = 0;
void setup() {
   if (val == HIGH) {
  pinMode(BUTTON, INPUT);
} 
void loop()
{
}

qualcosa sto sbagliando, ma non riesco neanche a capire come far cambiare stato ad una riga del display!!!!

Grazie

Ivan

big-ivan:
... ho scritto "CORSIA x - " che sarebbe la parte fissa. per la parte che cambia con la pressione del pulsante, non riesco a capire come scrivere il programma....

Bravo!

Per la scrittura della parte variabile devi considerare che puoi indirizzare il carattere da scrivere sul display così:

// scrittura in corsia 1, pulsante rosso rilasciato
  if (digitalRead(tasto0) == HIGH) {
    lcd.setCursor(9, 0);
    lcd.print("PRONTA    ");
  }
// scrittura in corsia 1, pulsante rosso premuto
  if (digitalRead(tasto0) == LOW) {
    lcd.setCursor(9, 0);
    lcd.print("NON ATTIVA");
  }

Per le corsie successive (tasto1, tasto2, tasto3) posizionerai il cursore in 9, 1 9, 2 9, 3.

Nota che la scritta "PRONTA " deve avere la stessa lunghezza della riga "NON ATTIVA" per coprirsi a vicenda.

Avanti così.

Ciao,
P.

Ci siamo sovrapposti.

Devi includere il tuo codice fra le chiavi [ code] e [ /code] che ottieni cliccando su </> del Preview.

Correggi il tuo post precedente e poi vediamo.

Ciao,
P.

Ti sottopongo alcune osservazioni prima delle correzioni. Sono osservazioni di "best practice"

  • Le definizioni (#define) e le variabili (val) mettile sempre PRIMA della parte void setup. In questo modo sono "visibili" da qualunque parte del tuo programma
  • I pinMode() conviene metterli all'inizio della sezione void setup

Altre osservazioni sugli errori:

  • Il pinMode del BUTTON va "ancorato" HIGH usufruendo del parametro INPUT_PULLUP
  • Non usare init() per lcd, usa begin().
  • Non "sprecare" spazi sul display, al posto di "CORSIA 1 - " basta "CORSIA 1 " altrimenti il tempo non riesci a scriverlo in 20 caratteri

Correggi così:

#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

#define BUTTON 11
int val;

void setup()
{
 pinMode(BUTTON, INPUT_PULLUP);
 lcd.begin();                      // 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 ");
}

void loop()
{
 val = digitalRead(BUTTON);
 if (val == HIGH) {         //il pulsante è rilasciato
   lcd.setCursor(0,9);
   lcd.print("PRONTA    ");
 }
 if (val == LOW) {          //il pulsante è premuto
   lcd.setCursor(0,9);
   lcd.print("NON ATTIVA");
 }
 //continuare per gli altri pulsanti e corsie
}

Ciao,
P.

Ciao Pgiagno,
Ho fatto il programma come mi hai detto tu, sostituendo init() con begin() per l'LCD, ma mi da errore e non me lo caricava. inserendo init, mi ha caricato il programma.
ho editato per scrivere nelle altre corsie, e ci sono riuscito senza problema, ma ho un dubbio:

all'inizio del listato, c'è settato il pulsante all'uscita 11, (start) ma non sono settati i pulsanti di stop. Per settarli, riscrivo lo stesso pezzo di programma, sostituendo 11 con le porte che userò, ma non riesco a capire come abbinarlo alla linea del display specifica.

Ciao e grazie

Ivan

ecco il programma:

#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

#define BUTTON 11
int val;

void setup()
{
 pinMode(BUTTON, INPUT_PULLUP);
 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 ");
}

void loop()
{
 val = digitalRead(BUTTON);
 if (val == HIGH) {         //il pulsante è rilasciato
   lcd.setCursor(9,0);
   lcd.print("PRONTA    ");
 }
 if (val == LOW) {          //il pulsante è premuto
   lcd.setCursor(9,0);
   lcd.print("NON ATTIVA");
 }

 val = digitalRead(BUTTON);
 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(BUTTON);
 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(BUTTON);
 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");
 }
 
}

>big-ivan: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

Ciao,
Chiedo scusa, ma ero convinto che il code fosse un comando del programma, invece era per il forum!!!

Scusate ancora

Grazie
Ivan

Ciao pgiagno,
Se hai tempo, riesci a mandarmi lo scema elettrico, che inizio ad assemblarlo?

Grazie
Ivan

Devi definire altri pulsanti e associarli ad altri pin, ad es. così:

#define BUTTON1 11 //pulsante stop corsia 1
#define BUTTON2 10 //pulsante stop corsia 2
#define BUTTON3 9 //pulsante stop corsia 3
#define BUTTON4 8 //pulsante stop corsia 4

e quindi devi modificare così le istruzioni

. . .
 val = digitalRead((BUTTON1);
. . .
 val = digitalRead((BUTTON2);
. . .
 val = digitalRead((BUTTON3);
. . .
 val = digitalRead((BUTTON4);
. . .

Per lo schema elettrico non ho problemi, ma devi dirmi tu a quali pin di Arduino collegherai i vari dispositivi.

Io ti avevo inviato un esempio, che qui ripeto

//Il layout è composto da:
//- 4 luci verdi connesse ai pin 2, 3, 4, 5
//- 4 luci rosse connesse ai pin 6, 7, 8, 9
//- 1 sirena connessa al pin 10
//- 4 pulsanti di stop connessi ai pin A0, A1, A2, A3
//- 1 pulsante (start) connesso al pin 11
//- 1 pulsante di reset
//- 1 display lcd i2c connesso ai pin A4, A5
//
//La configurazione è la seguente:
//- CORSIA 1 led verde al pin 2, led rosso al pin 6, pulsante di stop al pin A0
//- CORSIA 2 led verde al pin 3, led rosso al pin 7, pulsante di stop al pin A1
//- CORSIA 3 led verde al pin 4, led rosso al pin 8, pulsante di stop al pin A2
//- CORSIA 4 led verde al pin 5, led rosso al pin 9, pulsante di stop al pin A3

ma tu sei partito con #define BUTTON 11, quindi dammi anche le altre corrispondenze.

Devi anche dirmi cosa userai per le luci verdi e rosse. Se userai led con assorbimenti inferiori a 20mA per led non occorrono transistor buffer, altrimenti devo prevederli.

Ciao,
P.

Si hai ragione!!!
Per i led, pensavo di mettere dei classici bicolori sul pannello comandi e sulla periferica di start, e un led Jumbo da 10mm sulla scatola del pulsante di stop.

Grazie ancora
ivan

Ricapitolando:

  • Ho bisogno di sapere a quali pin di Arduino vuoi connettere led e pulsanti. Se ti vanno bene quelli che ti ho proposto io, lo schema elettrico è già pronto, se ne vuoi altri, dimmi quali e io lo correggo.

  • Ogni led consuma di suo dai 10 ai 20 mA. Metterne altri in parallelo sul pannello comandi può portare l'assorbimento da ogni pin vicino al massimo assoluto (che è 40 mA per pin), ma comunque si può far in modo da starci. Però la domanda è: se sul pannello comandi c'è già il display che indica: CORSIA 1 PRONTA oppure CORSIA 1 NON ATTIVA, ha senso mettere anche un led? comunque se ti piace si può fare.

  • Ho bisogno di sapere che led hai preso, per capire quanto assorbono. Se li hai presi online posta un link.

Ciao,
P.

Ciao Pgiagno

Si i pin che mi hai elencato tu vanno benissimo, non cambia nulla per quel che mi riguarda.
I led bicolori che ho preso sono questi:

Per la domanda perché sia sulla consolle di start che sulla periferica esterna, è solamente per vedere la corsia non arriva a colpo d’occhio, senza dover leggere sul display. Ma se ci sono problemi di assorbimento, li metto solo sulla periferica esterna.

Inoltre i led jumbo Rossi che ho preso per vedere se in corsia il pulsante è stato premuto, sono questi:

Grazie ancora
Ivan

P.s. Scusa la latitanza di questi giorni ma ero in montagna per le feste di Pasqua e la connessione è scarsa (e nella casa non ho Wi-Fi).

In allegato lo schema che, come ti dicevo era già pronto.

I led bicolori vanno bene (perché usati?). Ci sono da dimensionare alcuni componenti come le resistenze di limitazione. È necessaria una resistenza differente per il verde e per il rosso perché hanno tensioni di soglia differenti e quindi assorbimenti differenti. È necessario che ciascuna parte del led bicolore NON assorba più di 10-15mA. Valori fra 270 e 330 ohm dovrebbero andar bene.

È stato previsto anche un circuito antirimbalzo per il pulsante di stop. Non dovrebbe essere necessario, data la funzione one-shot del pulsante, ma il lungo cavo potrebbe raccogliere sporcizia elettromagnetica e falsare lo stop. Questa sarà la PRIMA prova da fare: stendere un cavo lungo quanto ti servirà e vedere come si comporta in vicinanza di frigorifero, lavastoviglie, lavatrice, lampade al neon (favolose all'accensione, queste). A questo proposito per i connettori ti volevo segnalare che è possibile usare queste spine e queste prese . Si trovano anche cavi di connessione già intestati. Hanno il pregio di avere 8 fili twistati 2 a 2. Se ne possono usare 4 per i segnali e 4 per GND ottenendo anche un'ottima protezione contro i disturbi.

Se i led ripetitori sulla console assorbissero troppo si può mettere un transistor buffer. Per cui è un problema che si può risolvere dopo.

Credo che i led jumbo che hai scelto ti deluderanno. A mio avviso hanno un fascio molto concentrato. Io li ho colorati con lo smalto da unghie. Sono diventati accettabili.

Puoi ignorare il circuito per la sirena.

Con il software come va? (ahi, ahi).

Ciao,
P.

P.S. Sto sperimentando una connessione radio fra la console e i terminali di corsia, alimentati da power bank. L'incognita è il consumo. Vedremo.

Ciao,
i led sono nuovi non so perchè è indicato "usato".........per lo schema elettrico ok, ma i led jumbo rossi, li metto in parallelo agli altri (parte rossa)?
Questi servono solo per sapere se il pulsante è stato premuto e che lo sto sia avvenuto, direttamente da bordo corsia.

per quel che riguarda il il collegamento wireless, il problema consumo non lo vedo molto ptoblematico, in quando potrei procurarmi delle batterie LiPo a 2s (7.4v) a buon prezzo e di vari amperaggi, e cabiarle nella pausa pranzo. (ho collaborato per anni con una azienda che produceva e rivendeva batterie LiPo per modellismo e industriali.

Leggendo la tua sperimentazione wireless, mi è venuto in mente............perchè se funziona il collegamento senza fili, non metterci un rilevatore IR per rilevare il passaggio e fare uno stop automatico? :slight_smile: :slight_smile: lo so lo so, l'appetito vien mangiando!!!!

Per quel che riguarda il software, ancora non ci ho messo mano, perchè non avevo preso in montagna non avevo con me nessun computer!!!
Adesso vedo di mettermici dietro e vedo di riuscire a scrivere il programma.

grazie

Ivan

Ciao,
ho provato a editare il sw....
adesso se chiudo a massa il pin 11, riesco a far cambiare stato alle scritte da "pronta" a "non attiva", ma cambiano su tutte e 4 le corsie.

#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

#define BUTTON 11
#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 LED 2 //led start corsia 1
#define LED 3 //led start corsia 2
#define LED 4 //led start corsia 3
#define LED 5 //led start corsia 4
#define LED 6 //led stop corsia 1
#define LED 7 //led stop corsia 2
#define LED 8 //led stop corsia 3
#define LED 9 //led stop corsia 4
int val;

void setup()
{
 pinMode(BUTTON, INPUT_PULLUP);
 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 ");
}

void loop()
{
 val = digitalRead(BUTTON);
 if (val == HIGH) {         //il pulsante è rilasciato
   lcd.setCursor(9,0);
   lcd.print("PRONTA    ");
 }
 if (val == LOW) {          //il pulsante è premuto
   lcd.setCursor(9,0);
   lcd.print("NON ATTIVA");
 }

 val = digitalRead(BUTTON);
 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(BUTTON);
 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(BUTTON);
 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");
 }
 
}

dove sto sbagliando?

guardando lo schema, hai inserito i bicolori nelle corsie, mentre i bicolori sono solo sulla consolle esterna, mentre in corsia con il pulsante c'è solo il led jumbo rosso.

ciao e grazie

Ivan

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.

Il nuovo schema elettrico.

Ciao,
P.

Ciao,
Ho guardato il listato, e oltre d aver capito come si assegnano le porte di ingresso dei pulsanti (non li avevo definiti), non sono riuscito ad accendere neanche un led, ma solo far andare i pulsanti di stop e reset. Se chiudo a massa il pulsante 11, non fa nulla.......................penso che manchi la parte di listato (millis) che fa partire il cronometraggio.
er quel che riguarda l'accensione dei led, ancora non ci ho capito nulla, ma ci studio un po sopra in questi gg.
Domenica vado a fare l'ultima gara di stagione (per questo tipo di gare, e vorrei portarmi la basetta da far vedere al comitato organizzativo (di cui farò parte nella stagione 2020), quindi dovrò studiare per bene i listati.

due cose, dato che ho un alimentatore stabilizzato da 5A da utilizzare, basta un 7805 in ingresso per portare la tensione a 5v?
Inoltre esiste un display sempre 20x4 ma di dimensioni più grandi?

grazie ancora

Ivan