Arduino Forum

International => Italiano => Generale => Topic started by: big-ivan on Mar 24, 2019, 09:00 pm

Title: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 24, 2019, 09:00 pm
Buonasera a tutti,
mi chiamo Ivan e sono nuovo di questo forum, anche se "pasticcio" con qualche componente elettronico, non conosco il mondo arduino, anche se ne ho sentito parlare molto bene, e questo ha fatto ciò che mi incuriosisse.
Faccio il dirigente per una società bolognese di pattinaggio artistico, e vorrei creare un cronometro per un tipo di gara (gimcane), in modo da non dover avere cronometristi e carta in giro per le piste, ma solo i giudici.

Mi chiedo se qualcuno è disposto ad aiutarmi a realizzare questo progettino, che per me da novizio sembra difficile, ma penso che pre voi sia uno scherzo.
Visto che queste gare si svolgono con 4 atleti alla volta (adesso diamo il via a voce e lo stop avviene quando l'atleta suona una campanella a fine prova), mi servirebbe un cronometro dove ci sia un pulsante per far partire tutti e quattro i timer e che accenda 4 luci verdi su ogni corsia, e 4 pulsanti (pensavo di usare i funghi rossi di emergenza con il blocco) che comandino lo stop della corsia di appartenenza accendendo una luce rossa che sta ad indicare l'avvenuto stop.
inoltre mi servirebbe anche un display dove vedere i tempi e poi trascriverli su excel.
il pulsante con il blocco, mi servirebbe che se il pulsante rimane schiacciato, quando do il via, vuol dire che la corsia è vuota e non calcoli il tempo.
I pulsanti con le luci rosso/vere possono essere distanti 10-15 mt dal cronometro.
Per la visualizzazione dei tempi pensavo ad un display tft da circa 4".

Grazie a chiunque possa aiutarmi, sia con la programmazione, sia su come costruire l'hardware e sopratutto cosa devo acquistare.

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: gpb01 on Mar 24, 2019, 09:03 pm
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 24, 2019, 11:43 pm
Ciao, e benvenuto.

Ci serve qualche notizia in più.

1) Penso che alla pressione dell'unico pulsante di start debba corrispondere un segnale sonoro. Occorre prevedere anche un altoparlante o un clackson di opportuna potenza.

2) La distanza delle lampade da Arduino non è un problema. È critica la distanza dei pulsanti di start e di stop. Non si possono collegare semplicemente ai pin, ma occorre prendere provvedimenti antidisturbo per scongiurare false partenze (pulsante di start) o falsi arrivi (pulsante di stop).

3) Non ho capito cosa significa: "...che se il pulsante rimane schiacciato, quando do il via, vuol dire che la corsia è vuota e non calcoli il tempo...". Hai intenzione di utilizzare pulsanti senza molla di ritorno? Ti ritroveresti a doverli riarmare o controllare il riarmo prima di ogni gara successiva. Ci sono metodi più semplici per considerare nullo il tempo.

4) Per la visualizzazione dei tempi molto meglio un display lcd 4 righe x 20 caratteri

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 25, 2019, 07:28 am
ciao e grazie per le risposte.
allora, il pulsante di start, lo aziona lo starter, quindi in giuria davanti al display.

i pulsanti di stop, invece sono lontani 10-15mt dalla giuria in corsia.

grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 25, 2019, 07:36 am
per la domanda 3,
si devo trovare il sistema di non cronometrare quando in corsia non c'è nessuno. mi va bene anche un pulsante vicino ad arduino, in modo da non far partire il tempo, cosi chi è in giuria sa che la corsia era vuota (oltre a vederla).
Il discorso di riarmarlo tutte le volte, era per una conferma di start.
Stasera se volete vi faccio uno schema di come sono disposte le corsie e come mi servirebbe tutto il sistema di cronometraggio.

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 25, 2019, 08:05 am
Devi cominciare a fare una prova.

Procura un Aruino Nano (ad es. questo (https://www.ebay.it/itm/Nano-V3-microcontrollore-Atmega328p-Compatibile-Arduino-CH340G-Contatti-saldati/182557978962?hash=item2a814db152:g:UGMAAOSwiehclMT6))
Procura un pulsante di start (ad es. questo (https://www.ebay.it/itm/Pulsante-da-pannello-contatto-a-saldare-tasto-nero-Cod-1902542/263495600729?hash=item3d598fca59:g:JD8AAOSw~65cYeYh))
Procura un pulsante di stop (ad es questo (https://www.ebay.it/itm/pulsante-stop-emergenza-rosso/153418846975?hash=item23b879d2ff:g:qIwAAOSwWUlauP~x))
Procura un led e una resistenza con un valore da 220 a 470 Ohm (vanno tutte bene)

Se, come hai descritto nella tua presentazione, "pasticci in elettronica" dovresti già avere breadboard, cavetti di connessione, saldatore, etc.

Per cominciare con Arduino devi caricare l'IDE sul tuo PC come descritto qui (https://www.arduino.cc/en/Guide/HomePage) e poi leggiti tutto quello che ti viene suggerito nella pagina.

Quando avrai il materiale in mano, comincerai il primo esperimento: far accendere un led con il pulsante di start e farlo spegnere con il pulsante di stop.

In seguito procurerai altro materiale (luci definitive con conseguenti relè di pilotaggio, altri pulsanti di stop, alimentatori, display lcs 20x4 I2C, etc)

Il problema del non conteggio del tempo in una o più corsie si può risolvere con un interruttore per ogni corsia, posto vicino ad Arduino, in parallelo al relativo pulsante di stop. Ci pensiamo dopo.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 25, 2019, 09:21 am
Per adesso grazie. Mi procuro il tutto e poi iniziò con le prove. No ho una breadbord, ma uso una comune basetta millefori.
Grazie per i suggerimenti


Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 25, 2019, 09:39 am
... non ho una breadbord, ma uso una comune basetta millefori..
Ti consiglio caldamente di procurarti anche questa (https://www.ebay.it/itm/Piastra-sperimentale-830-punti-breadboard-ART-AT02/230874407387?hash=item35c12fe1db:g:3tUAAOSwi0RXxCXw) e questi (https://www.ebay.it/itm/65-ponticelli-flessibili-jumper-breadboard-arduino-ART-AS03/230853085160?hash=item35bfea87e8:g:3A0AAOSw3xJVXI2F).

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 25, 2019, 02:00 pm
Ciao,
Ho acquistato tutto quello che mi hai indicato e anche il display. Appena arriva il tutto, inizio il lavoro.
Per l'alimentazione, 5A dovrebbero essere sufficienti giusto?

Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 25, 2019, 05:57 pm
Il consumo maggiore sarà dovuto alle lampade di segnalazione, che, ovviamente, non potranno essere dei piccoli led. Se hai già in mente che lampade usare si può calcolare il consumo e vedere se l'alimentatore è OK.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Datman on Mar 26, 2019, 12:55 pm
Ciao, Ivan.

Considera che per il microcontrollore ti basteranno alcune decine di milliampere (facciamo 100mA) a 5V. Con le uscite a 5V comanderai dei mosfet "logic level" (dei transistor per accendere lampade abbastanza potenti vogliono un po' di corrente sulla base; se ci devi mettere dei darlington, allora usa i mosfet!) di opportuna potenza per le segnalazioni, alimentate a tensione più alta per ridurre la corrente necessaria. Per evitare problemi di sicurezza (non solo qui nel forum, ma anche con il cavo che porterai) puoi scegliere 24V o 12V (ma anche 48V, se trovi le segnalazioni a quella tensione). Tieni presente che una lampadina a freddo assorbe circa 10 volte la corrente nominale! Potresti anche usare dei LED da qualche Watt del colore che preferisci, riducendo di 10 volte la corrente necessaria, in un contenitore con un coperchio trasparente.

Considera anche la responsabilità che avrai sulla precisione dei tempi. Se verranno usati solo localmente, il problema della responsabilità sarà ridotto, in quanto i tempi non dovranno essere confrontati con quelli di altri cronometri.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 27, 2019, 12:21 am
Ciao Darman,
grazie per le risposte, il cronometro sarà usato localmente, e non confrontato con altri. anche se confrontato, penso che un ipotetico minuto di manches, ci sia uno scarto minimo (qualche centesimo?).
per quel che riguarda le luci, inizialmente avevo pensato a delle luci verticali, tipo quelle delle macchine utensili, ma ho abbandonato l'idea, perchè devo alimentarle a 24 o 48v.
allora ho pensato di mettere dei led da 10mm nei tre lati della scatola che porterà anche il fungo di stop, cosi sono visibili sia da inizio corsia, che dalla giuria.

grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Datman on Mar 27, 2019, 08:24 am
Per ottenere una precisione accettabile, per il clock devi usare un quarzo. Se monti il microcontrollore su millefori, puoi farlo senza problemi. Potresti addirittura metterci un compensatore per la regolazione fine della frequenza.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 27, 2019, 09:51 am
... il cronometro sarà usato localmente, e non confrontato con altri. anche se confrontato, penso che un ipotetico minuto di manches, ci sia uno scarto minimo (qualche centesimo?)....
Se gli "altri" cronometraggi sono manuali ci saranno sicuramente delle differenze. Considera che lo start e lo stop "manuali" possono avere intrinsecamente una imprecisione di 1/20 di secondo. Considera che Arduino farà partire il tempo nello stesso istante per tutti e quattro i concorrenti

...allora ho pensato di mettere dei led da 10mm nei tre lati della scatola che porterà anche il fungo di stop, cosi sono visibili sia da inizio corsia, che dalla giuria...
Non so che led intendi usare. Quelli che conosco io, anche se hanno un diametro di 10mm hanno il chip interno identico a quelli da 3 e 5mm e non fanno una luce molto diffusa. Se la luce la deve vedere solo il concorrente vanno bene. Se la luce la deve vedere anche la giuria puoi mettere dei led "ripetitori" sul pannello di comando. Se la luce la deve vedere anche il pubblico dovrai prevedere qualcosa di più potente, e quindi alimentato almeno a 12V.

Dovresti anche cominciare a pensare al flusso del programma. Ad es:
- Condizioni iniziali: luci rosse accese (come in formula uno). Sul lcd 20x4 compare la scritta "PRONTI". A voce il "pronti"
- Pressione del pulsante di start: le luci rosse si spengono, Suona per 0,1 secondi un segnale sonoro. Parte il cronometraggio contemporaneo delle quattro corsie. Sul lcd compare la scritta "PARTITI"
- Via via che i concorrenti premono il pulsante rosso, sul lcd compare la scritta "CORSIA n T= m,ss,dc"
etc.

Questo è SOLO un esempio, il progettista sei tu. Puoi aggiungere il funzionamento di quattro interruttori sul pannello di controllo per disabilitare il cronometraggio sulla/e corsia/e non occupata/e, Un altro pulsante per un altro segnale sonoro prolungato per eventuali false partenze... e così via.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 27, 2019, 07:37 pm
Per ottenere una precisione accettabile, per il clock devi usare un quarzo. Se monti il microcontrollore su millefori, puoi farlo senza problemi. Potresti addirittura metterci un compensatore per la regolazione fine della frequenza.
partiamo con una cosa semplice, gia brancolo un po nel buio, se ci mettiamo anche i quarzi,  mi abbuio del tutto!! :)

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 27, 2019, 09:04 pm
Se gli "altri" cronometraggi sono manuali ci saranno sicuramente delle differenze. Considera che lo start e lo stop "manuali" .....
Ciao,
Siamo sulla stessa sintonia, hai esposto quasi la mia idea!!!
unica cosa che io utilizzerei il rosso per lo sto del tempo, da far rimanere acceso fino a che non si "riarma" il pulsante (senza utilizzare interruttori in parallelo). una volta riarmato, si accende la luce verde per tutto il tempo di gara. Il via solitamente viene dato a voce, ma una mini sirena non mi dispiacerebbe!!!
Per il resto, questo sistema NON verrà utilizzato in parallelo con quello manuale!!!

Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: gpb01 on Mar 27, 2019, 09:47 pm
>big-ivan: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia ;)

Ho editato io il tuo post :)

Guglielmo
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 27, 2019, 10:46 pm
...unica cosa che io utilizzerei il rosso per lo stop del tempo, da far rimanere acceso fino a che non si "riarma" il pulsante (senza utilizzare interruttori in parallelo). ...
Ne deduco che vuoi utilizzare pulsanti di stop SENZA molla di ritorno, cioè con DUE posizioni stabili: PREMUTO, RILASCIATO.

...una volta riarmato, si accende la luce verde per tutto il tempo di gara....
Non ho capito. Puoi fare una descrizione per passi di quello che dovrebbe fare il tuo programma, altrimenti non capisco.
Provo a cominciare io, correggimi dove sbaglio:
- Situazione iniziale: pulsanti di stop RILASCIATI (riarmati); luci rosse spente, luci verdi spente.
- Pressione pulsante start: luci verdi accese, breve suono sirena (altoparlante), partenza cronometraggio quattro corsie.
- Pressione pulsante stop di una corsia: spegnimento luce verde; accensione luce rossa; stop cronometraggio; scrittura numero corsia e tempo su display 20x4
- Situazione finale: pulsanti stop PREMUTI; luci rosse accese; corsie e tempi sul display 20x4

A questo punto, siccome vuoi i pulsanti SENZA molla di ritorno, qualcuno deve recarsi presso i pulsanti e metterli nella posizione RILASCIATO (riarmarli). Me lo confermi? Il progettista sei tu, però mi sembra scomodo.

Dovrai poi prendere in considerazione le situazioni anomale: false partenze ed esclusione di una o più corsie, tanto per cominciare.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 29, 2019, 12:49 am
>big-ivan: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia ;)

Ho editato io il tuo post :)

Guglielmo
CHiedo scusa, è un po di tempo che non uso un forum e non ho più l'abitudine.

Scusate ancora.

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 29, 2019, 12:59 am
- Situazione iniziale: pulsanti di stop RILASCIATI (riarmati); luci rosse spente, luci verdi spente.
- Pressione pulsante start: luci verdi accese, breve suono sirena (altoparlante), partenza cronometraggio quattro corsie.
- Pressione pulsante stop di una corsia: spegnimento luce verde; accensione luce rossa; stop cronometraggio; scrittura numero corsia e tempo su display 20x4
- Situazione finale: pulsanti stop PREMUTI; luci rosse accese; corsie e tempi sul display 20x4
Ciao,
esattamente così!!
il fatto di riarmare i pulsanti, non mi preoccupa, in quanto ad ogni partenza oltre all'atleta, c'è sempre un accompagnatore/allenatore a inizio corsia.
Per quel che riguarda le false partenze, essendo ancora una gara Ludica, il decimo di secondo, non è rilevante, in quanto ci sono slalom e difficoltà che  sono molto più selettive che la partenza.
per l'annullamento della corsia, secondo me è sufficiente che se in corsia il pulsante non è rilasciato, quando si da lo start, questo non fa partire il cronometro.
non so come caricare un video, altrimenti vi farei vedere come si svolge.

Grazie ancora

Ivan


P.S. oggi ho recuperato la Breadbord, sono arrivati i Jumper. mi auguro che domani arrivi altro, cosi da iniziare nel We.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 29, 2019, 01:23 am
ho trovato su youtube un vecchio video, ma fa vedere esattamente come si svolgono queste gare, cosi da aggiungere qualche info.

https://www.youtube.com/watch?v=EC_SjTsa0Pw (https://www.youtube.com/watch?v=EC_SjTsa0Pw)

Ho anche letto su questo forum, che utilizzando il clock interno di arduino, il cornometro non è molto preciso, quindi anche se omplicato dovrò seguire la strada del quarzo, per una maggiore accuratezza (ormai che lavoro, lo faccio bene!!!)

Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: maubarzi on Mar 29, 2019, 08:46 am
Personalmente vedo due aspetti potenzialmente critici su cui fare qualche riflessione:
1) L'uso di cavi stesi a terra per collegare il tutto, potrebbero far inciampare gli/le atleti/te. Anche se fai percorsi obbligati c'è sempre quello che taglia e prende strade inesplorate...
2) L'uso di collegamenti wireless, richiede una analisi ed eventuale protezione dai disturbi elettromagnetici, con tutta la gente attorno potrebbero non essere trascurabili e mandare in tilt il sistema. Magari questo è un problema poco probabile, chi è più esperto di me potrà smarcare meglio la cosa, ma se il problema fosse statisticamente rilevante potresti avere il cronometraggio che salta all'improvviso solo perchè entra uno con una radiolina guasta o un cellulare difettoso.

EDIT:
Ok, aspetti già valutati. Perfetto.
[Rispondo qui al post seguente per non aggiungere sporco inutile]
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 29, 2019, 01:33 pm
Ciao Maubarzi,
Avevamo pensato di alzarci fino a 2.50mt e far passare i cavi in alto, quattro pali portapulsanti, con sopra i relativi fili, che poi convergono in una palo unico dove c'è la giuria. Il cavo sarà lungo circa 20 Mt.
Avevo anche io pensato che il wireless avrebbe potuto aver disturbi da tutti i segnali presenti.

Ciao e grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 29, 2019, 01:42 pm
Buongiorno a tutti,
Oggi è arrivato Arduino mini e anche il display.
Se mi indicate come collegare il tutto, inizio le prove. Inoltre ho già scaricato il programma per caricarci le stringhe di programma.

Grazie
ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 29, 2019, 11:16 pm
Ok. Spero che tu per Arduino mini intenda Arduino NANO

Ho bisogno dei link ai prodotti che hai acquistato. Mi interessano i pulsanti e soprattutto il display 20x4 che DEVE essere con interfaccia I2C.

Per cominciare a lavorare con il display puoi cominciare a leggerti questo (http://www.brescianet.com/appunti/Elettronica/Arduino/corso/Esempio_DISPLAYLCD2.htm).

Dicci anche che pulsanti di stop intendi usare e come lavorano (normalmente chiusi = NC, o normalmente aperti = NO), perché ce ne sono di tipi diversi e influiranno sul programma.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 29, 2019, 11:26 pm
...Ho anche letto su questo forum, che utilizzando il clock interno di arduino, il cornometro non è molto preciso...
Per quello che devi fare il clock dell'Arduino Nano è basato su un quarzo da 16 MHz con una precisione più che sufficiente per i tuoi scopi se, come hai detto, la gara dura al massimo qualche minuto. Inoltre per come sarà fatto il programma la precisione sarà identica per tutte e quattro le corsie.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 30, 2019, 12:02 am
Ciao Pgiagno,

l'arduino Nano é questo (l'ho preso da link che mi avevi mandato):
https://www.ebay.it/itm/Nano-V3-microcontrollore-Atmega328p-Compatibile-Arduino-CH340G-Contatti-saldati/182557978962?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649 (https://www.ebay.it/itm/Nano-V3-microcontrollore-Atmega328p-Compatibile-Arduino-CH340G-Contatti-saldati/182557978962?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649)

Il Display è questo:
https://www.ebay.it/itm/DISPLAY-LCD-20x4-2004-ARDUINO-RETROILLUMINATO-LED-BLU-MODULO-SERIALE-IIC-I2C/223196656649?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649 (https://www.ebay.it/itm/DISPLAY-LCD-20x4-2004-ARDUINO-RETROILLUMINATO-LED-BLU-MODULO-SERIALE-IIC-I2C/223196656649?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649)

Per i pulsanti di stop, pensavo di utilizzare un NO (normalmente aperto), cosi da far chiudere il contatto allo stop. (se rimane premuto non riparte il cronometraggio nella manches sucessiva).
Il pulsante di start li ho presi dove me li hai indicati, e non sono ancora arrivati, ma credo che siano dei comunissimi NO.

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 30, 2019, 08:16 am
Bene il Nano e il display. Puoi cominciare a sperimentare nel link che ti ho dato. Usa l'Arduino Nano al posto dell'Arduino UNO.

Per il pulsante di stop va bene il NO, ma cerca il modello che vuoi acquistare e posta il link. Devi accertarti che sia un modello con DUE stati stabili.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 30, 2019, 06:02 pm
Ciao,

il pulsante rosso che ho preso è questo, ma penso che qualsiasi pulsante NO con blocco vada bene...

https://www.ebay.it/itm/Interruttore-di-arresto-di-emergenza-1NO-1NC-Fungo-rosso-DPST-660V-10A-T9K9-K2T2/253247212079?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649 (https://www.ebay.it/itm/Interruttore-di-arresto-di-emergenza-1NO-1NC-Fungo-rosso-DPST-660V-10A-T9K9-K2T2/253247212079?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649)

altra domanda, stavo pensando di mettere dei connettori a vite per periferiche (scatola con led e pulsanti di stop), a quanti contatti li devo pendere?
Stavo pensando a questi, (anche perchè in officina ne ho e li uso regolarmente)

https://www.ebay.it/itm/CONNETTORE-6-VIE-TENUTA-STAGNA-KIT-SUPERSEAL-MASCHIO-FEMMINA-X-AUTO-MOTO-NAUTICA/162021983161?hash=item25b94343b9:g:zdUAAOSwBnVW-lHr (https://www.ebay.it/itm/CONNETTORE-6-VIE-TENUTA-STAGNA-KIT-SUPERSEAL-MASCHIO-FEMMINA-X-AUTO-MOTO-NAUTICA/162021983161?hash=item25b94343b9:g:zdUAAOSwBnVW-lHr)

cosi posso fare dei cavi da 10mt e se devo allungare ultriormente il cavo, lo posso fare tranquillamente, cosi anche se devo cambiare una scatola con il pulsante in caso di rottura del fungo, ho una connessione.

Ciao
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 30, 2019, 06:38 pm
Pensavo anche di mettere un secondo pulsante (in parallelo) di start in una scatolina a parte  oltre che nel case sul tavolo giuria. la lunghezza del filo non credo che sia influente se sto sotto il metro? potrei metterci anche dei led bicolori cosi chi da lo start con il "comando esterno" può vedere se i pulsanti sono riarmati!!!!

Sto ampliando un po troppo il progetto :O :O

Ciao
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Mar 30, 2019, 08:45 pm
...il pulsante rosso che ho preso è questo---
Il pulsante va bene purché abbia DUE posizioni STABILI. Controlla con un tester che a pulsante premuto il contatto NO si chiuda E RESTI CHIUSO e che a pulsante rilasciato (riarmato) il contatto NO si apra E RESTI APERTO.

...stavo pensando di mettere dei connettori a vite per periferiche (scatola con led e pulsanti di stop), a quanti contatti li devo pendere?
Stavo pensando a questi, (anche perchè in officina ne ho e li uso regolarmente)...
Io sono rimasto al punto in cui ciascuna scatola con led e pulsanti di stop contiene un led verde (ce ne potrebbero essere più in parallelo), un led rosso (ce ne potrebbero essere più in parallelo) e un pulsante di stop. Occorre quindi: 1 conduttore comando led verde; 1 conduttore comando led rosso; 1 conduttore per pulsante di stop; 1 conduttore per Vcc; 1 conduttore per ground. Totale 5 contatti. Sulla scatola di comando dovranno trovar posto quattro connettori a 5 conduttori, uno per ognuna delle 4 scatole con led e pulsante di stop. A seconda di come comanderai i led potrebbero bastare 4 contatti (mancherebbe il Vcc).

Pensavo anche di mettere un secondo pulsante (in parallelo) di start in una scatolina a parte  oltre che nel case sul tavolo giuria. la lunghezza del filo non credo che sia influente se sto sotto il metro? potrei metterci anche dei led bicolori cosi chi da lo start con il "comando esterno" può vedere se i pulsanti sono riarmati!!!!
L'appetito vien mangiando eh?
Sì, si può fare. Considera che dovrai portare a questa scatola ben 11 conduttori: 4 per comando led verdi; 4 per comando led rossi; 1 per Vcc; 1 per GND; 1 per pulsante di start.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Mar 31, 2019, 09:41 pm
ebbene si, l'appetito vien mangiando!!!!!

Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 04, 2019, 10:25 pm
Buonasera, rieccomi dopo qualche gg, di stop per via del lavoro.
Ho collegato il display e si illumina, ho i pulsanti di start, adesso devo caricare un programma giusto?

Come collego i pulsanti e i led?

CIao
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 06, 2019, 12:06 am
Comincerei con cercare di scrivere qualcosa sul display.

Negli esempi allegati alla libreria LiquidCrystal_I2C.h ce n'è uno intitolato "HelloWorld". Provalo e vedi se il display, oltre che illuminarsi, funziona.

Nel frattempo, dato che il tuo progetto mi intriga parecchio, ho messo su un layout di prova, con led bicolori e pulsanti vari. Ho intenzione di seguirti su questo progetto e portarti a meta. Io ho organizzato pulsanti e led così:
- 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
- sirena di start al pin 10
- pulsante di start al pin 11

Ovviamente i led sono tutti connessi attraverso una resistenza da 270 ohm.

Appena ho tempo ti metto lo schema elettrico completo.

Per il programma, dimmi da 1 a 10 quanto sei bravo a programmare in C++ (non scherzare, perché non forniamo pappa pronta ma solo cibo di consistenza adatta ai tuoi denti)

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 07, 2019, 01:08 pm
Ciao Pgiagno,

Sono molto lusingato che il progetto ti intrighi!!! purtroppo di programmazione C++ non so proprio nulla, l'ultima volta che ho provato a fare un programmino semplice avrò avuto 15 anni, con il Commodore 64!!!!!
 non voglio un programma già fatto, vorrei capire come digitare le stringhe di programmazione, e sopratutto capire il motivo di tale stringa. ho visto qua sul forum vari esempi di stringhe e non ci ho capito molto.

Per quel che riguarda la programmazione (so che è una domanda da stupidi) attacco la classica USB (quella che uso anche per alimentare il Nano) al computer (imac) per caricare la stringa di programma giusto?

Ciao e grazie ancora


Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 07, 2019, 01:36 pm
ciao, ho provato a caricare "hello world", ma mi da un messaggio di errore

Arduino:1.8.9 (Mac OS X), Scheda:"Arduino/Genuino Uno"

HelloWorld:5:31: error: LiquidCrystal_I2C.h: No such file or directory
compilation terminated.
exit status 1
LiquidCrystal_I2C.h: No such file or directory

cosa sto sbagliando?

Grazie

Ivan

Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Datman on Apr 07, 2019, 05:22 pm
Manca la libreria :-)
Scaricala e installala!
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 07, 2019, 08:10 pm
Vai a questo indirizzo
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library (https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library)
Segui le istruzioni del file README.md
Oppure:
Vai su:
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library (https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library)
Clicca sul bottone verde: Clone or Download
Ti verrà scaricata da qualche parte (su Linux in "Scaricati") la libreria LiquidCrystal_I2C-1.1.2.zip
Vai sul IDE di Arduino. Clicca su: Sketch -> #include libreria -> Aggiungi libreria da file .ZIP
Ti si apre una pagina da cui selezionare la libreria appena scaricata. L'IDE di Arduino dovrebbe fare tutto da solo e installare la libreria.
Chiudi l'IDE e riaprilo. Poi riprova a lanciare l'esempio.

Tutte le periferiche I2C (e il display che hai è una di queste) vengono comandate da due soli pin di Arduino (A4 e A5). Ogni periferica ha cablato un "indirizzo" di default differente. In generale i display hanno indirizzo 0x27 (è il primo parametro che fornisci al momento in cui istanzi l'oggetto LiquidCrystal_I2C e lo chiami lcd alla riga 5). Se il programma ancora non funziona significa che il display ha un indirizzo differente. Puoi provare con 0x3F (l'ho trovato su un display 16x2). Se non funziona ancora ti fornisco uno scanner che trova l'indirizzo. Ma 0x27 in generale funziona.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 07, 2019, 08:40 pm
Per cominciare con Arduino questo (http://www.iiscrocetticerulli.gov.it/Documenti/Formazione_Docenti/Formazione_Ambito_5_Teramo_2/2017_06_29_Manuale_di_Arduino.pdf) manuale mi è sembrato molto buono.

Penso che ogni programma debba PRIMA essere descritto in italiano e DOPO in C++. Quindi COMUNQUE dovrai descrivere il funzionamento di quello che vuoi ottenere. Dopo penseremo al C++.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 10, 2019, 10:53 pm
Buonasera,

ecco il funzionamento:
Circuto Alimentato

Pulsanti Stop rilasciati (contatto aperto) - led verdi su consolle comando e corsie accesi - led rossi spenti

Start da consolle di comando o base - led verdi spenti - Led rossi spenti

Inizio cronometraggio su tutte le 4 corsie

Pulsante Corsia 1 premuto (contatto chiuso) - Led verde spento e led rosso acceso

Stop cronometraggio corsia 1

Pulsante Corsia 2 premuto (contatto chiuso) - Led verde spento e led rosso acceso

Stop cronometraggio corsia 2

Pulsante Corsia 3 premuto (contatto chiuso) - Led verde spento e led rosso acceso

Stop cronometraggio corsia 3

Pulsante Corsia 4 premuto (contatto chiuso) - Led verde spento e led rosso acceso

Stop cronometraggio corsia 4

Pronti per nuova sessione di cronometraggio

Rilasciare i pulsanti di stop

Variabile

Pulsante di stop NON rilasciato (contatto chiuso) - Led verde spento - led rosso acceso

Start da consolle di comando o base

Il cronometraggio non parte nella corsia dove il pulsante sto non è rilasciato

per quel che riguarda il display,
non riesco a caricare la libreria!!!!
sto litigando ma non mi arrendo.

Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 10, 2019, 11:11 pm
Ciao
Finalmente ho capito come caricare la libreria!!!!!

Adesso sono riuscito a far scrivere quello che voglio sul display......:) :)

Grazie ancora

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 11, 2019, 05:14 pm
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:
Code: [Select]
CORSIA 1 PRONTA
CORSIA 2 PRONTA
CORSIA 3 NON ATTIVA
CORSIA 4 PRONTA

- Alla pressione del tasto start il display potrebbe diventare:
Code: [Select]
CORSIA 1 CRONOMETRO
CORSIA 2 CRONOMETRO
CORSIA 3 NON ATTIVA
CORSIA 4 CRONOMETRO

- Alla pressione dell'ULTIMO tasto rosso attivo il display potrebbe diventare:
Code: [Select]
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
Code: [Select]
CORSIA n NON ATTIVA

Se il pulsante è rilasciato la prima riga deve diventare:
Code: [Select]
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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 13, 2019, 09:35 am
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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 13, 2019, 10:02 am
per ora sto scrivendo cosi,
c'è un errore che non riesco a capire.....
Code: [Select]

#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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 13, 2019, 10:20 am
... 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ì:

Code: [Select]

// 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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 13, 2019, 10:24 am
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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 13, 2019, 10:48 am
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ì:

Code: [Select]

#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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 17, 2019, 11:31 pm
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:
Code: [Select]

#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");
 }
 
}
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: gpb01 on Apr 18, 2019, 06:25 am
>big-ivan:   ti ricordo che in conformità al regolamento (http://forum.arduino.cc/index.php?topic=149082.0), 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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 18, 2019, 07:34 am
Ciao,
Chiedo scusa, ma ero convinto che il code fosse un comando del programma, invece era per il forum!!!

Scusate ancora

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 18, 2019, 07:40 am
Ciao pgiagno,
Se hai tempo, riesci a mandarmi lo scema elettrico, che inizio ad assemblarlo?

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 18, 2019, 09:09 am
Devi definire altri pulsanti e associarli ad altri pin, ad es. così:

Code: [Select]
#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

Code: [Select]
. . .
 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

Code: [Select]
//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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 19, 2019, 01:51 pm
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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 19, 2019, 11:11 pm
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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 24, 2019, 01:59 pm
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:

https://rover.ebay.com/rover/0/0/0?mpre=https%3A%2F%2Fwww.ebay.it%2Fulk%2Fitm%2F303124273022

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:

https://rover.ebay.com/rover/0/0/0?mpre=https%3A%2F%2Fwww.ebay.it%2Fulk%2Fitm%2F291289349029

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).
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 24, 2019, 03:18 pm
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 (https://www.ebay.it/itm/Connettore-RJ45-Spina-8-pin-a-crimpare/281280352728?hash=item417d9d91d8:g:4G8AAOxyni9TGMPh)  e queste prese (https://www.ebay.it/itm/Presa-modulare-da-pannello-rj45-orizzontale-poli-8p8c-2531-01-nero-lumberg/183729448313?hash=item2ac720e579:g:IpcAAOSwwnVcijvP)  . 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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 24, 2019, 09:50 pm
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? :) :) 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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 24, 2019, 10:28 pm
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.

Code: [Select]

#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
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 25, 2019, 08:31 am
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.

Code: [Select]

#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.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 25, 2019, 11:06 am
Il nuovo schema elettrico.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 25, 2019, 05:36 pm
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


Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 25, 2019, 06:40 pm
oltre ad aver capito come si assegnano le porte di ingresso dei pulsanti

Bene, bravo.

Se chiudo a massa il pulsante 11, non fa nulla...penso che manchi la parte di listato (millis) che fa partire il cronometraggio

Esatto! Cerca di imbastirla, poi ti aiuto. Manca anche quella successiva di test dei pulsanti rossi, cha sarà un'altra loop infinita (for ( ; ; )) che terminerà quando il pulsante rosso dell'ULTIMA CORSIA ATTIVA sarà stato premuto. A quel punto i valori cronometrati verranno scritti sul display e il programma verrà fermato in attesa di un reset.

Per quel che riguarda l'accensione dei led, ancora non ci ho capito nulla

I led bicolori come i tuoi hanno tre terminali: uno per il colore rosso, uno per il colore verde e uno comune (catodo) per la massa (GND). Per accenderli occorre collegare il terminale centrale più lungo al meno dell'alimentazione. Poi si prende una resistenza con un valore compreso fra 270 e 470 ohm e la si mette in serie fra il più dell'alimentatore a 5V e uno dei due altri terminali. A questo punto, se il diodo funziona ed è a catodo comune, il diodo si accenderà di rosso o di verde a seconda del terminale che hai alimentato. Già che ci sei controlla con un milliamperometro (lo sai usare, vero?) quanta corrente assorbono con la resistenza che ci metti. Per avere circa la stessa corrente assorbita dal led verde e dal led rosso dovrai mettere due resistenze di valore diverso, perché i due led hanno tensioni di soglia differenti.

Per farli accendere da un pin dell'Arduino colleghi il terminale centrale comune (catodo) a GND e la resistenza al pin prescelto, inizializzato come OUTPUT. Con il comando "digitalWrite(pin, HIGH);" accendi il led, con il comando "digitalWrite(pin, LOW);" lo spegni.

dato che ho un alimentatore stabilizzato da 5A da utilizzare, basta un 7805 in ingresso per portare la tensione a 5v?

Suppongo che il tuo alimentatore stabilizzato sia da 12V. Lo schema che ti ho dato prevede un'alimentazione da 7 a 9V nel pin VIN per non stressare l'Arduino (che sopporta [male] anche il 12V sul pin VIN). Il pin VIN necessita di ALMENO 7V per far funzionare l'Arduino e gli eventuali led attaccati ai suoi pin. Puoi alimentare il tutto DIRETTAMENTE dal pin 5V con un 7805 montato su una piccola aletta di raffreddamento, con all'ingresso un elettrolitico da 100uF 16Vl in parallelo a un ceramico da 100nF e un elettrolitico da 10uF 16Vl più ceramico da 100nF all'uscita. Fa' attenzione a non sbagliare, il 5V NON è protetto da inversioni di polarità.

esiste un display sempre 20x4 ma di dimensioni più grandi?

Non conosco altri display 20x4 più grandi. Occorre passare a display grafici, ma cambiano sia il prezzo che la gestione.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 25, 2019, 10:07 pm
sono riuscito (dopo aver stampato il listato) a vedere cosa andava fatto per i led, modificando le stringhe che mi avevi dato d'esempio e modificandole in base all'uscita di accensione e di corsia.

Per l'accensione del led, devo comprare le resistenze, cosa che se non le prendo online, devo andare per forza a Bologna, perchè da noi non ci sono più negozi.
per quel che riguarda la funzione cronometro (millis), ho trovato qualcosa in rete, ma non sono riuscito a capire dove modificarlo, per fa scrivere minuti e secondi.

questo è quello che ho trovato online.........sulle pagine di Daniele Alberti
Code: [Select]

#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
int pinpuls1 = 10;
int pinpuls2 = 11;
int statopuls1;
int statopuls2;
unsigned long tempo_base;
unsigned long tempo_cronometrato = 0;
unsigned long tempo_congelato;
unsigned long temposec;
int flag = 1;
void setup()
{
  delay(1000);
  lcd.begin(16, 2);
  lcd.setRGB(255, 255, 255);
  lcd.setCursor(0, 0);
  lcd.print("DanieleAlberti");
  lcd.setCursor(13, 1);
  lcd.print(".It");
  delay(3000);
  lcd.clear();
  lcd.setRGB(50, 100, 200);
  lcd.setCursor(2, 0);
  lcd.print("Cronometrino");
  pinMode (pinpuls1, INPUT_PULLUP);
  pinMode (pinpuls2, INPUT_PULLUP);
}
void loop()
{
  statopuls1 = digitalRead (pinpuls1);
  statopuls2 = digitalRead (pinpuls2);
  if ((statopuls1 == LOW) && (flag < 2))
  {
    tempo_base = millis();
    flag = 0;
  }
  if ((statopuls1 == LOW) && (flag == 2))
  {
    flag = 0;
  }
  if (flag == 0)
  {
    lcd.setRGB(200, 100, 00);
    lcd.setCursor(0, 0);
    lcd.print("TEMPO  (secondi)");
    lcd.setCursor(0, 1);
    lcd.print("PARTITO!    ");
    tempo_cronometrato = millis() - tempo_base;
    temposec = tempo_cronometrato / 1000;
    if (temposec <= 9)
    {
      lcd.setCursor(12, 1);
      lcd.print("   ");
      lcd.print(temposec);
    }
    if ((temposec > 9) && (temposec <= 99))
    {
      lcd.setCursor(12, 1);
      lcd.print("  ");
      lcd.print(temposec);
    }
    if ((temposec > 99) && (temposec <= 999))
    {
      lcd.setCursor(12, 1);
      lcd.print(" ");
      lcd.print(temposec);
    }
    if ((temposec > 999) && (temposec <= 9999))
    {
      lcd.setCursor(12, 1);
      lcd.print(temposec);
    }
  }
  if (statopuls2 == LOW)
  {
    lcd.setRGB(100, 200, 0);
    lcd.setCursor(0, 0);
    lcd.print("TEMPO (millisec)");
    lcd.setCursor(0, 1);
    lcd.print("STOP!    ");
    if ((tempo_cronometrato > 9) && (tempo_cronometrato <= 99))
    {
      lcd.setCursor(9, 1);
      lcd.print("     ");
      lcd.print(tempo_cronometrato);
    }
    if ((tempo_cronometrato > 99) && (tempo_cronometrato <= 999))
    {
      lcd.setCursor(9, 1);
      lcd.print("    ");
      lcd.print(tempo_cronometrato);
    }
    if ((tempo_cronometrato > 999) && (tempo_cronometrato <= 9999))
    {
      lcd.setCursor(9, 1);
      lcd.print("   ");
      lcd.print(tempo_cronometrato);
    }
    if ((tempo_cronometrato > 9999) && (tempo_cronometrato <= 99999))
    {
      lcd.setCursor(9, 1);
      lcd.print("  ");
      lcd.print(tempo_cronometrato);
    }
    if ((tempo_cronometrato > 99999) && (tempo_cronometrato <= 999999))
    {
      lcd.setCursor(9, 1);
      lcd.print(" ");
      lcd.print(tempo_cronometrato);
    }
    if ((tempo_cronometrato > 999999) && (tempo_cronometrato <= 9999999))
    {
      lcd.setCursor(9, 1);
      lcd.print(tempo_cronometrato);
    }
    flag = 2;
  }
}


ecco come ho editato la parte di programma per quel che riguarda i led:

Code: [Select]

for (;;) {  //inizio loop infinita scansione corsie
   val = digitalRead(BUTTON1);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,0);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE1, HIGH);
     statoCorsia1 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,0);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO1, LOW);
     statoCorsia1 = false;         
   }
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,1);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE2, HIGH);
     statoCorsia2 = true;         
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,1);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO2, LOW);
     statoCorsia2 = false;         

   }
   val = digitalRead(BUTTON3);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,2);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE3, HIGH);
     statoCorsia3 = true;         
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,2);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO3, LOW);
     statoCorsia3 = false;       

   }
   val = digitalRead(BUTTON4);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,3);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE4, HIGH);
     statoCorsia4 = true;         
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,3);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO4, LOW);
     statoCorsia4 = false;       


Per il display................ vedremo più avanti........quando riuscirò a far funzionare il tutto.

per il circuito di alimentazione, ok per l'inversione di polarità.
se per te il 7805 è troppo basso di voltaggio, posso anche utilizzare un 7809, con lo stesso circuito, teoricamente dovrebbe scaldare un po meno :)

ciao e grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 26, 2019, 12:25 am
Per l'accensione del led, devo comprare le resistenze, cosa che se non le prendo online, devo andare per forza a Bologna, perchè da noi non ci sono più negozi.

Nonostante abiti a Milano io mi servo solo online. Ampia scelta e pago meno di qualsiasi negozio. Ti consiglierei di prenderti un kit completo, per quello che costa. Ad esempio questo (https://www.ebay.it/itm/SET-professionale-KIT-85-VALORI-850-resistenze-1-4-W-10-PEZZI-PER-OGNI-VALORE/291967391112?hash=item43fa9cd588:g:nqsAAOSw44BYSuRc).

per quel che riguarda la funzione cronometro (millis)

Per quello che riguarda il progetto ti basta sapere che la funzione millis() è una funzione che quando viene chiamata fornisce IL TEMPO IN MILLISECONDI DALL'ACCENSIONE (O RESET) DELL'ARDUINO. Questo significa che, dopo il caricamento del programma, non appena l'Arduino parte, un contatore interno al processore comincia a contare i millisecondi partendo da 0. Se leggi il reference (https://www.arduino.cc/reference/en/language/functions/time/millis/) della funzione, apprendi che, trattandosi di un contatore a 32 bit (unsigned long (https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/)), questo si azzererà DA SOLO dopo circa 50 giorni. Non c'è quindi pericolo di overflow e sballo nei conteggi.

Come puoi usarlo come cronometro nel progetto? È semplice: definisci cinque variabili del tipo unsigned long, che chiamerai ad es. startTime, corsia1Time, corsia2Time, corsia3Time e corsia4Time. Alla pressione del tasto start memorizzerai nella variabile startTime il valore di millis() così:
Code: [Select]
startTime = millis();

Poi passerai a testare i pulsanti rossi DELLE SOLE CORSIE ATTIVE. Non appena un pulsante rosso viene premuto memorizzerai nella variabile corrispondente il valore che avrà assunto millis() in quel momento così:
Code: [Select]
corsia1Time = millis();

Il tempo realizzato (in millisecondi) sarà dato dalla differenza fra i due valori
Code: [Select]
time1 = corsia1Time - startTime;

Poi bisogna trasformarlo in minuti, secondi, millesimi di secondo e scriverlo sul display

ecco come ho editato la parte di programma per quel che riguarda i led:

La guardo domattina, ma metti sempre il codice al completo.

posso anche utilizzare un 7809, con lo stesso circuito, teoricamente dovrebbe scaldare un po meno

Esatto, benissimo. Così puoi alimentare il tutto da VIN.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 26, 2019, 01:08 am
ecco quello che ho scritto, ma sicuramente ho fatto un'errore perchè mi segnala un'anomalia.

Code: [Select]
#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 BUTTONSTART 11 //pulsante di start
#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 LEDVERDE1 2 //led start corsia 1
#define LEDVERDE2 3 //led start corsia 2
#define LEDVERDE3 4 //led start corsia 3
#define LEDVERDE4 5 //led start corsia 4   
#define LEDROSSO1 6 //led stop corsia 1   
#define LEDROSSO2 7 //led stop corsia 2   
#define LEDROSSO3 8 //led stop corsia 3   
#define LEDROSSO4 9 //led stop corsia 4   

int val;
bool statoCorsia1; //flag corsia1   
bool statoCorsia2; //flag corsia2   
bool statoCorsia3; //flag corsia3   
bool statoCorsia4; //flag corsia4   

void setup()
{
 startTime = millis();
 corsia1Time = millis();
 corsia2Time = millis();
 corsia3Time = millis();
 corsia4Time = millis();
 time1 = corsiaTime1 - startTime;
 time2 = corsiaTime2 - startTime;
 time3 = corsiaTime3 - startTime;
 time4 = corsiaTime4 - startTime;
 pinMode(BUTTON1, INPUT_PULLUP);     
 pinMode(BUTTON2, INPUT_PULLUP);     
 pinMode(BUTTON3, INPUT_PULLUP);     
 pinMode(BUTTON4, INPUT_PULLUP);     
 pinMode(BUTTONSTART, INPUT_PULLUP);
 pinMode(LEDVERDE1, OUTPUT);         
 pinMode(LEDVERDE2, OUTPUT);         
 pinMode(LEDVERDE3, OUTPUT);         
 pinMode(LEDVERDE4, OUTPUT);         
 pinMode(LEDROSSO1, OUTPUT);         
 pinMode(LEDROSSO2, OUTPUT);         
 pinMode(LEDROSSO3, OUTPUT);         
 pinMode(LEDROSSO4, OUTPUT);         

 digitalWrite(LEDVERDE1, LOW);       
 digitalWrite(LEDVERDE2, LOW);       
 digitalWrite(LEDVERDE3, LOW);       
 digitalWrite(LEDVERDE4, LOW);       
 digitalWrite(LEDROSSO1, LOW);       
 digitalWrite(LEDROSSO2, LOW);       
 digitalWrite(LEDROSSO3, LOW);       
 digitalWrite(LEDROSSO4, LOW);       

 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     
 statoCorsia1 = false;         
 statoCorsia2 = false;         
 statoCorsia3 = false;         
 statoCorsia4 = false;         
}

void loop()
{

 for (;;) {  //inizio loop infinita scansione corsie

   val = digitalRead(BUTTON1);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,0);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE1, HIGH);
     statoCorsia1 = true;
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,0);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO1, LOW);
     statoCorsia1 = false;         
   }
   val = digitalRead(BUTTON2);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,1);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE2, HIGH);
     statoCorsia2 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,1);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO2, LOW);
     statoCorsia2 = false;         

   }
   val = digitalRead(BUTTON3);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,2);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE3, HIGH);
     statoCorsia3 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,2);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO3, LOW);
     statoCorsia3 = false;         

   }
   val = digitalRead(BUTTON4);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,3);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE4, HIGH);
     statoCorsia4 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,3);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO4, LOW);
     statoCorsia4 = false;         

   }
   val = digitalRead(BUTTONSTART);
   if (val == LOW) {               
     //è stato premuto il pulsante di start, si esce dalla prima loop infinita
     break;                       
   }
 }  //FINE LOOP INFINITA SCANSIONE CORSIE   
}


ciao e grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 26, 2019, 08:03 am
Forse mi sono spiegao male sul funzionamento di millis().

millis() è una funzione DINAMICA. Significa che ti da un valore nel momento in cui la "fotografi". Corrisponde al "tempo parziale" di un cronometro normale. Quindi all'avvio di Arduino il cronometro (millis()) parte da solo e da quel momento tu puoi solo calcolare i tempi per differenza fra una prima "fotografia" (alla pressione del tasto start) e una seconda "fotografia" (alla pressione del tasto stop)- Allora alla pressione del tasto start devi memorizzare il valore di millis() e poi lo devi memorizzare in un'altra variabile alla pressione del tasto stop. Il tempo impiegato dal concorrente è dato dalla differenza dei due valori. Ho corretto il programma.

Code: [Select]

#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 BUTTONSTART 11 //pulsante di start
#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 LEDVERDE1 2 //led start corsia 1
#define LEDVERDE2 3 //led start corsia 2
#define LEDVERDE3 4 //led start corsia 3
#define LEDVERDE4 5 //led start corsia 4   
#define LEDROSSO1 6 //led stop corsia 1   
#define LEDROSSO2 7 //led stop corsia 2   
#define LEDROSSO3 8 //led stop corsia 3   
#define LEDROSSO4 9 //led stop corsia 4   

int val;
bool statoCorsia1; //flag stato corsia1   
bool statoCorsia2; //flag stato corsia2   
bool statoCorsia3; //flag stato corsia3   
bool statoCorsia4; //flag stato corsia4   
bool stopCorsia1;  //flag stop corsia1   //======istruzione aggiunta
bool stopCorsia2;  //flag stop corsia2   //======istruzione aggiunta   
bool stopCorsia3;  //flag stop corsia3   //======istruzione aggiunta
bool stopCorsia4;  //flag stop corsia4   //======istruzione aggiunta
unsigned long startTime;           //======istruzione aggiunta
unsigned long corsia1Time;         //======istruzione aggiunta
unsigned long corsia2Time;         //======istruzione aggiunta
unsigned long corsia3Time;         //======istruzione aggiunta
unsigned long corsia4Time;         //======istruzione aggiunta
unsigned long time1;               //======istruzione aggiunta
unsigned long time2;               //======istruzione aggiunta
unsigned long time3;               //======istruzione aggiunta
unsigned long time4;               //======istruzione aggiunta

void setup()
{
// startTime = millis();            //======istruzione eliminata
// corsia1Time = millis();          //======istruzione eliminata
// corsia2Time = millis();          //======istruzione eliminata
// corsia3Time = millis();          //======istruzione eliminata
// corsia4Time = millis();          //======istruzione eliminata
// time1 = corsiaTime1 - startTime; //======istruzione eliminata
// time2 = corsiaTime2 - startTime; //======istruzione eliminata
// time3 = corsiaTime3 - startTime; //======istruzione eliminata
// time4 = corsiaTime4 - startTime; //======istruzione eliminata

//Inizializza pin I/O
 pinMode(BUTTON1, INPUT_PULLUP);     
 pinMode(BUTTON2, INPUT_PULLUP);     
 pinMode(BUTTON3, INPUT_PULLUP);     
 pinMode(BUTTON4, INPUT_PULLUP);     
 pinMode(BUTTONSTART, INPUT_PULLUP);
 pinMode(LEDVERDE1, OUTPUT);         
 pinMode(LEDVERDE2, OUTPUT);         
 pinMode(LEDVERDE3, OUTPUT);         
 pinMode(LEDVERDE4, OUTPUT);         
 pinMode(LEDROSSO1, OUTPUT);         
 pinMode(LEDROSSO2, OUTPUT);         
 pinMode(LEDROSSO3, OUTPUT);         
 pinMode(LEDROSSO4, OUTPUT);         

//Spegni tutti i led
 digitalWrite(LEDVERDE1, LOW);       
 digitalWrite(LEDVERDE2, LOW);       
 digitalWrite(LEDVERDE3, LOW);       
 digitalWrite(LEDVERDE4, LOW);       
 digitalWrite(LEDROSSO1, LOW);       
 digitalWrite(LEDROSSO2, LOW);       
 digitalWrite(LEDROSSO3, LOW);       
 digitalWrite(LEDROSSO4, LOW);       

 lcd.init();                      // initialize the lcd

//Inizializza il display
 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 e stop
 statoCorsia1 = false;         
 statoCorsia2 = false;         
 statoCorsia3 = false;         
 statoCorsia4 = false;         
 stopCorsia1 = false;         //======istruzione aggiunta
 stopCorsia2 = false;         //======istruzione aggiunta
 stopCorsia3 = false;         //======istruzione aggiunta
 stopCorsia4 = false;         //======istruzione aggiunta
}

void loop()
{

 for (;;) {  //inizio loop infinita scansione corsie

   val = digitalRead(BUTTON1);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,0);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE1, HIGH);
     statoCorsia1 = true;
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,0);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO1, LOW);
     statoCorsia1 = false;         
   }
   val = digitalRead(BUTTON2);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,1);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE2, HIGH);
     statoCorsia2 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,1);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO2, LOW);
     statoCorsia2 = false;         

   }
   val = digitalRead(BUTTON3);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,2);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE3, HIGH);
     statoCorsia3 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,2);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO3, LOW);
     statoCorsia3 = false;         

   }
   val = digitalRead(BUTTON4);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,3);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE4, HIGH);
     statoCorsia4 = true;           
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,3);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO4, LOW);
     statoCorsia4 = false;         

   }
   val = digitalRead(BUTTONSTART);
   if (val == LOW) {               
     //è stato premuto il pulsante di start, si esce dalla prima loop infinita
     break;                       
   }
 }  //FINE LOOP INFINITA SCANSIONE CORSIE
 
//======inizio parte aggiunta
//È stato premuto il tasto start
 startTime = millis();         //memorizza millisecondo di start
 //Segnala sul display le corsie che stanno cronometrando
 if (statoCorsia1 == true) {   //se CORSIA 1 attiva
   lcd.setCursor(9, 0);        //segnala che si sta cronometrando
   lcd.print("CRONOMETRO");
 }
//INSERISCI QUI DI SEGUITO LA SEGNALAZIONE PER LE ALTRE CORSIE
// . . .
//INIZIA LOOP INFINITA PER IL TEST DEI PULSANTI ROSSI
 for (;;) {
   //controllo tasto rosso corsia1
   if (statoCorsia1 == true &&        //se la corsia è attiva
       stopCorsia1 == false &&        //se il tempo non è ancora stato preso
       digitalRead(BUTTON1) == LOW) { //se il tasto rosso è stato premuto
     //se tutte queste condizioni sono soddisfatte, allora
     corsia1Time = millis();          //blocca il cronometro per CORSIA 1
     digitalWrite(LEDVERDE1, LOW);    //spegni la luce verde
     digitalWrite(LEDROSSO1, HIGH);   //accendi la luce rossa
     stopCorsia1 = true;              //segnala tasto rosso già premuto
   }
//INSERISCI QUI DI SEGUITO LA SEGNALAZIONE PER LE ALTRE CORSIE
// . . .
 }
//======fine parte aggiunta

}


Ti ho anche inserito la prima parte del seguito del programma. Come puoi vedere è stato necessario inserire altre "flag" di segnalazione per l'avvenuto stop al cronometro per QUELLA corsia mentre si esaminano le altre, altrimenti il cronometro verrebbe ri-stoppato a ogni passaggio. Quindi durante la seconda loop infinita le condizioni per lo "stop al cronometro" per OGNI corsia sono:
Se una sola di questa condizioni non è soddisfatta (AND logico) si salta alla successiva corsia senza far niente.

Correggi il programma e aggiungi le parti mancanti. Poi postalo ancora per intero che andiamo avanti.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 26, 2019, 10:31 am
Buongiorno (vedo che sei mattiniero come me""")

ecco cio che ho fatto stamattina:

Code: [Select]

#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 BUTTONSTART 11 //pulsante di start
#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 LEDVERDE1 2 //led start corsia 1
#define LEDVERDE2 3 //led start corsia 2
#define LEDVERDE3 4 //led start corsia 3
#define LEDVERDE4 5 //led start corsia 4  
#define LEDROSSO1 6 //led stop corsia 1    
#define LEDROSSO2 7 //led stop corsia 2    
#define LEDROSSO3 8 //led stop corsia 3    
#define LEDROSSO4 9 //led stop corsia 4    

int val;
bool statoCorsia1; //flag corsia1  
bool statoCorsia2; //flag corsia2  
bool statoCorsia3; //flag corsia3  
bool statoCorsia4; //flag corsia4  
bool stopCorsia1;  //flag stop corsia1  
bool stopCorsia2;  //flag stop corsia2    
bool stopCorsia3;  //flag stop corsia3    
bool stopCorsia4;  //flag stop corsia4  
unsigned long startTime;            
unsigned long corsia1Time;          
unsigned long corsia2Time;          
unsigned long corsia3Time;          
unsigned long corsia4Time;          
unsigned long time1;                
unsigned long time2;                
unsigned long time3;              
unsigned long time4;
              
void setup()
{

 //Inizializza pin I/O

 pinMode(BUTTON1, INPUT_PULLUP);    
 pinMode(BUTTON2, INPUT_PULLUP);    
 pinMode(BUTTON3, INPUT_PULLUP);    
 pinMode(BUTTON4, INPUT_PULLUP);    
 pinMode(BUTTONSTART, INPUT_PULLUP);
 pinMode(LEDVERDE1, OUTPUT);        
 pinMode(LEDVERDE2, OUTPUT);        
 pinMode(LEDVERDE3, OUTPUT);        
 pinMode(LEDVERDE4, OUTPUT);        
 pinMode(LEDROSSO1, OUTPUT);        
 pinMode(LEDROSSO2, OUTPUT);        
 pinMode(LEDROSSO3, OUTPUT);        
 pinMode(LEDROSSO4, OUTPUT);        

 digitalWrite(LEDVERDE1, LOW);      
 digitalWrite(LEDVERDE2, LOW);      
 digitalWrite(LEDVERDE3, LOW);      
 digitalWrite(LEDVERDE4, LOW);      
 digitalWrite(LEDROSSO1, LOW);      
 digitalWrite(LEDROSSO2, LOW);      
 digitalWrite(LEDROSSO3, LOW);      
 digitalWrite(LEDROSSO4, LOW);      

 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      
 statoCorsia1 = false;        
 statoCorsia2 = false;        
 statoCorsia3 = false;        
 statoCorsia4 = false;
 stopCorsia1 = false;          
 stopCorsia2 = false;        
 stopCorsia3 = false;          
 stopCorsia4 = false;          
      
}

void loop()
{

 for (;;) {  //inizio loop infinita scansione corsie

   val = digitalRead(BUTTON1);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,0);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE1, HIGH);
     statoCorsia1 = true;
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,0);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO1, LOW);
     statoCorsia1 = false;        
   }
   val = digitalRead(BUTTON2);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,1);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE2, HIGH);
     statoCorsia2 = true;          
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,1);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO2, LOW);
     statoCorsia2 = false;        

   }
   val = digitalRead(BUTTON3);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,2);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE3, HIGH);
     statoCorsia3 = true;          
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,2);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO3, LOW);
     statoCorsia3 = false;        

   }
   val = digitalRead(BUTTON4);
   if (val == HIGH) {         //il pulsante è rilasciato
     lcd.setCursor(9,3);
     lcd.print("PRONTA    ");
     digitalWrite(LEDVERDE4, HIGH);
     statoCorsia4 = true;          
   }
   if (val == LOW) {          //il pulsante è premuto
     lcd.setCursor(9,3);
     lcd.print("NON ATTIVA");
     digitalWrite(LEDROSSO4, LOW);
     statoCorsia4 = false;        

   }
   val = digitalRead(BUTTONSTART);
   if (val == LOW) {              
     //è stato premuto il pulsante di start, si esce dalla prima loop infinita
     break;                        
   }
 }  //FINE LOOP INFINITA SCANSIONE CORSIE

//È stato premuto il tasto start
 startTime = millis();         //memorizza millisecondo di start
 //Segnala sul display le corsie che stanno cronometrando
 if (statoCorsia1 == true) {   //se CORSIA 1 attiva
   lcd.setCursor(9, 0);        //segnala che si sta cronometrando
   lcd.print("  IN GARA ");

 startTime = millis();         //memorizza millisecondo di start
 //Segnala sul display le corsie che stanno cronometrando
 if (statoCorsia2 == true) {   //se CORSIA 2 attiva
   lcd.setCursor(9, 1);        //segnala che si sta cronometrando
   lcd.print("  IN GARA ");
 startTime = millis();         //memorizza millisecondo di start
 //Segnala sul display le corsie che stanno cronometrando
 if (statoCorsia3 == true) {   //se CORSIA 3 attiva
   lcd.setCursor(9, 2);        //segnala che si sta cronometrando
   lcd.print("  IN GARA ");

 startTime = millis();         //memorizza millisecondo di start
 //Segnala sul display le corsie che stanno cronometrando
 if (statoCorsia4 == true) {   //se CORSIA 4 attiva
   lcd.setCursor(9, 3);        //segnala che si sta cronometrando
   lcd.print("  IN GARA ");

   }
//INIZIA LOOP INFINITA PER IL TEST DEI PULSANTI ROSSI
 for (;;) {
   //controllo tasto rosso corsia1
   if (statoCorsia1 == true &&        //se la corsia è attiva
       stopCorsia1 == false &&        //se il tempo non è ancora stato preso
       digitalRead(BUTTON1) == LOW) { //se il tasto rosso è stato premuto
     //se tutte queste condizioni sono soddisfatte, allora
     corsia1Time = millis();          //blocca il cronometro per CORSIA 1
     digitalWrite(LEDVERDE1, LOW);    //spegni la luce verde
     digitalWrite(LEDROSSO1, HIGH);   //accendi la luce rossa
     stopCorsia1 = true;              //segnala tasto rosso già premuto
   }

for (;;) {
   //controllo tasto rosso corsia2
   if (statoCorsia2 == true &&        //se la corsia è attiva
       stopCorsia2 == false &&        //se il tempo non è ancora stato preso
       digitalRead(BUTTON2) == LOW) { //se il tasto rosso è stato premuto
     //se tutte queste condizioni sono soddisfatte, allora
     corsia2Time = millis();          //blocca il cronometro per CORSIA 2
     digitalWrite(LEDVERDE2, LOW);    //spegni la luce verde
     digitalWrite(LEDROSSO2, HIGH);   //accendi la luce rossa
     stopCorsia2 = true;              //segnala tasto rosso già premuto
   }
for (;;) {
   //controllo tasto rosso corsia3
   if (statoCorsia3 == true &&        //se la corsia è attiva
       stopCorsia3 == false &&        //se il tempo non è ancora stato preso
       digitalRead(BUTTON3) == LOW) { //se il tasto rosso è stato premuto
     //se tutte queste condizioni sono soddisfatte, allora
     corsia3Time = millis();          //blocca il cronometro per CORSIA 3
     digitalWrite(LEDVERDE3, LOW);    //spegni la luce verde
     digitalWrite(LEDROSSO3, HIGH);   //accendi la luce rossa
     stopCorsia3 = true;              //segnala tasto rosso già premuto
   }
for (;;) {
   //controllo tasto rosso corsia4
   if (statoCorsia4 == true &&        //se la corsia è attiva
       stopCorsia4 == false &&        //se il tempo non è ancora stato preso
       digitalRead(BUTTON4) == LOW) { //se il tasto rosso è stato premuto
     //se tutte queste condizioni sono soddisfatte, allora
     corsia4Time = millis();          //blocca il cronometro per CORSIA 4
     digitalWrite(LEDVERDE4, LOW);    //spegni la luce verde
     digitalWrite(LEDROSSO4, HIGH);   //accendi la luce rossa
     stopCorsia4 = true;              //segnala tasto rosso già premuto
   }

}


se stampo il listato, riesco a capire meglio dove devo mettere le mani, sul monitor faccio più fatica....... :O

Ciao e Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 26, 2019, 08:29 pm
Buongiorno (vedo che sei mattiniero come me""")

Sono vecchio. Mi bastano sei ore di sonno e, come ti ho detto, il progetto mi intriga.

ecco ciò che ho fatto stamattina:

Hai postato un codice che non compila. Si impara dagli errori.

Questi gli errori segnalati:

Code: [Select]

Arduino:1.8.8 (Linux), Scheda:"Arduino Nano, ATmega328P (Old Bootloader)"

/home/user/Arduino/sketch_apr26c/sketch_apr26c.ino: In function 'void loop()':
sketch_apr26c:232:1: error: expected '}' at end of input
}
^
sketch_apr26c:232:1: error: expected '}' at end of input
sketch_apr26c:232:1: error: expected '}' at end of input
sketch_apr26c:232:1: error: expected '}' at end of input
sketch_apr26c:232:1: error: expected '}' at end of input
sketch_apr26c:232:1: error: expected '}' at end of input
sketch_apr26c:232:1: error: expected '}' at end of input

exit status 1
expected '}' at end of input

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Bisogna impratichirsi a interpretare gli errori segnalati dal compilatore. In buona sostanza ti segnala che mancano un certo numero di "}" di chiusura di gruppi di istruzioni che devono essere rinchiusi fra {}. Te lo segnala come errore all'ultima riga, perché le ha cercate fino in fondo, ma non le ha trovate. In realtà per ogni if che hai aperto nella sezione scansione corsie manca la relativa } di chiusura.

Ho corretto il programma e ho inserito i commenti e i suggerimenti all'interno. Lo trovi in allegato perché sta diventando lungo. Puoi anche lasciare i commenti, il programma compila lo stesso, ma devi aggiungere le parti mancanti. Poi ti aiuto.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 26, 2019, 11:00 pm
Ciao,
si avevo visto che c'èra un errore di parentesi, ma poi nel pomeriggio non ci sono potuto andare dietro, per alcuni impegni.
adesso stampo e verifico

grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 26, 2019, 11:58 pm
ho messo mano al listato,
ho modificato e aggiunto le corsie mancanti.
quello che ho notato  che quando chiudo l'ultimo pulsante rosso, mi viene scritto "T" solo nella corsia 1

per quel che riguarda l'operazione di calcolo, ho dato ai millisecondi 1, ai secondi 1000 e ai minuti 60000.
non so se è giusto........
per il resto vorrei che il cronometro mi dia il tempo ad ogni pressione di stop e non fino a quando siano arrivati tutti. Questo solo perchè chi trascrive i tempi nella tabella excel, lo puo fare man mano che finiscono e non aspettando la fine di tutti (cosi si risparmia tempo).

.......poi mi spiegherai come allegare il file .ino.


Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 27, 2019, 08:21 am
vorrei che il cronometro mi dia il tempo ad ogni pressione di stop e non fino a quando siano arrivati tutti.

Hai perfettamente ragione. Mi stavo complicando la vita perché volevo che la scansione dei pulsanti rossi avvenisse il più velocemente possibile, ma dal momento che non stiamo cronometrando una formula 1 possiamo semplificare il tutto.

per quel che riguarda l'operazione di calcolo, ho dato ai millisecondi 1, ai secondi 1000 e ai minuti 60000.

È corretto.

ho modificato e aggiunto le corsie mancanti. Quello che ho notato  che quando chiudo l'ultimo pulsante rosso, mi viene scritto "T" solo nella corsia 1

È probabile che ci sia un errore. Dovrei vedere il codice.

poi mi spiegherai come allegare il file .ino

È semplice. Vai nel riquadro Quick Replay e scrivi il testo della risposta (il testo NON il file.ino). Poi clicca su Preview (in basso a destra). Compare un altro riquadro. Clicca su Attachments and other options (in blu in basso a sinistra). Clicca su Scegli file. Seleziona il file .ino da allegare. Tutto qui.

Ho corretto il programma come vuoi tu e viene anche più semplice. Ho "ripulito" il programma dei commenti inutili e ne ho aggiunti di nuovi. Completa le parti che mancano come suggerito nei commenti e... vediamo se abbiamo finito.

PER ORA! (ricorda l'appetito  :D ).

Posta il codice provvisoriamente definitivo che compila senza errori formali.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 27, 2019, 04:59 pm
Sto rivedendo il programma.

La gestione dei led durante la scansione delle corsie non mi convince. Tu vuoi che prima dello start, se un pulsante rosso è premuto, oltre a spegnersi il led verde, si accenda il led rosso, oppure devono rimanere spenti il led verde e quello rosso? In ogni caso il codice è sbagliato. Questo è quello della corsia 1

Code: [Select]
  if (val == HIGH) {         //il pulsante è rilasciato
    lcd.setCursor(9,0);
    lcd.print("PRONTA    ");
    digitalWrite(LEDVERDE1, HIGH);
    statoCorsia1 = true;
  }
  if (val == LOW) {          //il pulsante è premuto
    lcd.setCursor(9,0);
    lcd.print("NON ATTIVA");
    digitalWrite(LEDROSSO1, LOW);
    statoCorsia1 = false;        

Nel primo caso (led verde spento, led rosso acceso e viceversa) occorre modificare così

Code: [Select]
  if (val == HIGH) {         //il pulsante è rilasciato
    lcd.setCursor(9,0);
    lcd.print("PRONTA    ");
    digitalWrite(LEDVERDE1, HIGH);
    digitalWrite(LEDROSSO1, LOW);   //======istruzione da agguingere
    statoCorsia1 = true;
  }
  if (val == LOW) {          //il pulsante è premuto
    lcd.setCursor(9,0);
    lcd.print("NON ATTIVA");
    digitalWrite(LEDVERDE1, LOW);   //======istruzione da agguingere
    digitalWrite(LEDROSSO1, HIGH);  //======istruzione modificata
    statoCorsia1 = false;        

Nel secondo caso (solo il led verde acceso/spento, il led rosso sempre spento) occorre modificare così

Code: [Select]
  if (val == HIGH) {         //il pulsante è rilasciato
    lcd.setCursor(9,0);
    lcd.print("PRONTA    ");
    digitalWrite(LEDVERDE1, HIGH);
    statoCorsia1 = true;
  }
  if (val == LOW) {          //il pulsante è premuto
    lcd.setCursor(9,0);
    lcd.print("NON ATTIVA");
    digitalWrite(LEDVERDE1, LOW);   //======istruzione modificata
    statoCorsia1 = false;        

e così per le altre corsie.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 27, 2019, 06:20 pm
Ciao,
allora adesso metto mano al file, per quel che riguarda il led rosso, deve rimanere acceso solo quando il pulsante è premuto. se il tasto è rilasciato si accende il led verde.

Ora mi metto al lavoro


Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 27, 2019, 07:38 pm
Eccomi qua, dopo aver editato il listato con le tue indicazioni, mi sono permesso di personalizzare un po la grafica :)

per adesso gira che è una bellezza.....GRAZIE GRAZIE GRAZIE.

si si ho un'appetito, come le fotocellule ti arrivo al posto dei pulsanti!!!!  :) :)

Adesso inizio a progettare la scatola.......

Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 27, 2019, 08:18 pm
...mi sono permesso di personalizzare un po la grafica

E hai fatto benissimo. Ricorda che il programma è TUO. Qui sul forum si fornisce solo supporto.

Una raccomandazione: adesso che hai ancora fresco in mente il funzionamento del programma disseminalo di commenti e spiegazioni e, soprattutto, descrivi come è connesso l'hardware (display, led e pulsanti) e come funziona. Non fidarti della tua memoria che sarà sicuramente migliore della mia, ma fra qualche mese non saprai più metterci le mani.

Un'altra ancora. Quando ho cominciato a programmare un vecchio del mestiere mi ha passato una massima fondamentale:

Se un programma funziona quanto basta,
lascialo stare, sennò si guasta


Intendeva dire che, se vuoi introdurre migliorie, crea una copia di quello che funziona e lavora su quella. Dopo che avrai fatto pasticci potrai sempre buttarlo via e tornare all'originale.

Quando sarà finito, allega una foto. Buon lavoro.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on Apr 28, 2019, 06:42 pm
CIao Pgiagno,

Allora, oggi sono andato ad una gara(dove partecipava anche mia figlia che ha fatto il terzo posto di categoria), e ho avuto modo di far vedere il funzionamento del mio progettino, e sopratutto convergere alcune idee per il miglioramento.

 - ok lo stop con i funghi e non con le fotocellule.
 - modificare la visualizzazione dei secondi eliminando i minuti e facendolo contare anche dopo i 60 sec.
 - ok per la trasmissione via wireless per i pulsanti e led.

per quest'ultimo punto, pensavo, di non modificare il progetto, e comandando gli ingressi dei pulsanti con dei rele, comandati da un ricevitore wireless...............per fare quest'ultima cosa, devo prendere altri 5 nano (uno come ricevitore e 4 come trasmettitori) oppure bastano solo i moduli tx/rx? (naturalmente alimentati da una batteria da 7,4v)

cmq è piaciuto a tutto lo staff, sia come progetto che come logica di funzionameto...:)

Ciao e grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 29, 2019, 04:36 pm
. . .
- ok lo stop con i funghi e non con le fotocellule.
. . .
Meglio. Le fotocellule necessitano di allineamenti meccanico ottici abbastanza precisi, che possono essere difficili da settare e mantenere in istallazioni mobili

. . .
 - modificare la visualizzazione dei secondi eliminando i minuti e facendolo contare anche dopo i 60 sec.
. . .
Questo lo sai fare da solo

. . .
 - ok per la trasmissione via wireless per i pulsanti e led.
. . .
Su questo argomento non sono molto ferrato. Ho cominciato a sperimentare su connessioni a 433 MHz uno-a-uno, ma non saprei come fare per trasmissioni molti-a-uno nel caso dei pulsanti rossi. Trasmettere uno-a-molti (è il caso dell'accensione del jumbo led) è abbastanza semplice, e appena mi arrivano gli altri moduli faccio la prova con i ricevitori tarati su canali differenti, in modo da non darsi noia.
Altro problema è il molti-a-uno. Ci vorrebbe un ricevitore in grado di ricevere contemporaneamente quattro canali differenti, oppure quattro ricevitori tarati ciascuno su un canale diverso. Devo fare prove e sarà una cosa lunga.

Questo topic è ormai monopolizzato da noi due e temo che possa non venire nessuno con suggerimenti. Potresti provare ad aprire un altro topic con questo problema e vedere cosa dicono più esperti in questo campo.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Standardoil on Apr 29, 2019, 04:42 pm
Io voto per mettere 4 coppie di HC11 su 4 canali ben distanziati
Configurati come telecomando, non seriale
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 29, 2019, 09:22 pm
Grazie Standardoil, il tuo aiuto è prezioso. Io uso abitualmente HC12. Mi spieghi la differenza? Potrei usare gli HC12?

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Standardoil on Apr 30, 2019, 08:00 am
Gli HC11 hanno un modo di funzionamento in più rispetto ai 12
Che copia sulle uscite del ricevitore gli ingressi del trasmettitore
Cerca i pdf
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on Apr 30, 2019, 04:08 pm
Grazie, provvedo.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 04, 2019, 06:10 pm
Buonasera,
Rieccomi dopo qualche giorno.......
@ pgiagno
Non sono mia sicuro di riuscirci............
Praticamente devo modificare i "00" dei secondi in "000" e togliere la stringa relativa ai minuti. Poi devo modificare il comando che moltiplica per 6000 e farlo moltiplicare per 10000!!!
Appena rientro a casa vedo di postare una stringa modificata...........
Per il resto, sto aspettando che arrivi tutto l'occorrente per saldare il tutto definitivamente.
Intanto ho trovato un piccolo intoppo con i led............. quelli verdi mi rimangono sempre accesi come i rossi.............. controllerò le uscite e sopratutto se le porte sono corrette!!! :).
Ho avuto un bel po da fare con il lavoro/ attività della bambina (3 gare in 8 giorni) e non sono riuscito a guardare il progetto.

Ciao e Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 05, 2019, 12:36 am
ecco come ho modificato, ma non è corretto. non riesco a capire dove sbaglio!!!

Code: [Select]
/======INIZIO PARTE PER CORSIA 4
     time4 = corsia4Time - startTime; //calcola i millisecondi impiegati
     //trasforma i millisecondi in minuti(1 cifra), secondi(2 cifre),
     //millisecondi(3 cifre)
     unsigned long secondi, millesimi;
     //i minuti sono il quoziente della divisione del tempo ottenuto x 60000
     //i secondi sono il quoziente della divisione x 1000 del resto della
     //divisione x 60000
     secondi = (time4 % 100000) / 1000;
     //i millesimi sono il resto della divisione x 1000 del resto della
     //divisione x 60000
     millesimi = (time4 % 60000) % 1000;
     //si presuppone che i minuti siano < 10
     lcd.setCursor(9, 3);
     lcd.print("     ");
     //scrivi i secondi anteponendo 0 se sono < 10
     if (secondi < 10) {
       lcd.print("0");
     }
     lcd.print(secondi);
     lcd.print("'");
     //scrivi i millisecondi anteponendo 00 se < 10 oppure 0 se < 100
     if (millesimi < 100) {
       lcd.print("0");
     }
     if (millesimi < 10) {
       lcd.print("0");
     }
     lcd.print(millesimi);
//======FINE PARTE PER CORSIA 4


grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 05, 2019, 03:20 pm
Il segreto sta in due tipi diversi di divisione che ti fornisce il C++.

Contrariamente a qualunque calcolatrice tascabile, che quando fa la divisione ti fornisce il quoziente con tutti i decimali che può calcolare, il linguaggio usato da Arduino ti fornisce una divisione del tipo A / B (" A diviso B" (https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/division/))  che dà come risultato il solo QUOZIENTE e una divisione A % B ("A modulo B" (https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/)) che dà come risultato il solo RESTO della divisione.

Se ti studi questi due operatori, con tutti gli esempi, non è possibile che tu non riesca a dividere un numero (ad es. 123456 millisecondi) in secondi (ad es 123) e millisecondi (ad es 456).

Una volta ottenuti i due valori, per stampare gli zeri eventualmente mancanti ai millisecondi, perché inferiori a 100 o a 10, puoi usare la parte di programma che c'è già.

Posta quello che riesci a fare.

Ciao,
P.

Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 05, 2019, 09:07 pm
Io voto per mettere 4 coppie di HC11 su 4 canali ben distanziati
Configurati come telecomando, non seriale

ma gli  HC11, per trasmettere devo obbligatoriamente accoppiarlo ad un'altro Nano, per dirgli cosa trasmettere giusto?

quindi dovrei prende 8 HC11 e altri 8 Nano, per far si di trasmettere i dati? ma posso codificarli che uno lavori solo con il suo ricevitore? se un pulsante è più lontano dal ricevitore rispetto agli altri, può sfalsarmi il tempo con la latenza?

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 05, 2019, 09:18 pm
Il segreto sta in due tipi diversi di divisione che ti fornisce il C++.

Contrariamente a qualunque calcolatrice tascabile, che quando fa la divisione ti fornisce il quoziente con tutti i decimali che può calcolare, il linguaggio usato da Arduino ti fornisce una divisione del tipo A / B (" A diviso B" (https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/division/))  che dà come risultato il solo QUOZIENTE e una divisione A % B ("A modulo B" (https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/)) che dà come risultato il solo RESTO della divisione.

Se ti studi questi due operatori, con tutti gli esempi, non è possibile che tu non riesca a dividere un numero (ad es. 123456 millisecondi) in secondi (ad es 123) e millisecondi (ad es 456).

Una volta ottenuti i due valori, per stampare gli zeri eventualmente mancanti ai millisecondi, perché inferiori a 100 o a 10, puoi usare la parte di programma che c'è già.

Posta quello che riesci a fare.

Ciao,
P.
é da stamattina che leggo il tuo pos.............
non ci sono ancora venuto a capo.


Cmq a parte questo, sto testando il progetto, e fino ad ora non mi ha dato problemi.
devo solo modificare lo schema elettrico sui pulsanti per accendere il led, perchè ho trovato dei pulsanti in alluminio, con doppio contatto stabile NO, quidi mettendo una batteria per alimentare il wifi, posso alimentare il led direttamente dal pulsante!!! :)


ciao e grazie

Ivan

Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 05, 2019, 11:23 pm
é da stamattina che leggo il tuo pos.............
non ci sono ancora venuto a capo...
Eppure è semplice.

Prendi un valore in millisecondi. Per semplicità di esempio prendiamo 123456. Questi sono MILLIsecondi, se tu vuoi i secondi, a occhio, 123456 millisecondi quanti secondi INTERI contengono?

E se tu togli quei secondi INTERI dai 123456 millisecondi quanti millisecondi restano?

Dài prova, e se non dormi domattina andiamo avanti.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Silente on May 06, 2019, 06:53 am
Io ti cosniglio una cosa, non puoi venire a capo del problema se hai difficoltà sia hardware che software, comincia a risolvere, e dico risolvere definitivamente, quelle hardware, e soltanto in un momento successivo preoccupati del codice. Questo per due ragioni:
1) se testi un codice su un hardware di cui non sei sicuro e non va come sai che il problema non é hardware?
2) se l'hardware é a posto il codice é già scritto per metà
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 06, 2019, 06:25 pm
ecco come ho modificato, ma non è corretto. non riesco a capire dove sbaglio!!!...
Prova così:

Code: [Select]
//======INIZIO PARTE PER CORSIA 4
     time4 = corsia4Time - startTime; //calcola i millisecondi impiegati
/*===PARTE DA TOGLIERE====================================================
     //trasforma i millisecondi in minuti(1 cifra), secondi(2 cifre),
     //millisecondi(3 cifre)
========================================================================*/
     unsigned long secondi, millesimi;
/*===PARTE DA TOGLIERE====================================================
     //i minuti sono il quoziente della divisione del tempo ottenuto x 60000
     //i secondi sono il quoziente della divisione x 1000 del resto della
     //divisione x 60000
     secondi = (time4 % 100000) / 1000;
========================================================================*/
     secondi = time4 / 1000; //istruzione da aggiungere
/*===PARTE DA TOGLIERE====================================================
     //i millesimi sono il resto della divisione x 1000 del resto della
     //divisione x 60000
     millesimi = (time4 % 60000) % 1000;
========================================================================*/
     millesimi = time4 % 1000; //istruzione da aggiungere
/*===PARTE DA TOGLIERE====================================================
     //si presuppone che i minuti siano < 10
========================================================================*/
     lcd.setCursor(9, 3);
/*===PARTE DA TOGLIERE====================================================
     lcd.print("     ");
     //scrivi i secondi anteponendo 0 se sono < 10
     if (secondi < 10) {
       lcd.print("0");
     }
========================================================================*/
     lcd.print(secondi);
     lcd.print("'");
     //scrivi i millisecondi anteponendo 00 se < 10 oppure 0 se < 100
     if (millesimi < 100) {
       lcd.print("0");
     }
     if (millesimi < 10) {
       lcd.print("0");
     }
     lcd.print(millesimi);
//======FINE PARTE PER CORSIA 4

S.E.&O.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 07, 2019, 10:30 pm
CIao Pgiagno,
domani sera mi metto dietro a fare delle prove.......

Grazie

Ivan

P.S. pian piano arriva il materiale............ :)
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 08, 2019, 10:39 am
ma gli  HC11, per trasmettere devo obbligatoriamente accoppiarlo ad un'altro Nano, per dirgli cosa trasmettere giusto?
Come già accennato in altro post conosco gli HC12 e non ho mai usato gli HC11. Dai data sheet comunque mi sembra che siano molto simili, ma io preferirei darti consigli solo sugli HC12.
Sì, dovrà essere accoppiato a un altro nano. Ogni apparato periferico non potrà avere soltanto un led e un pulsante, ma dovrà avere necessariamente: un led, un pulsante, un modulo HC12, un modulo di alimentazione (LiPo o Power bank), un modulo di ricarica (nel caso delle LiPo fisse), un interruttore acceso/spento.

quindi dovrei prende 8 HC11 e altri 8 Nano, per far si di trasmettere i dati?
No, ti ci vorranno 8 HC12, 4 nella consolle e 1 per ogni apparato periferico, e 4 nano, 1 per ogni apparato periferico. I 4 HC12 della consolle possono essere connessi tutti e 4 all'unico Arduino Nano.

ma posso codificarli che uno lavori solo con il suo ricevitore?
Non ho mai provato, ma a leggere sul data sheet si può fare distanziando i canali di trasmissione/ricezione di almeno 5 canali. Essendocene 100 a disposizione non dovrebbe essere difficile.

se un pulsante è più lontano dal ricevitore rispetto agli altri, può sfalsarmi il tempo con la latenza?
Se intendi che la distanza può influire sulla precisione della temporizzazione ti ricordo che la trasmissione radio viaggia a circa 300.000 km/s. Altri fattori influiranno sulla precisione, ma una programmazione attenta della scansione dei ricevitori dovrebbe minimizzare i ritardi (pochi ms) e comunque renderli circa uguali per tutti.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Standardoil on May 08, 2019, 11:10 am
Lo ho gia scritto, e adesso lo riscrivo, per un'ultima volta
I moduli hc11 hanno un modo di funzionamento che permette il loro uso a 'copiare' degli ingressi, quindi non scambio dati, ma simile a dei radiocomandi per cancello
Poi, se in tutto questo tempo a chi gli serve non ha nemmeno guardato i datasheet....
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: daysleeper on May 08, 2019, 03:17 pm
No, ti ci vorranno 8 HC12, 4 nella consolle e 1 per ogni apparato periferico, e 4 nano, 1 per ogni apparato periferico. I 4 HC12 della consolle possono essere connessi tutti e 4 all'unico Arduino Nano.
Da quello che ho capito leggendo il datasheet, se si accetta che i led potranno/dovranno essere solo comandati elettricamente dal pulsante bistabile, usando 8 HC11 come D.I. remoti invece che come seriali, i 4 nano non servono. Meno flessibile nella gestione del led ma in effetti usare un nano per gestire un paio di led di stato di un pulsante e spedire un bit solo è un po' overkill. Non li ho mai provati personalmente, ma leggendo le specifiche appoggio la soluzione di Standardoil.

Poi, se in tutto questo tempo a chi gli serve non ha nemmeno guardato i datasheet....
Perchè dai per scontato che chi si è presentato come novizio neanche due mesi fa sappia valutare senza problemi il manuale di un HC-11? Piuttosto, correggimi se sbaglio, non vedo controindicazioni ad usare un HC-11 come seriale wifi, accoppiata ad un nano, analogamente a come si farebbe con un HC-12. Se non ho perso info per strada direi di scegliere gli 11, che male che vada si useranno come si pensava di fare per i 12.

ps:
big-ivan, visto che c'è un topic aperto per questo specifico argomento, meglio decidersi su dove si vuole continuare a discuterne.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 08, 2019, 04:04 pm
Scusami Standardoil, scusami molto, e scusami anche tu daysleeper C'è stato un equivoco.

Io ho letto questo (https://ecksteinimg.de/Datasheet/HC-11%20english%20datasheet.pdf)  data sheet e non ho notato quello che Standardoil aveva segnalato nel post #79.

Poi con una ricerca più approfondita ho trovato questo (https://www.elecrow.com/download/HC-11.pdf) data sheet, dove a pag 15 viene spiegato chiaramente cosa intendeva Standardoil, e cosa NON avevo inteso/notato io.

Quindi concordo pienamente con la vostra soluzione: HC11 senz'altro e si risparmiano 4 Arduino nano.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 11, 2019, 09:56 am
buongiorno a tutti,

@ standardoil
hai ragione, non ci ho guardato........mea culpa. Ero preso nella programmazione e non ho cercato. cmq ho visto il datasheet e c'è un'immagine esaustiva alla fine, che dice come collegarlo.

@ daysleeper
grazie per il supporto e i consigli.

@pgiagno
ho cercato di compilare il programma da solo, e poi ho comparato con quello che hai postato tu.
adesso ho capito come fargli fare la modifica, praticamente gli è stata fatta fare un'operazione in meno e piu semplice. (contare per 100 e non per 60).
sto finendo di ricevere i vari componenti, e appena ho la scatola corretta, procedo con la progettazione della parte anteriore.
ci vediamo nell'altro topic per le domande sulla trasmissione dati.....

Grazie a tutti

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 15, 2019, 01:24 pm
Ciao Pgiagno,


Sto iniziando ad assemblare il tutto, ma ho avuto in problema seguendo lo schema elettrico.


ho collegato i led bicolori, ma non si accendono (resistenza da 270 ohm), ma se metto due led normali, si accendono senza problemi (pin comune a massa).

Allora ho fatto un esperimento, invece di collegare il pin comune a massa gli ho dato 5v e i led hanno iniziato a lavorare come dovrebbero.

A questo punto sono un po cunfuso..........ma il pin di comando esce con una tensione di 5v? perche se ci metto due led normale funziona (come da schema) e se uso il bicolor NO?


Grazie

Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: gpb01 on May 15, 2019, 01:32 pm
... ti dicono qualche cosa le parole "Anodo comune" (common anode) o "Catodo comune" (common cathode)? ;)

Prova ad indagare e scopri quei tuoi LED bicolore di quale tipo sono :)

Guglielmo
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 15, 2019, 07:32 pm
Dovresti postare un link al tipo di led che hai comprato. Il mio schema elettrico si riferisce a led bicolori a catodo comune, o, come suggerisce Guglielmo, common cathode. Cerca su google.

Ciao,
P.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: Datman on May 15, 2019, 10:20 pm
Evidentemente sono ad anodo comune.
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: gpb01 on May 15, 2019, 10:37 pm
Evidentemente sono ad anodo comune.
Non trovi che sarebbe meglio che lo scoprisse da solo, magari imparando a leggere la documentazione tecnica (datasheet) ? ? ?  >:(

Guglielmo
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: big-ivan on May 29, 2019, 10:29 pm
Buonasera,
non sono scappato, sto solo aspettando la scatola e i pulsanti per terminare il progetto........

Grazie
Ivan
Title: Re: Cronometro particolare x gare di pattinaggio
Post by: pgiagno on May 29, 2019, 10:35 pm
E con i led come hai risolto ?

Ciao,
P.