// Dual Oled display WiFi clock and calendar
// by 2024 raphik
#include <time.h>
#include <WiFi.h>
#define NTP_SERVER "hora.roa.es"
#define TIME_ZONE "CET-1CEST,M3.5.0,M10.5.0/3"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
struct tm timeInfo;
// arrays of pointers
char* diaSemana[] = { "DOMINGO" ,"LUNES", "MARTES",
"MI""\220""RCOLES", "JUEVES", "VIERNES", "S""\217""BADO" };
char* mes[] = { "ENERO" ,"FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO",
"JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE" };
char* parteDelDia[] = { "MEDIANOCHE", "MADRUGADA",
"MA""\245""ANA", "MEDIODIA", "TARDE", "NOCHE"};
int lastMinute = -1;
int lastMday = -1;
boolean displayingDay = false;
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 dspClock(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
Adafruit_SSD1306 dspCalen(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
void setup() {
Serial.begin(115200);
Serial.println("¡Hola, ESP32-C3!");
// inicializa las pantallaa OLED
initOled();
// Enciende WiFi, conecta NTP, sincroniza reloj y apaga WiFi
getSynched();
printClock();
printCalen();
}
void loop() {
printClock();
delay(100);
}
void printCalen(void) {
if( timeInfo.tm_mday != lastMday ) {
lastMday = timeInfo.tm_mday;
dspCalen.clearDisplay();
dspCalen.setTextColor( WHITE, BLACK );
// visualiza mes
dspCalen.setTextSize(1);
int column = ( SCREEN_HEIGHT - ( 6 * strlen(mes[timeInfo.tm_mon]) ) ) / 2 ;
dspCalen.setCursor( column, 6 );
dspCalen.print( mes[timeInfo.tm_mon] );
// visualiza año
column = 20;
dspCalen.setCursor(column, 24);
dspCalen.print(1900+timeInfo.tm_year);
// visualiza dia del mes
dspCalen.setTextSize(5);
column = 4;
dspCalen.setCursor( column, 54 );
dspCalen.print(timeInfo.tm_mday);
// visualiza día de la semana
dspCalen.setTextSize(1);
column = ( SCREEN_HEIGHT - ( 6 * strlen(diaSemana[timeInfo.tm_wday] ) ) ) / 2 ;
dspCalen.setCursor( column, 110 );
dspCalen.print( diaSemana[timeInfo.tm_wday] );
dspCalen.display();
}
}
void printClock(void) {
getLocalTime(&timeInfo);
int column;
// visualiza la hora
if( timeInfo.tm_min != lastMinute ) {
lastMinute = timeInfo.tm_min;
dspClock.clearDisplay();
dspClock.setTextColor(WHITE, BLACK);
dspClock.setTextSize(4);
dspClock.setCursor(4, 30);
int hora = timeInfo.tm_hour;
if(hora > 12) hora -=12;
if(hora<10) dspClock.print(0);
dspClock.print(hora);
dspClock.print(":");
if(timeInfo.tm_min<10) dspClock.print(0);
dspClock.print(timeInfo.tm_min);
// visualiza la parte del día
dspClock.fillRect(0, 0, 127, 20, WHITE);
dspClock.setTextColor(BLACK, WHITE);
int index;
if( timeInfo.tm_hour==0 ) index = 0;
if( timeInfo.tm_hour>=1 && timeInfo.tm_hour < 6 ) index = 1;
if( timeInfo.tm_hour>=6 && timeInfo.tm_hour < 12 ) index = 2;
if( timeInfo.tm_hour==12 ) index = 3;
if( timeInfo.tm_hour>=13 && timeInfo.tm_hour < 21 ) index = 4;
if( timeInfo.tm_hour>=21 && timeInfo.tm_hour ) index = 5;
dspClock.setTextSize(2);
column = ( SCREEN_WIDTH - ( 12 * strlen(parteDelDia[index]) ) ) / 2 ;
dspClock.setCursor(column, 3);
dspClock.print(parteDelDia[index]);
dspClock.display();
}
return;
}
void initOled(void) {
// reloj en 0x3D
if(!dspClock.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
Serial.println(F("Pantalla de reloj no encontrada"));
while(true);
}
// calendario en 0x3C
if(!dspCalen.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Pantalla de calendario no encontrada"));
while(true);
}
// mensajes tranquilizadores
dspClock.clearDisplay();
dspClock.setTextSize(1);
dspClock.setTextColor(WHITE, BLACK);
dspClock.setTextSize(1);
dspClock.setCursor(0,0);
dspClock.print("Reloj WiFi");
dspClock.display();
dspCalen.setRotation(1);
dspCalen.clearDisplay();
dspCalen.setTextSize(1);
dspCalen.setTextColor(WHITE, BLACK);
dspClock.setCursor(0,2);
dspCalen.print("Calendario\n\nWiFi");
dspCalen.display();
}
void getSynched(void) {
Serial.println(F("Estableciendo conexión WiFi"));
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(250);
}
Serial.println(F("Conectando al servidor NTP"));
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
setenv("TZ", TIME_ZONE, 1);
tzset();
Serial.println(F("Esperando sincronización"));
while(!getLocalTime(&timeInfo));
Serial.println(F("¡Reloj sincronizado! Apagando WiFi"));
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
return;
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1
Loading
ssd1306
ssd1306
Loading
ssd1306
ssd1306