Semplice cronometro con Arduino


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.


  1. #include <Wire.h>
  2. #include "rgb_lcd.h"
  3. rgb_lcd lcd;
  4. int pinpuls1 = 10;
  5. int pinpuls2 = 11;
  6. int statopuls1;
  7. int statopuls2;
  8. unsigned long tempo_base;
  9. unsigned long tempo_cronometrato = 0;
  10. unsigned long tempo_congelato;
  11. unsigned long temposec;
  12. int flag = 1;
  13. void setup()
  14. {
  15.   delay(1000);
  16.   lcd.begin(162);
  17.   lcd.setRGB(255255255);
  18.   lcd.setCursor(00);
  19.   lcd.print("DanieleAlberti");
  20.   lcd.setCursor(131);
  21.   lcd.print(".It");
  22.   delay(3000);
  23.   lcd.clear();
  24.   lcd.setRGB(50100200);
  25.   lcd.setCursor(20);
  26.   lcd.print("Cronometrino");
  27.   pinMode (pinpuls1, INPUT_PULLUP);
  28.   pinMode (pinpuls2, INPUT_PULLUP);
  29. }
  30. void loop()
  31. {
  32.   statopuls1 = digitalRead (pinpuls1);
  33.   statopuls2 = digitalRead (pinpuls2);
  34.   if ((statopuls1 == LOW) && (flag < 2))
  35.   {
  36.     tempo_base = millis();
  37.     flag = 0;
  38.   }
  39.   if ((statopuls1 == LOW) && (flag == 2))
  40.   {
  41.     flag = 0;
  42.   }
  43.   if (flag == 0)
  44.   {
  45.     lcd.setRGB(20010000);
  46.     lcd.setCursor(00);
  47.     lcd.print("TEMPO  (secondi)");
  48.     lcd.setCursor(01);
  49.     lcd.print("PARTITO!    ");
  50.     tempo_cronometrato = millis() - tempo_base;
  51.     temposec = tempo_cronometrato / 1000;
  52.     if (temposec <= 9)
  53.     {
  54.       lcd.setCursor(121);
  55.       lcd.print("   ");
  56.       lcd.print(temposec);
  57.     }
  58.     if ((temposec > 9) && (temposec <= 99))
  59.     {
  60.       lcd.setCursor(121);
  61.       lcd.print("  ");
  62.       lcd.print(temposec);
  63.     }
  64.     if ((temposec > 99) && (temposec <= 999))
  65.     {
  66.       lcd.setCursor(121);
  67.       lcd.print(" ");
  68.       lcd.print(temposec);
  69.     }
  70.     if ((temposec > 999) && (temposec <= 9999))
  71.     {
  72.       lcd.setCursor(121);
  73.       lcd.print(temposec);
  74.     }
  75.   }
  76.   if (statopuls2 == LOW)
  77.   {
  78.     lcd.setRGB(1002000);
  79.     lcd.setCursor(00);
  80.     lcd.print("TEMPO (millisec)");
  81.     lcd.setCursor(01);
  82.     lcd.print("STOP!    ");
  83.     if ((tempo_cronometrato > 9) && (tempo_cronometrato <= 99))
  84.     {
  85.       lcd.setCursor(91);
  86.       lcd.print("     ");
  87.       lcd.print(tempo_cronometrato);
  88.     }
  89.     if ((tempo_cronometrato > 99) && (tempo_cronometrato <= 999))
  90.     {
  91.       lcd.setCursor(91);
  92.       lcd.print("    ");
  93.       lcd.print(tempo_cronometrato);
  94.     }
  95.     if ((tempo_cronometrato > 999) && (tempo_cronometrato <= 9999))
  96.     {
  97.       lcd.setCursor(91);
  98.       lcd.print("   ");
  99.       lcd.print(tempo_cronometrato);
  100.     }
  101.     if ((tempo_cronometrato > 9999) && (tempo_cronometrato <= 99999))
  102.     {
  103.       lcd.setCursor(91);
  104.       lcd.print("  ");
  105.       lcd.print(tempo_cronometrato);
  106.     }
  107.     if ((tempo_cronometrato > 99999) && (tempo_cronometrato <= 999999))
  108.     {
  109.       lcd.setCursor(91);
  110.       lcd.print(" ");
  111.       lcd.print(tempo_cronometrato);
  112.     }
  113.     if ((tempo_cronometrato > 999999) && (tempo_cronometrato <= 9999999))
  114.     {
  115.       lcd.setCursor(91);
  116.       lcd.print(tempo_cronometrato);
  117.     }
  118.     flag = 2;
  119.   }
  120. }


Questo è tutto,
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!

21 commenti:

  1. 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
    Io 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

    RispondiElimina
  2. 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....
    se puoi rispondermi in pvt alla mail jordan75.rc@gmail.com
    Grazie mille in anticipo.

    RispondiElimina
    Risposte
    1. 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.
      Dipende tutto da come agiscono le fotocellule. Ciao!

      Elimina
    2. una terza fotocellula per l'intertempo?

      Elimina
  3. Ciao! Sono un neofita della programmazione ma un po' di elettronica ci capisco.
    Devo 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

    RispondiElimina
  4. 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?

    RispondiElimina
  5. Salve 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

    RispondiElimina
  6. Numeri giganti come un display da 5 o 6 cifre

    RispondiElimina
  7. Sono 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
  8. è 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.

    RispondiElimina
  9. Salve? È possibile utilizzare un display più grande? In caso di risposta affermativa dove potrei trovarlo? Grazie mille

    RispondiElimina
  10. salve, perchè il cronometro non misura sotto il decimo di secondo? avrei necessità di misurare almeno il centesimo, è possibile modificare il codice?

    RispondiElimina
    Risposte
    1. Quando stoppi il tempo, ti restituisce i millesimi di secondo

      Elimina
  11. mi chiamo maurizio e il suo sketch non mi funziona anche copiandolo direttamente da qua.
    Mi dice il perche?

    RispondiElimina
    Risposte
    1. Buongiorno, in che senso non funziona? Riesce a caricarlo?

      Elimina
  12. #include "rgb_lcd.h" mi da questo errore

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post