vineri, 27 februarie 2026

Ceas cu termometru, display LCD, emitator WiFi

 Va salut !

Tot cu ajutorul AI am realizat un ceas, cu Wemos D1 mini, care afiseaza pe un dispay LCD si temperatura citita cu SHT40, transmisa din exteriorul locuintei, tot de un Wemos D1 mini . Dupa muuuulte teste si muuuuulte buguri rezolvate, pot spune ca  functioneaza foarte bine, nu am mai gasit nicio problema.Trecerea la ora de vara/iarna se face automat.

Ceasul propriu-zis il alimentez dintr-un alimentator de telefon mobil, de 5 volti. Emitatorul este alimentat dintr-un acumulator Li-Ion, a carui tensiune este citita periodic ; daca scade sub pragul critic, apare mesajul "ACCU" pe displayul ceasului. Consumul emitatorului este foarte mic pentru ca transmisia temperaturii se face o data la 5 minute, dupa care montajul intra in deep sleep. Alimentarea se face cu un IC specializat, HT7333. 

UPDATE 12/03/2026 (bug conectare corectat). 

UPDATE 28/03/2026 - Modificand putin codul si folosind aplicatia BLYNK pot vedea temperatura pe telefonul mobil, de oriunde. Inclusiv graficul evolutiei zilnice, saptamanala, lunara 


 

 


 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <TFT_eSPI.h>
#include <TimeLib.h>
#include <Timezone.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

TFT_eSPI display = TFT_eSPI();
ESP8266WebServer server(80);
WiFiUDP ntpUDP;

// Actualizare NTP la 24 ore (86400000 ms) - offset 0, primim UTC
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 0, 86400000);

const char* ssid = "your_SSID";
const char* password = "your_PSW";

// Reguli DST pentru București - ORDINE CORECTĂ: Standard (EET) apoi Daylight (EEST)
TimeChangeRule EET = {"EET", Last, Sun, Oct, 3, 120}; // Standard: UTC+2 (iarnă)
TimeChangeRule EEST = {"EEST", Last, Sun, Mar, 3, 180}; // Daylight: UTC+3 (vară)
Timezone Bucharest(EET, EEST); // Constructor: (standard, daylight)

const char* zileAbrev[] = {"DU", "LU", "MA", "MI", "JO", "VI", "SA"};
const char* luni[] = {"IAN", "FEB", "MAR", "APR", "MAI", "IUN", "IUL", "AUG", "SEP", "OCT", "NOV", "DEC"};

float receivedTemp = 0.0;
bool lowBattery = false;
bool timeInitialized = false;

// Variabilă pentru tracking reconectare WiFi
unsigned long lastWiFiAttempt = 0;
const unsigned long WIFI_RECONNECT_INTERVAL = 10000; // 10 secunde între încercări

void handleUpdate() {
if (server.hasArg("temp")) {
float v = server.arg("temp").toFloat();
if (v >= -50 && v <= 100) receivedTemp = v;
}
lowBattery = (server.hasArg("bat") && server.arg("bat") == "LOW");
server.send(200, "text/plain", "OK");
}

unsigned long prevDisplay = 0;


void displayInfo() {
time_t utc = timeClient.getEpochTime();

// Dacă nu am obținut NICIODATĂ ora corectă, afișăm "Sincronizare..."
if (!timeInitialized) {
display.fillScreen(TFT_BLACK);
display.setTextColor(TFT_WHITE, TFT_BLACK);
display.setFreeFont(&FreeSansBold12pt7b);
display.setTextDatum(MC_DATUM);
display.drawString("Sincronizare...", 120, 100);
return;
}

// AVEM ORA VALIDĂ - afișăm ceasul (chiar dacă WiFi pică între timp)
time_t local = Bucharest.toLocal(utc);
tmElements_t tm;
breakTime(local, tm);

int dd=tm.Day, mm=tm.Month-1, wd=tm.Wday-1, h=tm.Hour, m=tm.Minute, s=tm.Second;

static int lh=-1, lm=-1;
if (h!=lh || m!=lm) {
display.fillRect(20,80,220,80,TFT_BLACK);
display.setTextFont(7);
display.setTextColor(TFT_CYAN,TFT_BLACK);
display.setTextDatum(TR_DATUM);
display.drawString(String(h)+":"+(m<10?"0":"")+String(m), 175, 95);
lh=h; lm=m;
}

static String ls="";
String sec=(s<10?"0":"")+String(s);
if (sec!=ls) {
display.setFreeFont(&FreeSansBold12pt7b);
display.setTextDatum(MC_DATUM);
display.setTextColor(TFT_CYAN,TFT_BLACK);
display.fillRect(173,100,60,30,TFT_BLACK);
display.drawString(sec,190,105);
ls=sec;
}

static String ld="";
String dat=String(dd)+"-"+String(luni[mm]);
if (dat!=ld) {
display.setFreeFont(&FreeSansBold12pt7b);
display.setTextDatum(TL_DATUM);
display.setTextColor(TFT_GREEN,TFT_BLACK);
display.fillRect(10,25,100,25,TFT_BLACK);
display.drawString(dat,0,25);
ld=dat;
}

static String lt="";
String tmp=String(receivedTemp,1)+"'C";
if (tmp!=lt || receivedTemp==0.0) {
display.fillRect(233-90,25-2,90,25,TFT_BLACK);
display.setFreeFont(&FreeSansBold12pt7b);
display.setTextDatum(TR_DATUM);
display.setTextColor(TFT_PURPLE,TFT_BLACK);
display.drawString("'C",233,25);
display.setTextColor(TFT_YELLOW,TFT_BLACK);
display.drawString(String(receivedTemp,1),233-display.textWidth("'C"),25);
lt=tmp;
}

static bool lb=false;
if (lowBattery!=lb) {
display.fillRect(95,17,50,20,TFT_BLACK);
if (lowBattery) {
display.setTextFont(2);
display.setTextDatum(MC_DATUM);
display.setTextColor(TFT_RED,TFT_BLACK);
display.drawString("ACCU",120,25);
}
lb=lowBattery;
}

static int lw=-1;
int cw=(wd==0)?6:wd-1;
if (cw!=lw) {
display.fillRect(0,185,240,30,TFT_BLACK);
display.setFreeFont(&FreeSansBold9pt7b);
display.setTextDatum(MC_DATUM);
int pz[]={10,50,90,125,155,185,220};
for (int i=0;i<7;i++) {
int zi=(i+1)%7;
uint16_t c=(i==cw)?(zi==0||zi==6?TFT_RED:TFT_GREEN):TFT_DARKGREY;
display.setTextColor(c,TFT_BLACK);
display.drawString(zileAbrev[zi],pz[i],200);
}
lw=cw;
}
}

// =====================================================
// SETUP() - CORECTAT PENTRU ROUTER LENT
// =====================================================
void setup() {
display.init();
display.setRotation(3);
display.fillScreen(TFT_BLACK);
display.setTextColor(TFT_WHITE, TFT_BLACK);
display.setFreeFont(&FreeSansBold12pt7b);
display.setTextDatum(MC_DATUM);
display.drawString("Starting...", 120, 100);

// Curățare credențiale WiFi pentru conexiune proaspătă
WiFi.persistent(false);
delay(1000);
WiFi.disconnect(true);
delay(1000);
WiFi.mode(WIFI_OFF);
delay(1000);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

// 1. Conectare la Router (WiFi) - EXTINS LA 60 SECUNDE PENTRU ROUTER LENT
int attempts = 0;
const int maxAttempts = 15; // 15 x 4s = 60 secunde (suficient pentru router lent)
while (WiFi.status() != WL_CONNECTED && attempts < maxAttempts) {
attempts++;
display.fillScreen(TFT_BLACK);
display.drawString("Conectare WiFi", 120, 100);
// display.drawString(String(attempts) + "/" + String(maxAttempts), 120, 140);
display.drawString("Astept router...", 120, 170);
delay(4000);
yield(); // ESP8266 WDT friendly
}

if (WiFi.status() != WL_CONNECTED) {
display.fillScreen(TFT_BLACK);
display.setTextColor(TFT_RED, TFT_BLACK);
display.drawString("Eroare WiFi", 120, 100);
display.drawString("Reboot in 10s...", 120, 140);
// Așteptăm 10 secunde înainte de reboot (poate routerul a pornit între timp)
for (int i = 10; i > 0; i--) {
display.drawString(String(i) + "s", 120, 170);
delay(4000);
yield();
}
ESP.restart();
}

// 2. WiFi conectat - Începem verificarea INTERNET (NTP)
display.fillScreen(TFT_BLACK);
display.drawString("Verificare NET", 120, 100);
display.drawString(" Astept NTP", 120, 140);
delay(4000);
timeClient.begin();

// 3. VERIFICARE INTERNET REAL prin NTP (maxim 20 secunde)
int ntpAttempts = 0;
while (!timeInitialized && ntpAttempts < 20) {
if (timeClient.update()) {
time_t epoch = timeClient.getEpochTime();
// Validare epoch : după 1 Ian 2020 și înainte de overflow 2038
if (epoch > 1577836800 && epoch < 2147483647) {
setTime(epoch); // Sincronizează TimeLib cu NTP!
timeInitialized = true;
break;
}
}
ntpAttempts++;
display.fillScreen(TFT_BLACK);
display.drawString("Sincronizare NTP", 120, 100);
display.drawString(String(ntpAttempts) + "/20", 120, 140);
delay(1000);
yield(); // ESP8266 WDT friendly
}

if (!timeInitialized) {
// NTP a eșuat - nu avem internet real
display.fillScreen(TFT_BLACK);
display.setTextColor(TFT_RED, TFT_BLACK);
display.drawString("Eroare NET", 120, 100);
display.drawString("NTP Esuat", 120, 130);
display.drawString("Reboot in 5s", 120, 160);
for (int i = 5; i > 0; i--) {
display.drawString(String(i) + "s", 120, 190);
delay(1000);
yield();
}
ESP.restart();
}

// 4. SUCCES - Acum afișăm "WiFi Conectat" și IP (DOAR după NTP OK)
display.fillScreen(TFT_BLACK);
display.setTextColor(TFT_GREEN, TFT_BLACK);
display.drawString("WiFi Conectat", 120, 80);
display.setTextColor(TFT_WHITE, TFT_BLACK);
display.drawString(WiFi.SSID(), 120, 110);
display.drawString(WiFi.localIP().toString(), 120, 140);
display.drawString("Start ceas...", 120, 180);

server.on("/update", handleUpdate);
server.begin();
delay(4000);

// 5. Curățare ecran înainte de loop
display.fillScreen(TFT_BLACK);
}

// =====================================================
// LOOP() - ADĂUGATĂ RECONECTARE WIFI AUTOMATĂ
// =====================================================
void loop() {
server.handleClient();

// Reconectare automată dacă WiFi se pierde
if (WiFi.status() != WL_CONNECTED) {
if (millis() - lastWiFiAttempt > WIFI_RECONNECT_INTERVAL) {
display.setTextColor(TFT_ORANGE, TFT_BLACK);
display.setTextDatum(MC_DATUM);
display.setFreeFont(&FreeSansBold9pt7b);
display.drawString("Reconectare...", 120, 220);

WiFi.reconnect(); // Încearcă reconectarea
lastWiFiAttempt = millis();
}
yield(); // ESP8266 WDT friendly
return; // Skip rest until reconnected
}

// WiFi este conectat - actualizăm NTP (librăria gestionează intervalul de 24h)
if (timeClient.update()) {
time_t epoch = timeClient.getEpochTime();
if (epoch > 1577836800 && epoch < 2147483647) {
setTime(epoch); // Menține TimeLib sincronizat
timeInitialized = true;
}
}

// Afișare ceas la fiecare secundă
if (millis() - prevDisplay >= 1000) {
prevDisplay = millis();
displayInfo();
}

yield(); // ESP8266 WDT friendly - obligatoriu în loop
}
<10 175="" 95="" lh="h;" lm="m;" ls="" m="" sec="(utc" secunde="" static="" string="" tring=""><10 dat="(utc" display.drawstring="" display.fillrect="" display.setfreefont="" display.settextcolor="" display.settextdatum="" if="" ld="" ls="sec;" reesansbold12pt7b="" s="" sec="" static="" string="" tring=""><7 -="" 100="" 120="" 140="" 1="" 1ms="" 2="" a="" actualizare="" afi="" am="" attempts="" blocheaz="" bucla="" c="" conectare="" const="" critic:="" cu="" curent="" da="" dac="" de="" delay="" display.drawstring="" display.fillscreen="" display.init="" display.setfreefont="" display.setrotation="" display.settextcolor="" display.settextdatum="" doar="" eaz="" eboot...="" ecran="" else="" epuizat="" erial.print="" eroare="" esp.restart="" ex:="" excep="" f="" fiecare="" handleupdate="" i="" if="" ifi.localip="" ifi.status="" ii="" int="" intervale="" ional:="" it="" itera="" la="" loop="" lw="cw;" m="" mai="" maxattempts="" millis="" mult="" ncerc="" ncercarea:="" ncercarea="" niciodat="" non-blocking="" ntp="" ntre="" nu="" onectare="" onectat="" op="" password="" pe="" pentru="" prevntp="" pz="" r="" reesansbold12pt7b="" reu="" ri="" ro="" roare="" routerului="" sau="" secund="" serial.begin="" serial.println="" server.begin="" server.handleclient="" server.on="" setup="" ssid="" string="" teapt="" tentativele="" tft_black="" timeclient.begin="" timeclient.update="" timp="" tostring="" tring="" u="" uint16_t="" update="" verific="" void="" while="" wifi...="" wifi.begin="" wifi.mode="" wifi="" wl_connected="" zi="" zileabrev="">

joi, 26 februarie 2026

Statie meteo cu Wemos D1 mini si ST7735

Va salut ! Fiindca o lunga perioada de timp am fost in concediu medical, dupa o afectiune oncologica ce a necesitat operatie, in timpul liber disponibil am lucrat la o serie de proiecte, care sa-mi tina mintea distrasa de la alte ganduri ... Cu ajutorul AI (Vercel, Perplexity, Gemini, Qwen, Le Chat) am conceput si finalizat, dupa multe, multe incercari si aceasta statie meteo color. Functioneaza foarte bine, prietenul meu, Dragos, o are "activa" si e multumit de ea. Nota : am experimentat cu datele meteo de pe toate siteurile care pun la dispozitie apiKey. Nu sunt doua la fel !! Exista mari variatii, in special in privinta temperaturii, dar, la unele siteuri, si la starea vremii propriu-zisa (afara era soare, senin si prognoza era innorat, sanse de ploaie :( ). Acesta este si motivul pentru care eu nu folosesc aceasta statie, prefer ceasul cu termometru (ce poate fi vazut tot aici, pe blog). Cine doreste poate face statia, ideea este sa va obtineti propriul apiKey (google_it) si sa va setati locatia. Succes !
//Statie meteo cu ST7735


#include <SPI.h>
#include <TimeLib.h>
#include <ArduinoJson.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <time.h>
#include "OpenWeatherMapCurrent.h"
#include <WiFiUdp.h>
#include <Fonts/FreeMonoBold12pt7b.h>
#include <Fonts/FreeMono12pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSansBold18pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>

miercuri, 25 februarie 2026

Ceas Matrix cu termometru

 Va salut !

Si inca un montaj cu excelentul Wemos D1 mini : ceas cu matrice de leduri, cu senzor de temperatura DS18B20.  Are efect de scroll a afisarii. Testat, functioneaza perfect. L-am montat in bucatarie, iar senzorul de temperatura l-am scos in balcon. Succes !

 


 




 

 

 

// Ceas matrice LED cu ora automata vara/iarna + DS18B20 
// Conexiuni : DS18B20 la D2 ; matrice DIN - D8 ; CS - D7 ; CLK - D6

#include <ESP8266WiFi.h>
#include <time.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>

luni, 23 februarie 2026

Ceas LCD 2x16 cu termometru

 Va salut !

Si inca un montaj cu Wemos D1 mini (sper ca nu v-am plictisit !). Un ceas cu termometru (DS18B20), cu display LCD 2x16, conectare la WiFi. Functioneaza perfect, de multa vreme. 

 


//ceas cu termometru, ora iarna/vara, cu modificari AI
//
// vers.febr.2026-bug fixed
//
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <time.h>
#include <LiquidCrystal_I2C.h>

// --- CONFIGURARE ---
#define ONE_WIRE_BUS D3
const char* ssid = "your_SSID";
const char* password = "your_PSW";
const char* TZ_INFO = "EET-2EEST,M3.5.0/3,M10.5.0/4";
#define WIFI_RETRY_LIMIT 15
#define WIFI_RETRY_DELAY 1000

// Obiecte Globale
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

byte customDegreeC[] = {
0x08, 0x14, 0x08, 0x07,
0x08, 0x08, 0x07, 0x00
};

tm timeinfo;
time_t now;
String StrTempC = "---";
int prevSec = -1;
float tempSum = 0;
int tempCount = 0;
#define TEMP_SAMPLES 5
unsigned long lastSensorMillis = 0;

char* getDOW(uint8_t tm_wday) {
switch (tm_wday) {
case 1: return (char*)"Luni"; case 2: return (char*)"Marti"; case 3: return (char*)"Miercuri";
case 4: return (char*)"Joi"; case 5: return (char*)"Vineri"; case 6: return (char*)"Sambata";
case 0: return (char*)"Duminica"; default: return (char*)"Error";
}
}

void showTimeDateTemp(tm *localTime) {
char oraStr[9];
sprintf(oraStr, "%02d:%02d:%02d", localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
String tVal = StrTempC;
while (tVal.length() < 5) tVal = " " + tVal;
int spatiiMijloc1 = 16 - 8 - 6;
lcd.setCursor(0, 0);
lcd.print(oraStr);
for(int i=0; i < spatiiMijloc1; i++) lcd.print(" ");
lcd.print(tVal);
if (StrTempC != "Err") lcd.write(0); else lcd.print(" ");

char dataStr[6];
sprintf(dataStr, "%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1);
char* dow = getDOW(localTime->tm_wday);
int spatiiMijloc2 = 16 - 5 - strlen(dow);
lcd.setCursor(0, 1);
lcd.print(dataStr);
for(int i=0; i < spatiiMijloc2; i++) lcd.print(" ");
lcd.print(dow);
}

void setup() {
sensors.begin();
sensors.setWaitForConversion(false); // REPARĂ BUG-UL: Nu mai blochează procesorul
Serial.begin(115200);
Wire.begin(4, 5);
delay(1000);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.createChar(0, customDegreeC);

lcd.setCursor(0, 0);
lcd.print("Conectare WiFi..");
WiFi.begin(ssid, password);
int incercari = 0;
while (WiFi.status() != WL_CONNECTED && incercari < WIFI_RETRY_LIMIT) {
delay(WIFI_RETRY_DELAY);
lcd.setCursor(0, 1);
lcd.print("Incercari: "); lcd.print(incercari + 1);
incercari++;
}

if (WiFi.status() == WL_CONNECTED) {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("WiFi:"); lcd.print(WiFi.SSID());
lcd.setCursor(0, 1); lcd.print("IP:"); lcd.print(WiFi.localIP());
delay(3000);
} else {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Eroare WiFi !");
lcd.setCursor(0, 1); lcd.print("Resetare ...");
delay(5000);
ESP.restart();
}

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sincro timp...");
configTime(0, 0, "pool.ntp.org", "ro.pool.ntp.org");
setenv("TZ", TZ_INFO, 1);
tzset();

int ntp_timeout = 0;
time_t acum = time(nullptr);
struct tm *ti = localtime(&acum);
while (ti->tm_year < 120 && ntp_timeout < 30) {
delay(1000); acum = time(nullptr); ti = localtime(&acum);
lcd.setCursor(ntp_timeout % 16, 1); lcd.print(".");
ntp_timeout++;
}
if (ti->tm_year < 120) ESP.restart();
lcd.clear();
}

void loop() {
time(&now);
localtime_r(&now, &timeinfo);

// Afisare imediata la schimbarea secundei (fara blocaj)
if (timeinfo.tm_sec != prevSec) {
showTimeDateTemp(&timeinfo);
prevSec = timeinfo.tm_sec;
}

// Gestionare senzor fara a opri timpul in loc
if (millis() - lastSensorMillis >= 2000) {
float t = sensors.getTempCByIndex(0); // Citeste valoarea deja calculata
if (t <= -126.0 || t >= 85.0) {
StrTempC = "Err";
tempCount = 0; tempSum = 0;
} else {
tempSum += t;
tempCount++;
if (tempCount >= TEMP_SAMPLES) {
StrTempC = String(tempSum / TEMP_SAMPLES, 1);
tempSum = 0; tempCount = 0;
}
}
sensors.requestTemperatures(); // Porneste noua conversie "in fundal"
lastSensorMillis = millis();
}
}

Ceas LCD 4x20 cu termometru

 La cererea prietenului Doru, am modificat ceasul prezentat anterior, astfel incat afisarea orei sa se faca folosind caractere mai mari. Iata ce a iesit. 


 

 

 

#ifdef ESP8266
#include 
#else
#include 
#endif
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <time.h>
#include <LiquidCrystal_I2C.h>

duminică, 22 februarie 2026

O simpla statie meteo cu display OLED

Va salut ! Actualizez blogul cu o simpla "statie meteo" (denumire cam pompoasa...), creata cu un Wemos D1 mini (da, am multe montaje cu aceasta mica bijuterie !) si un display OLED SH1106. Datele meteo sunt furnizate de OpenWeather. Necesita imbunatatiri (ora automata vara/iarna), dar este un punct de plecare pentru cine vrea sa experimenteze. Succes !! 

 




 


//cu date meteo de la OpenWeather


#include "Arduino.h"
#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
#include <SH1106Wire.h>
#include <ESP8266HTTPClient.h> // Definirea pinilor pentru display OLED #define OLED_SDA D2 #define OLED_SCL D1 // Inițializarea display-ului OLED SH1106Wire display(0x3c, OLED_SDA, OLED_SCL); // Definirea serverului NTP și offset-ului de timp WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 7200, 60000); const char* ssid = "your_ssid"; // Introduceti numele retelei WiFi const char* password = "your_psw"; // Introduceti parola retelei WiFi const char* zileleSaptamanii[] = {"Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"}; const String apiKey = "6d34f8b43ddcbe03xxxxxxxxxxxxxxxxxxxxxxxx"; //creati-va propriu apiKey !!! const String city = "Ploiesti"; // setati-va locatia !!! String temperatura = ""; String stareVreme = ""; String formatTime(int hh, int mm, int ss) { String timeStr = ""; if (hh < 10) timeStr += "0"; timeStr += String(hh) + ":"; if (mm < 10) timeStr += "0"; timeStr += String(mm) + ":"; if (ss < 10) timeStr += "0"; timeStr += String(ss); return timeStr; } void setup() { Serial.begin(115200); // Conectare la WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Se conecteaza la WiFi..."); } Serial.println("Conectat la WiFi"); timeClient.begin(); display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_10); } void obtineVremea() { WiFiClient client; HTTPClient http; String url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric&lang=ro"; http.begin(client, url); int httpCode = http.GET(); if (httpCode > 0) { String payload = http.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); temperatura = String(doc["main"]["temp"].as(), 1) + " °C"; stareVreme = doc["weather"][0]["description"].as(); } http.end(); } void loop() { timeClient.update(); int hh = timeClient.getHours(); int mm = timeClient.getMinutes(); int ss = timeClient.getSeconds(); int zi = timeClient.getDay(); String currentTime = formatTime(hh, mm, ss); obtineVremea(); display.clear(); display.setTextAlignment(TEXT_ALIGN_CENTER); display.setFont(ArialMT_Plain_10); display.drawString(64, 0, zileleSaptamanii[zi]); display.setFont(ArialMT_Plain_24); display.drawString(64, 10, currentTime); display.setFont(ArialMT_Plain_16); display.drawString(64, 35, temperatura); display.setFont(ArialMT_Plain_10); display.drawString(64, 50, stareVreme); display.setFont(ArialMT_Plain_16); display.display(); delay(1000); }

Un simplu ceas cu display de Nokia

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>