#include "SPI.h"
#include "Adafruit_ILI9341.h"
#include "RTClib.h"
#include "DHT.h" // Libreria per il sensore DHT
// Definizione dei pin e parametri del display e DHT22
#define DC 9
#define CS 10
#define DHTPIN 2 // Pin collegato al DHT22
#define DHTTYPE DHT22 // Definiamo il tipo di sensore (DHT22)
Adafruit_ILI9341 tft = Adafruit_ILI9341(CS, DC);
DHT dht(DHTPIN, DHTTYPE);
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
}
// Inizializzazione del sensore DHT22
dht.begin();
// 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()]);
}
void loop () {
DateTime now = rtc.now();
// Aggiorna l'ora solo se il secondo è cambiato
if (now.second() != lastSecond) {
lastSecond = now.second();
// Cancella solo l'area dell'ora
tft.fillRect(10, 80, 200, 40, ILI9341_BLACK);
// Visualizzazione dell'ora corrente
tft.setCursor(10, 80);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(4);
if (now.hour() < 10) tft.print('0');
tft.print(now.hour());
tft.print(':');
if (now.minute() < 10) tft.print('0');
tft.print(now.minute());
tft.print(':');
if (now.second() < 10) tft.print('0');
tft.print(now.second());
}
// Lettura del sensore DHT22 ogni secondo
float temperatura = dht.readTemperature();
float umidita = dht.readHumidity();
// Se la lettura è valida, aggiorna il display
if (!isnan(temperatura) && !isnan(umidita)) {
// Cancella solo l'area della temperatura e umidità
tft.fillRect(10, 130, 240, 30, ILI9341_BLACK);
// Visualizzazione della temperatura e umidità sul display
tft.setCursor(10, 130);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.print("Temp: ");
tft.print(temperatura);
tft.print(" C ");
tft.setCursor(10, 160);
tft.setTextColor(ILI9341_BLUE);
tft.print("Umid: ");
tft.print(umidita);
tft.print(" %");
}
// Stampa su Serial Monitor
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.print(" - Temp: ");
Serial.print(temperatura);
Serial.print(" C, Umid: ");
Serial.print(umidita);
Serial.println(" %");
delay(1000); // Attende un secondo prima del prossimo aggiornamento
}