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>
// --- CONFIGURARE ---
#define ONE_WIRE_BUS D4
#define BACKLIGHT_PIN D5
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
// --- SEGMENTELE CIFRELOR ---
byte LT[] = {B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111};
byte UB[] = {B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000};
byte RT[] = {B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111};
byte LL[] = {B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111};
byte LB[] = {B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111};
byte LR[] = {B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100};
byte MB[] = {B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111};
byte BM[] = {B11111, B11111, B00000, B00000, B00000, B11111, B11111, B11111};
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
tm timeinfo; time_t now;
String StrTempC = "--";
int prevHour = -1, prevMin = -1, prevSec = -1, prevDay = -1, prevMonth = -1, prevWDay = -1;
String prevTemp = "";
// --- FUNCTII AFISARE CIFRE ---
void custom0(byte x) { lcd.setCursor(x, 0); lcd.write(0); lcd.write(1); lcd.write(2); lcd.setCursor(x, 1); lcd.write(3); lcd.write(4); lcd.write(5); }
void custom1(byte x) { lcd.setCursor(x, 0); lcd.write(1); lcd.write(2); lcd.print(" "); lcd.setCursor(x, 1); lcd.write(4); lcd.write(255); lcd.write(4); }
void custom2(byte x) { lcd.setCursor(x, 0); lcd.write(1); lcd.write(1); lcd.write(2); lcd.setCursor(x, 1); lcd.write(0); lcd.write(7); lcd.write(7); }
void custom3(byte x) { lcd.setCursor(x, 0); lcd.write(1); lcd.write(6); lcd.write(2); lcd.setCursor(x, 1); lcd.write(4); lcd.write(4); lcd.write(5); }
void custom4(byte x) { lcd.setCursor(x, 0); lcd.write(3); lcd.write(4); lcd.write(255); lcd.setCursor(x, 1); lcd.print(" "); lcd.write(255); }
void custom5(byte x) { lcd.setCursor(x, 0); lcd.write(3); lcd.write(6); lcd.write(6); lcd.setCursor(x, 1); lcd.write(4); lcd.write(4); lcd.write(5); }
void custom6(byte x) { lcd.setCursor(x, 0); lcd.write(0); lcd.write(6); lcd.write(6); lcd.setCursor(x, 1); lcd.write(3); lcd.write(4); lcd.write(5); }
void custom7(byte x) { lcd.setCursor(x, 0); lcd.write(1); lcd.write(1); lcd.write(5); lcd.setCursor(x, 1); lcd.print(" "); lcd.write(0); lcd.print(" "); }
void custom8(byte x) { lcd.setCursor(x, 0); lcd.write(0); lcd.write(6); lcd.write(2); lcd.setCursor(x, 1); lcd.write(3); lcd.write(4); lcd.write(5); }
void custom9(byte x) { lcd.setCursor(x, 0); lcd.write(0); lcd.write(1); lcd.write(2); lcd.setCursor(x, 1); lcd.write(7); lcd.write(7); lcd.write(5); }
void printDigits(byte digits, byte x) {
switch (digits) {
case 0: custom0(x); break; case 1: custom1(x); break; case 2: custom2(x); break;
case 3: custom3(x); break; case 4: custom4(x); break; case 5: custom5(x); break;
case 6: custom6(x); break; case 7: custom7(x); break; case 8: custom8(x); break;
case 9: custom9(x); break;
}
}
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 showTime(tm *localTime) {
if (localTime->tm_hour >= 8 && localTime->tm_hour < 20) analogWrite(BACKLIGHT_PIN, 800); else analogWrite(BACKLIGHT_PIN, 150);
// 1. ORA (RAND 1 si 2)
if (localTime->tm_hour != prevHour || localTime->tm_min != prevMin || localTime->tm_sec != prevSec) {
int startX = 1;
if (localTime->tm_hour < 10) {
lcd.setCursor(startX, 0); lcd.print(" "); lcd.setCursor(startX, 1); lcd.print(" ");
} else {
printDigits(localTime->tm_hour / 10, startX);
}
printDigits(localTime->tm_hour % 10, startX + 4);
lcd.setCursor(startX + 8, 0); lcd.print(localTime->tm_sec % 2 == 0 ? ":" : " ");
lcd.setCursor(startX + 8, 1); lcd.print(localTime->tm_sec % 2 == 0 ? ":" : " ");
printDigits(localTime->tm_min / 10, startX + 11);
printDigits(localTime->tm_min % 10, startX + 15);
prevHour = localTime->tm_hour; prevMin = localTime->tm_min; prevSec = localTime->tm_sec;
}
// 2. DATA (RAND 3)
if (localTime->tm_mday != prevDay || localTime->tm_mon != prevMonth) {
char date_output[12];
sprintf(date_output, "%02d/%02d/%04d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year + 1900);
lcd.setCursor(0, 2);
lcd.print("Data : "); lcd.print(date_output); lcd.print(" ");
prevDay = localTime->tm_mday; prevMonth = localTime->tm_mon;
}
// 3. ZI + TEMP (RAND 4)
if (StrTempC != prevTemp || localTime->tm_wday != prevWDay) {
char* dow = getDOW(localTime->tm_wday);
String tFull = "Temp:" + StrTempC;
int spatii = 20 - strlen(dow) - tFull.length() - 1;
lcd.setCursor(0, 3);
lcd.print(dow);
for (int i = 0; i < spatii; i++) lcd.print(" ");
lcd.print(tFull);
lcd.setCursor(19, 3); lcd.print((char)223);
prevTemp = StrTempC; prevWDay = localTime->tm_wday;
}
}
void setup() {
// 1. Initializare Senzori si Serial
sensors.begin();
Serial.begin(115200);
pinMode(BACKLIGHT_PIN, OUTPUT);
analogWriteRange(1023);
// 2. Initializare I2C si LCD (Configuratia stabila pentru Wemos D1 Mini)
Wire.begin(4, 5); // SDA=D2 (GPIO4), SCL=D1 (GPIO5)
delay(1000);
lcd.init();
lcd.backlight();
lcd.clear();
// 3. Incarcare Caractere Custom
lcd.createChar(0, LT); lcd.createChar(1, UB); lcd.createChar(2, RT);
lcd.createChar(3, LL); lcd.createChar(4, LB); lcd.createChar(5, LR);
lcd.createChar(6, MB); lcd.createChar(7, BM);
// 4. Conectare WiFi cu afisare nume retea si numar incercari
lcd.setCursor(0, 0);
lcd.print("WiFi: ");
lcd.print(ssid); // Afiseaza automat numele retelei
WiFi.begin(ssid, password);
int incercari = 0;
// Logica de retry (WIFI_RETRY_LIMIT = 15)
while (WiFi.status() != WL_CONNECTED && incercari < WIFI_RETRY_LIMIT) {
delay(WIFI_RETRY_DELAY);
lcd.setCursor(0, 1);
lcd.print("Incercari: ");
lcd.print(incercari + 1);
lcd.print("/");
lcd.print(WIFI_RETRY_LIMIT);
incercari++;
}
// 5. Verificare Conexiune si Afisare IP
if (WiFi.status() == WL_CONNECTED) {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("WiFi Conectat!");
lcd.setCursor(0, 1); lcd.print("IP: "); lcd.print(WiFi.localIP());
delay(3000); // 3 secunde sa poti citi IP-ul
} else {
// Eroare / Restart
lcd.clear();
lcd.setCursor(0, 0); lcd.print(" Eroare WiFi! ");
lcd.setCursor(0, 1); lcd.print(" Se reseteaza...");
delay(5000);
ESP.restart();
}
// 6. Configurare ORA AUTOMATA (Vara/Iarna) pentru Romania
configTime(0, 0, "pool.ntp.org", "ro.pool.ntp.org");
setenv("TZ", TZ_INFO, 1);
tzset();
lcd.clear();
}
void loop() {
time(&now);
localtime_r(&now, &timeinfo);
static unsigned long lastT = 0;
if (millis() - lastT > 10000) {
sensors.requestTemperatures();
float t = sensors.getTempCByIndex(0);
if (t != -127.00) {
// Padding fix de 5 caractere pentru temperatura
String valStr = String(abs(t), 1);
String res = (t < 0 ? "-" : " ");
if (abs(t) < 10.0) res += " ";
res += valStr;
StrTempC = res;
}
lastT = millis();
}
if (timeinfo.tm_sec != prevSec) showTime(&timeinfo);
}
Niciun comentariu:
Trimiteți un comentariu