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 #include #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

2014-09-01-16.18.46 2014-09-01-20.49.20 P1020770 P1020772