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!

Segui Daniele Alberti su Google+!


4 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

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

Related Posts Plugin for WordPress, Blogger...