Ciao a tutti!
In questi giorni ho dedicato qualche minuto a giocherellare con i componenti che avevo sulla scrivania, e ne è saltato fuori questo simpatico e semplicissimo progetto.
Non è davvero nulla di speciale, però forse potrà tornare utile a qualcuno ed essere implementato in progetti più complessi.
Quello di cui vi sto parlando è un semplice cronometro realizzato con Arduino e pochissimi componenti:
- Un display i2c 16x2 della Seedstudio (da questo link dovrete scaricare la libreria ed installarla prima di poter caricare lo sketch)
- 2 pulsanti
- una breadboard
- cavetti vari
per il conteggio del tempo ho utilizzato la funzione Millis quindi non è stato necessario utilizzare un modulo RTC esterno perchè il tempo viene conteggiato sfruttando direttamente il clock di Arduino.
Appena recuperati i componenti possiamo iniziare a realizzare il progetto seguendo questo schema.
Fatto questo possiamo dare un'occhiata allo sketch.
Questo codice è forse un po' più lungo del solito ma non è complicato da comprendere.
Nel setup trovate il ciclo iniziale che appare sul display sostanzialmente finchè non premete un tasto.
Nel loop invece verrà letto lo stato dei pulsanti, salvato il valore della funzione millis dentro una variabile e gestito poi per ottenere il tempo istantaneo che vogliamo ottenere.
Infine c'è tutta la gestione del display, in quanto è necessario far spostare le scritte in base alla loro lunghezza per visualizzarle correttamente.
Copiate il codice che trovate qui sotto nell'IDE di Arduino e caricatelo nella vostra scheda.
- #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;
- }
- }
come al solito se avete domande scrivete pure un commento qui sotto,
cercherò di rispondervi il prima possibile,
Ciao!
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!
Ciao sono un neofita di arduino mi servireddeun cronometro tipo questo con la differenza che invece di comandarlo con due pulsanti dovrei utilizzare due coppie di fotocellule con la trasmissione del comando senza fili puoi farmi una lista dei componenti e uno schizzo dei collegamenti se è possibile
RispondiEliminaIo ho solo due coppie di fotocellule della faac
Se puoi rispondermi tramite mail all'indirizzo matteo.mengarelli@gmail.com
Grazie in anticipo per la tua pazienza e cortesia
Ciao, amch'io sono un neofita e sono interessato a questo progetto con la variante che ho bisogno del rilievo dell'intertempo quindi start, intertempo e stop. Uso come delle fotocellule da cancello automatico collegate tramite filo e se fosse possibile utilizzare un display più grande... Avrei bisogno di sapere se è fattibile ed un eventuale lista dei pezzi....
RispondiEliminase puoi rispondermi in pvt alla mail jordan75.rc@gmail.com
Grazie mille in anticipo.
Ciao Ragazzi, probabilmente questo è già il circuito che vi serve, infatti le fotocellule potrebbero semplicemente chiudere 2 contatti come fanno i pulsanti del mio circuito.
EliminaDipende tutto da come agiscono le fotocellule. Ciao!
una terza fotocellula per l'intertempo?
EliminaCiao! Sono un neofita della programmazione ma un po' di elettronica ci capisco.
RispondiEliminaDevo fare un cronometro come quello dei cellulari, a 3 bottoni: start, intertempo e stop. Non ho un numero definito di intertempi, per cui ogni volta che schiaccio quel bottone mi si forma una nuova variabile nella quale salvo il tempo. Inoltre il tempo vorrei dividerlo tra secondi e decimi con un punto o una virgola e vorrei leggere il tempo trascorso dallo start sempre e avere l'ultimo intertempo in un'altra riga. Scusa le tante domande ma non sono molto pratico di linguaggi di programmazione purtroppo.
Riccardo
Ciao! Vorrei fare un progetto simile al tuo, ma che mi calcoli il tempo di attività di un relay che sia accende e spegne secondo delle condizioni specifiche, come posso fare?
RispondiEliminaSalve Daniele ho visto questo tuo progetto e molto interessante. Avrei bisogno di costruire questo cronometro ma non sono pratico. Mi servirebbe comunque collegare un display grande con 5 cifre e vedere anche solo i secondi.Come posso contattarti? MI CHIAMO SIMONE SONO UN COMPOSITORE MUSICALE.ATTENDO UNA TUA CHIAMATA O CORTESE RISPOSTA
RispondiEliminaSimone.buso69@gmail.com è la mia e mail grazie
EliminaCiao, cosa intendi per display grande?
EliminaNumeri giganti come un display da 5 o 6 cifre
RispondiEliminaSono di Padova potresti costruirmi te un cronometro con display a 10 cifre per misurare anche solo i secondi da 1 a 10000 per contatti email simone.buso69@gmail.com grazie
RispondiEliminaè possibile creare un crono con diplay, mi basterebbero solo i secondi, per esame patente A? mi occore con start e stop automatico più dispaly che segna il tempo di effettuazione della prova.
RispondiEliminase ti interessa contattami a mattiarainieri@live.it
EliminaSalve? È possibile utilizzare un display più grande? In caso di risposta affermativa dove potrei trovarlo? Grazie mille
RispondiEliminasalve, perchè il cronometro non misura sotto il decimo di secondo? avrei necessità di misurare almeno il centesimo, è possibile modificare il codice?
RispondiEliminaQuando stoppi il tempo, ti restituisce i millesimi di secondo
Eliminami chiamo maurizio e il suo sketch non mi funziona anche copiandolo direttamente da qua.
RispondiEliminaMi dice il perche?
Buongiorno, in che senso non funziona? Riesce a caricarlo?
Eliminami da un errore su include rgb
RispondiElimina#include "rgb_lcd.h" mi da questo errore
RispondiEliminaHai installato la libreria indicata nell'articolo?
Elimina