#include "SPI.h"
#include "Adafruit_ILI9341.h"
#include "RTClib.h"
#define DC 9
#define CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(CS, DC);
RTC_DS1307 rtc;
char hari[7][6] = {"Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"};
int lastSecond = -1; // Per memorizzare l'ultimo secondo aggiornato
void setup () {
Serial.begin(9600);
// Inizializzazione del display
tft.begin();
tft.fillScreen(ILI9341_BLACK); // Pulisce lo schermo con sfondo nero
// Inizializzazione dell'RTC
if (! rtc.begin()) {
Serial.println("Lettura RTC fallita");
Serial.flush();
abort();
}
// Controlla se l'RTC ha perso l'alimentazione e imposta una data di default
if (!rtc.isrunning()) {
Serial.println("RTC non in esecuzione, imposto data di default!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Imposta la data di compilazione
}
// Lettura dell'ora corrente
DateTime now = rtc.now();
// Visualizzazione della data (viene aggiornata solo una volta)
tft.setCursor(10, 20);
tft.setTextColor(ILI9341_YELLOW);
tft.setTextSize(2);
tft.print("Data: ");
tft.print(now.day());
tft.print('/');
tft.print(now.month());
tft.print('/');
tft.print(now.year());
// Visualizzazione del giorno della settimana (viene aggiornato solo una volta)
tft.setCursor(10, 50);
tft.setTextColor(ILI9341_CYAN);
tft.setTextSize(2);
tft.print("Giorno: ");
tft.print(hari[now.dayOfTheWeek()]);
// Riserva lo spazio per l'ora (sarà aggiornata ogni secondo)
tft.setCursor(10, 80);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(4);
}
void loop () {
DateTime now = rtc.now();
// Aggiorna l'ora solo se il secondo è cambiato
if (now.second() != lastSecond) {
lastSecond = now.second();
// Posiziona il cursore nella posizione dell'ora e cancella la vecchia ora
tft.fillRect(10, 80, 200, 40, ILI9341_BLACK); // Cancella solo l'area dell'ora
// Visualizzazione dell'ora corrente
tft.setCursor(10, 80);
if (now.hour() < 10) tft.print('0'); // Aggiunge uno zero se l'ora è a singola cifra
tft.print(now.hour());
tft.print(':');
if (now.minute() < 10) tft.print('0'); // Aggiunge uno zero se i minuti sono a singola cifra
tft.print(now.minute());
tft.print(':');
if (now.second() < 10) tft.print('0'); // Aggiunge uno zero se i secondi sono a singola cifra
tft.print(now.second());
}
// Stampa anche sulla porta seriale
Serial.print("Data: ");
Serial.print(now.year());
Serial.print('/');
Serial.print(now.month());
Serial.print('/');
Serial.print(now.day());
Serial.print(" (");
Serial.print(hari[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.print(now.second());
Serial.println();
delay(1000); // Attende un secondo prima del prossimo aggiornamento
}