#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h> // Per calcoli angolari
// Dimensioni del display OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Indirizzo I2C del display OLED
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = "Wokwi-GUEST"; // Cambia con il tuo SSID
const char* password = ""; // Cambia con la tua password Wi-Fi
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // Modifica a seconda del tuo fuso orario (3600 per UTC+1)
const int daylightOffset_sec = 3600; // Ora legale
// Funzione per disegnare l'orologio a lancette
void drawClock(int hour, int minute, int second, const char* date) {
// Posizione dell'orologio
int centerX = SCREEN_WIDTH / 2 + 20; // Aggiungi un offset di 10 pixel per spostare a destra
int centerY = SCREEN_HEIGHT / 2 - 5; // Spostato 10 pixel più in basso
// Raggio dell'orologio (schermo 64x128, quindi mettiamo il raggio a circa 25)
int radius = 25;
// Cancella lo schermo
display.clearDisplay();
// Disegna il contorno dell'orologio
display.drawCircle(centerX, centerY, radius, SSD1306_WHITE);
// Angolo delle lancette (in radianti)
float hourAngle = (hour % 12) * 30 + (minute / 2.0) - 90; // 30 gradi per ora, correzione per il formato 12 ore
float minuteAngle = (minute * 6) - 90; // 6 gradi per minuto
float secondAngle = (second * 6) - 90; // 6 gradi per secondo
// Calcolo delle posizioni delle lancette (utilizzando il seno e il coseno per ottenere le coordinate x e y)
int hourX = centerX + radius * 0.5 * cos(hourAngle * M_PI / 180);
int hourY = centerY + radius * 0.5 * sin(hourAngle * M_PI / 180);
int minuteX = centerX + radius * 0.8 * cos(minuteAngle * M_PI / 180);
int minuteY = centerY + radius * 0.8 * sin(minuteAngle * M_PI / 180);
int secondX = centerX + radius * 0.9 * cos(secondAngle * M_PI / 180);
int secondY = centerY + radius * 0.9 * sin(secondAngle * M_PI / 180);
// Disegna le lancette
display.drawLine(centerX, centerY, hourX, hourY, SSD1306_WHITE); // Lancetta delle ore
display.drawLine(centerX, centerY, minuteX, minuteY, SSD1306_WHITE); // Lancetta dei minuti
display.drawLine(centerX, centerY, secondX, secondY, SSD1306_WHITE); // Lancetta dei secondi
// Mostra la data in alto a sinistra
display.setTextSize(0); // Rimpicciolisci la dimensione del testo
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0); // Posizionamento fisso in alto a sinistra
display.print(date);
// Aggiorna il display
display.display();
}
void setup() {
Serial.begin(115200);
// Connessione Wi-Fi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
// Debug sulla connessione Wi-Fi
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi Connected");
} else {
Serial.println("WiFi Connection Failed");
}
// Inizializza il tempo
Serial.println("Configuring time...");
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Aggiungi un ritardo per dare tempo all'ESP32 di sincronizzarsi con il server NTP
delay(2000); // Attendi 2 secondi prima di ottenere l'ora
// Inizializzazione del display OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Errore nell'avvio del display OLED"));
for (;;);
}
display.clearDisplay();
}
void loop() {
// Recupera l'ora locale
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
// Format della data (giorno/mese/anno)
char date[11]; // Buffer per la data
strftime(date, sizeof(date), "%d/%m/%Y", &timeinfo);
// Disegna l'orologio a lancette e la data
drawClock(timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, date);
// Aspetta un secondo prima di aggiornare
delay(1000);
}
GND-5V-22-21