Va salut !
Aveam prin sertar, de la alte proiecte, un display de Nokia (3310/5110). Just for fun ... am facut un ceas cu Wemos D1 mini (da, iar Wemos 😁). Un punct de plecare pentru cei ce vor sa faca ceva mai complex. Enjoy !
#include <ESP8266WiFi.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <Fonts/FreeSansBold12pt7b.h> #include <time.h>
// Configurare Pini Nokia 5110: CLK=D5, DIN=D7, D/C=D6, CE=D1, RST=D2
Adafruit_PCD8544 display = Adafruit_PCD8544(14, 13, 12, 5, 4);
const char* ssid = "your_SSID";
const char* password = "your_PSW";
#define TZ_INFO "EET-2EEST,M3.5.0/3,M10.5.0/4"
const char* luni[] = {"IAN", "FEB", "MAR", "APR", "MAI", "IUN", "IUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
const char* zileComplete[] = {"DUMINICA", "LUNI", "MARTI", "MIERCURI", "JOI", "VINERI", "SAMBATA"};
void setup() {
display.begin();
display.setContrast(61);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(BLACK);
// 1. CONECTARE WIFI
display.setCursor(0, 0);
display.print("Conectare WiFi");
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
display.print(".");
display.display();
}
// 2. AFISARE DATE DUPA CONECTARE (SSID si IP)
display.clearDisplay();
display.setCursor(0, 0);
display.println("Conectat !");
display.println(" ");
display.println(WiFi.SSID());
display.println(" ");
display.println(WiFi.localIP().toString());
display.display();
delay(3000);
// 3. CONFIGURARE SI ASTEPTARE NTP
display.clearDisplay();
display.setCursor(0, 0);
display.print("Sincro timp...");
display.display();
configTime(0, 0, "pool.ntp.org", "ro.pool.ntp.org");
setenv("TZ", TZ_INFO, 1);
tzset();
// Asteptam pana cand timpul este sincronizat (anul > 1970)
time_t acum = time(nullptr);
while (acum < 8 * 3600 * 2) { // Asteapta pana cand data e valida
delay(500);
acum = time(nullptr);
display.print(".");
display.display();
}
display.clearDisplay();
display.setCursor(0, 0);
display.print("Sincro timp OK");
display.display();
delay(1000);
}
void loop() {
time_t acum = time(nullptr);
struct tm *ti = localtime(&acum);
display.clearDisplay();
display.setTextColor(BLACK);
// 1. DATA (Maxim stanga, primul rand)
display.setFont();
display.setCursor(0, 0);
if(ti->tm_mday < 10) display.print("0");
display.print(ti->tm_mday);
display.print("-");
display.print(luni[ti->tm_mon]);
display.print("-");
display.print((ti->tm_year + 1900) % 100);
// --- LOGICA DE ALINIERE SIMETRICĂ ORA (PIVOT LA PIXELUL 42=reper) ---
display.setFont(&FreeSansBold12pt7b);
int16_t x1, y1;
uint16_t w, h;
char buf[4]; // Buffer pentru conversia cifrelor in text
// A. ORELE (Aliniate la DREAPTA fata de reper)
sprintf(buf, "%d", ti->tm_hour); // %d afiseaza 1 cifra daca e sub 10
display.getTextBounds(buf, 0, 0, &x1, &y1, &w, &h);
int xOre = 34 - w;
display.setCursor(xOre, 30);
display.print(buf);
// B. PUNCTELE :
// Nota: setCursor(40) pare sa centreze vizual ":" din acest font la pixelul 42
if (ti->tm_sec % 2 == 0) {
display.setCursor(40, 30);
display.print(":");
}
// C. MINUTELE (Aliniate la STANGA fata de reper)
sprintf(buf, "%02d", ti->tm_min); // %02d pune mereu 0 in fata (ex: 05)
display.setCursor(48, 30);
display.print(buf);
// -----------------------------------------------------------
// 3. ZIUA (Maxim dreapta, ultimul rand)
display.setFont();
const char* ziuaAzi = zileComplete[ti->tm_wday];
int lungimeZi = strlen(ziuaAzi) * 6;
display.setCursor(84 - lungimeZi, 40);
display.print(ziuaAzi);
display.display();
delay(1000); // Rulăm la fiecare secundă pentru clipirea punctelor
}
Niciun comentariu:
Trimiteți un comentariu