PiumaLab

Idee, esperimenti, tentativi e molto altro

Conta il tempo trascorso con Arduino

Cercate un regalo nerd per il vostro anniversario? Questo può essere una buona idea, conta il tempo felice trascorso insieme. Appena si accende compare un messaggio che potrete personalizzare, poi inizierà a contare il tempo da una data iniziale impostata nel codice. Per la realizzazione è stato utilizzato arduino, Un display lcd 16x2 e un modulo Real Time Clock con batteria per tenere il conteggio del tempo anche in assenza di tensione.

Scatola

La scatola è stata realizzata tagliando un cartoncino. Il progetto della scatola si può scaricare ai link scatola-A4_1 e scatola-A4_2.

Sketchbook

Di seguito c'è il programma caricato su Arduino. Il codice è molto semplice soprattutto se già si conosce il C o il C++. Da notare che manca la funzione main(), l'esecuzione inizia invocando la funzione setup() una sola volta all'avvio del dispositivo e poi ciclicamente la funzione loop().

/* -*- mode: c -*- */
 
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
 
RTC_DS1307 RTC;
 
#define P1 10
#define P2 11
#define P3 12
 
#define START_DATE "Sep 01 2013"
#define START_TIME "23:00:00"
 
#define SECHOUR 3600       // sec in an hour (60 *60)
#define SECDAY 86400UL     // sec in a day (60 * 60 * 24)
#define SECYEAR 31536000UL // sec in a year  (SECDAY * 365)
 
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
void setup() {
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
   pinMode(P1, INPUT_PULLUP);
   pinMode(P2, INPUT_PULLUP);
   pinMode(P3, INPUT_PULLUP);
 
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
 
  show_message("  Ogni momento  ", "    insieme     ");
  show_message("e` un sorriso di", "gioia, allegria ");
  show_message("   felicita` e  ", "    croccole!   ");
  show_message("     Alessia    ", "   Amore  mio   ");
  show_message("      Buon      ", "  anniversario  ");
  delay(2000);
  lcd.clear();
}
 
void show_message(char *line1, char *line2) {
  lcd.setCursor(0, 0);
  lcd.print(line1);
  lcd.setCursor(0, 1);
  lcd.print(line2);
  delay(4000);
}
 
char* numbers[] = {"zero", "un", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove",
  "dieci", "undici", "dodici"};
 
unsigned long monthsSec[] = {
  0,
  2678400UL,
  5097600UL,
  7776000UL,
  10368000UL,
  13046400UL,
  15638400UL,
  18316800UL,
  20995200UL,
  23587200UL,
  26265600UL,
  28857600UL,
  31536000UL};
 
void loop() {
  lcd.setCursor(0, 0);
  if (digitalRead(P1) == 0)
    lcd.print("P1 ");
  if (digitalRead(P2) == 0)
    lcd.print("P2 ");
  if (digitalRead(P3) == 0)
    lcd.print("P3 ");
 
    DateTime now = RTC.now();
//    DateTime dtFrom = new DateTime(FROM_Y,FROM_M, FROM_D, FROM_hh, FROM_mm, FROM_ss);
    DateTime dtFrom(START_DATE, START_TIME);
 
    Serial.println(now.unixtime());
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
 
 //   unsigned long ts = now.unixtime() - dtFrom.unixtime();
    TimeSpan tsDiff = now - dtFrom;
 
    unsigned long years = tsDiff.totalseconds() / SECYEAR;
 
    unsigned long months;
    for (months = 0;
         months < 12 && years * SECYEAR + monthsSec[months] < tsDiff.totalseconds();
         months++)
      ;
 
    months = months - 1;
 
    unsigned long days = (tsDiff.totalseconds() - (years * SECYEAR + monthsSec[months])) / SECDAY;
 
 
    String line1 = "";
    String line2 = "";
    int nSpace;
 
    line1 = print_label_value(years, " anno ", " anni ");
    line1 += print_label_value(months, " mese", " mesi");
 
    Serial.println("line1: " + line1);
    Serial.print("line1 length: ");
    Serial.println(line1.length());
 
    // centring
    for (nSpace = 16 - line1.length(); nSpace > 0; nSpace -= 2)
      line1 = " " + line1;
 
    if (line1.length() > 16) {
       Serial.println(" * too long");
       // use numbers
       line1 = print_numeric_value(years, " anno ", " anni ");
       line1 += print_numeric_value(months, " mese", " mesi");
    }
 
    Serial.println();
 
    line2 = print_label_value(days, " giorno", " giorni");
 
    if (tsDiff.hours() > 0 || tsDiff.minutes() > 0) {
       if (line2.length() > 0)
          line2 = line2 + " ";
       if (tsDiff.hours() > 0)
          line2 = line2 + String(tsDiff.hours()) + "h";
       if (tsDiff.minutes() > 0)
          line2 = line2 + String(tsDiff.minutes()) + "m";
    }
 
    if (line2.length() > 16) {
       Serial.println(" * too long");
       // use numbers
       line2 = print_numeric_value(days, " giorno", " giorni");
 
       if (tsDiff.hours() > 0 || tsDiff.minutes() > 0) {
          if (line2.length() > 0)
             line2 = line2 + " ";
          if (tsDiff.hours() > 0)
             line2 = line2 + String(tsDiff.hours()) + "h";
          if (tsDiff.minutes() > 0)
             line2 = line2 + String(tsDiff.minutes()) + "m";
       }
    }
 
 
    // centring
    for (nSpace = 16 - line2.length(); nSpace > 0; nSpace -= 2)
      line2 = " " + line2;
 
    Serial.println("line2: " + line2);
    Serial.print("line2 length: ");
    Serial.println(line2.length());
 
    lcd.clear();
    lcd.print(line1);
    lcd.setCursor(0, 1);
    lcd.print(line2);
 
    Serial.println();
    delay(1000); // 1000 = 1 sec
}
 
String print_numeric_value(unsigned int n, char* singular, char* plural) {
  String buffer = "";
  if (n <= 0)
    return "";
 
  buffer = String(n);
 
  if (n == 1)
     buffer += singular;
  else
     buffer += plural;
 
  return buffer;
}
 
 
String print_label_value(unsigned int n, char* singular, char* plural) {
  String buffer = "";
  if (n <= 0)
    return "";
 
  buffer = print_char_number(n);
 
  if (n == 1)
     buffer += singular;
  else
     buffer += plural;
 
  return buffer;
}
 
String print_char_number(unsigned int n) {
   if (n > 0) {
      if (n < 12) {
          return numbers[n];
      }
      return String(n);
    }
}

Immagini

Leave a Reply

Your email address will not be published. Required fields are marked *