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>

miercuri, 2 noiembrie 2011

Scroll-thermo-clock

 Update : Based on the same ideea of scroll-thermometer, I write the code for  scrolling-thermo-clock, with PIC16F877A, DS18B20, DS1307 and 7x7 LED matrix (remember - DIY matrix). The time can be set, with three buttons ! The themperature  in this video it's "0.0'C" because I dont have any DS18B20 available for this project :( .

Schematics :




Code (written in PicBasicPro) : Original topic can be found here : http://www.picbasic.co.uk/forum/showthread.php?t=15431.

Enjoy !
Nota : Am luat decizia indepartarii codului sursa de aici, pentru a nu incarca inutil pagina ...