Modulo orologio con Arduino

Modulo orologio con Arduino

Il nostro Arduino è davvero completo di tutto. Vediamo oggi come possiamo usarlo come un orologio tramite il modulo RTC (nel mio caso DS1307 ma ne esistono davvero tanti).

Innanzitutto cos’è il modulo RTC? Questo modulo RTC è un orologio a tutti gli effetti. Una volta memorizzato l’orario continua a scandire il tempo anche in assenza di alimentazione grazie ad una batteria tampone. Arduino può quindi sapere l’orario e la data attuale tramite di esso.

Circuito

Il circuito è davvero semplice. Il modulo normalmente ha 4 o 5 pin:

  • Vcc = 5V Arduino
  • GND = GND Arduino
  • SDA = SDA Arduino
  • SCL = SCL Arduino
  • SQW = non lo usiamo in questo esempio

Acquistare il modulo

Codice

Anche il codice è davvero semplice. Scarichiamo una delle RTC Libraries presenti nello store di librerie di Arduino IDE (Cerchiamo ad esempio: “DS1307” e scarichiamo la libreria RTC di Manjunath).

Librerie dell’IDE

Dopo aver installato la libreria potremo accedere ad una serie di esempi tra cui uno per leggere l’ora e uno per impostarla.

Vediamo prima il codice per impostare l’ora.

#include <Wire.h>
#include <RTC.h>

static DS1307 RTC;

void setup()
{
  Serial.begin(9600);
  RTC.begin();

  //RTC.setHourMode(CLOCK_H12);
  RTC.setHourMode(CLOCK_H24);

  if (RTC.getHourMode() == CLOCK_H12)
  {
     RTC.setMeridiem(HOUR_PM);
  }
/*
  RTC.setDay(13);
  RTC.setMonth(05);
  RTC.setYear(2020);

  RTC.setHours(9);
  RTC.setMinutes(47);
  RTC.setSeconds(56);
*/
  RTC.setWeek(6);

  RTC.setDate(14,11,20);
  RTC.setTime(11,54,30);
}

void loop()
{
  switch (RTC.getWeek())
  {
    case 1:
      Serial.print("SUN");
      break;
    case 2:
      Serial.print("MON");
      break;
    case 3:
      Serial.print("TUE");
      break;
    case 4:
      Serial.print("WED");
      break;
    case 5:
      Serial.print("THU");
      break;
    case 6:
      Serial.print("FRI");
      break;
    case 7:
      Serial.print("SAT");
      break;
  }
  Serial.print(" ");
  Serial.print(RTC.getDay());
  Serial.print("-");
  Serial.print(RTC.getMonth());
  Serial.print("-");
  Serial.print(RTC.getYear());

  Serial.print(" ");

  Serial.print(RTC.getHours());
  Serial.print(":");
  Serial.print(RTC.getMinutes());
  Serial.print(":");
  Serial.print(RTC.getSeconds());
  Serial.print(" ");

  if (RTC.getHourMode() == CLOCK_H12)
  {
    switch (RTC.getMeridiem()) {
      case HOUR_AM :
        Serial.print(" AM");
        break;
      case HOUR_PM :
        Serial.print(" PM");
        break;
    }
  }
  Serial.println("");
  delay(1000);
}

Qui vediamo che possiamo impostare l’orologio a 12 o 24h, possiamo impostare la data, l’ora e il giorno della settimana (1-7).

Dopo aver caricato lo sketch con l’orario corretto NON ricaricare questo sketch e non togliere l’alimentazione ad Arduino poichè, quando questo verrà ricaricato o rialimentato, l’orario sarà impostato nuovamente all’orario definito nello sketch.

Dobbiamo quindi caricare un secondo sketch che semplicemente mostra l’orario.

#include <Wire.h>
#include <RTC.h>

static DS1307 RTC;

void setup()
{
  Serial.begin(9600);
  RTC.begin();

  Serial.println();
  Serial.println("*** RTC 1307 ***");
  Serial.print("Is Clock Running : ");
  if (RTC.isRunning())
    Serial.println("Yes");
  else
    Serial.println("No. Time may be Inaccurate");
  Serial.print("Hour Mode : ");
  if (RTC.getHourMode() == CLOCK_H24)
    Serial.println("24 Hours");
  else
    Serial.println("12 Hours");
  Serial.print("Is Out Pin Enabled : ");
  if (RTC.isOutPinEnabled())
    Serial.println("Yes");
  else
    Serial.println("No");

  Serial.print("Is SQWE Enabled : ");
  if (RTC.isSqweEnabled())
    Serial.println("Yes");
  else
    Serial.println("No");


}

void loop()
{

  switch (RTC.getWeek())
  {
    case 1:
      Serial.print("SUN");
      break;
    case 2:
      Serial.print("MON");
      break;
    case 3:
      Serial.print("TUE");
      break;
    case 4:
      Serial.print("WED");
      break;
    case 5:
      Serial.print("THU");
      break;
    case 6:
      Serial.print("FRI");
      break;
    case 7:
      Serial.print("SAT");
      break;
  }
  Serial.print(" ");
  Serial.print(RTC.getDay());
  Serial.print("-");
  Serial.print(RTC.getMonth());
  Serial.print("-");
  Serial.print(RTC.getYear());

  Serial.print(" ");

  Serial.print(RTC.getHours());
  Serial.print(":");
  Serial.print(RTC.getMinutes());
  Serial.print(":");
  Serial.print(RTC.getSeconds());
  if (RTC.getHourMode() == CLOCK_H12)
  {
    switch (RTC.getMeridiem())
    {
      case HOUR_AM :
        Serial.print(" AM");
        break;
      case HOUR_PM :
        Serial.print(" PM");
        break;
    }
  }
  Serial.println();
  delay(1000);


}

Ecco qui sotto il risultato.

Qualche manuale dedicato ad Arduino

Share This:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.