Am combinat sketch-ul de la ceasul demo, ce are anumiţie cu un ceas analog urmat de unul digital, cu exemplul din libraria NTPtimeESP, obţinând un ceas precis şi frumos.
Prin iarna am gasit articolul Mini LED clock, care folosea un afisaj matriceal din 4 module de 8x8 leduri controlate de MAX7219. Partea frumoasa e ca foloseste mai multe variante de prezentare a orei, dar si ca are si partea de reglaj.
Schema care rezulta din descriere si din program este
Abia acum am implementat partea de alarma, in care se foloseste un buzzer activ, programul fiind mini_clock_1_2.ino, putand afla starea alarmei prin apasarea celui de-al doilea buton, care in mod obisnuit arata data, daca este activa alarma o arata si pea, dupa cum se vede si din filmulete:
- ceas matriceal cu alarma
Schema folosita are doar un led si o rezistenta (nu am avut buzzer activ la indemana), dar montajul este pregatit si cu un senzor de masura umiditate si temperatura de tip DHT22 (AM2302).
PS: Am gasit un ceas derivat din cel din care m-am inspirat si eu, cu un afisaj mai mare si informatii de temperatura si altele, vedeti articolul Arduino Pong Clock
Pentru a putea programa o placa cu ESP32 cu mediul Arduino IDE trebuie urmaţi paşii prezentaţi în articolul lui Rui Santos numit Installing the ESP32 Board in Arduino IDE (Windows instructions).
Am constatat că această placa are 2 leduri (buit-in), unul la GPIO0 şi unul la GPIO27 (nu doar la GPIO27) aşa că am modificat programul original să imi aprindă aceste leduri, modificând şi logica de aprindere (inversă), acest program modificat de mine este ESP32_WebServer.ino.
După încărcarea programului, în ecranul de monitorizare serială găsim adresa IP a paginii web
accesând pagina vom vedea
Apăsând pe butonul de sus (GPIO0), se va aprinde ledul corespunzător, schimbându-se şi informaţia de pe ecran
,
apăsând şi pe al doilea buton (GPIO27), se aprinde şi cel de-al doilea
Pentru a rămâne doar led-ul din dreapta imaginii aprins (cel de la GPIO27), îl stingem pe cel din stânga (GPIO0)
Am făcut 2 filmuleţe, pentru înţelegea mai uşoară a modului de comandă şi funcţionare
Un material interesant (nu cu o utilitate prea mare) este in articolul Show Temperature and Humidity as WiFi SSID with ESP8266 and HTU21D Sensor in care gasim, dupa cum e si titlul articolului, un sistem de afisare temperatura si umiditate relativa aer ca nume de retea "uairles" (Wi-Fi, deoarece ESO8266 este in modul AP - Acces Point). Acolo se folosea un senzor HTU21D de care nu dispun, asa ca am modificat programul pentru un senzor DHT (eu am folosit un DHT22/AM2302 care e mult mai precis decat DHT11). Am folosit o placa de dezvoltare Lolin cu ESP8266 (merge orice placa cu ESP8266, programata ca un Arduino - vedeti articolul Placa NodeMcu v.0.9 programata in Arduino IDE), iar schema folosita de mine este
Programul modificat de mine este dht_custom_ssid_exp8266_1.ino si necesita 3 librarii: DHT (pentru senzorul de temperatura si umiditate), Pstring si Streaming.
Dupa incarcarea programului, cautand retele wi-fi gasim:
- pe telefon Android
- pe calculator cu Windows
La 10 secunde "reteaua" isi schimba numele functie de valorile masurate ale temperaturii si umiditatii relative ale aerului.
PS: Doar pe telefon cu sistem de operare Android se vad schimbarile usor, pe PC (cu Windows) si pe telefoane iPhone (iOS) raman si valori anterioare...
PS2: Am facut 2 filmulete pentru a fi mai usor de inteles cum functioneaza acest termometru/higrometru:
- Termometru/higrometru cu afisare date ca nume de retea Wi-Fi
Am primit pentru teste un afişaj OLED cu rezoluţie 128x128 (driver SSD1327) şi diagonală de 1,5" (3,8cm), dorindu-se controlul lui cu ajutorul unei plăci de dezvoltare cu ESP32.
În primă fază, am aflat că acest afişaj nu e monocrom, ci cu 16 nuanţe de gri, funcţionând fie pe SPI, fie pe i2c, dar este deja configurat hardware pe SPI, după cum se vede în schema lui. Am abuzat de Google, vorba lui Vlad, şi am gasit libraria u8g2, care este derivată din cea pe care o mai folosisem pentru afişase monocrome, şi anume libraria u8glib. Menţionez că am găsit şi alte librării, dar nu sunt concepute pentru a fi folosite ciu placă de dezvoltare cu ESP32. Am testat exemplele din librărie, configurând pentru placa de dezvoltare cu ESP32,
programul utilizat fiind u8glib_RTC_clock1.ino, apoi am implementat si partea de reglaj,
Daca se apasa scurt butonul de epe encoder apare un mesaj cu date despre program
iar daca se apasa lung intra in meniul de reglaj, la modificarea anului
prin rotirea encoderului se modifica valoarea (minimul fiind 2018, vorba lui Andy, asta nu e masina timpului sa trec in anii anteriori) apoi la paasare scurtaa butonului se ajunge in meniul de reglaj al lunii
apoi se trece in reglajul zilei din luna
Dupa apasarea butonului se intra in partea de reglaj a ceasului, la ore
si apoi la minute
Apasand din nou butonul se revine la modul de functionare normala, ca ceas
Am constatat ca programul ocupa foarte mult spatiu (97%) si nu o sa imi incapa tot ce aveam de gand, asa ca voiam sa renunt si sa trec pe afisaj alfanumeric LCD2004 (20x4), dar dupa ce am discutat cu Vlad si mi-a zis ca fonturile folosite de mine consuma multa memorie, m-am mai jucat cu fonturile si am redus mult memoria ocupata (67%), dupa cum se vede in filmuletele
- ceas pe afisaj 128x64 cu ST7920 (4)
Dupa ce m-am mai obisnuit cu modul de functionare al protocolului MQTT de comunicare intre o placa de dezvoltare cu ESP8266 (sau ESP32) si un server local Mosquitto, am zis sa fac si o aplicatie utila, cea de termostat controlat de la distanta de e un smartphone.
In prima faza, am adaptat un sketch pentru a simula un termostat prin generarea unui numar aleator care a fost impartit la 10 pentru a avea un numar cu zecimala si compararea lui cu o temperatura de referinta, Temperatura de referinta a fost si ea reglata din 2 butoane virtuale de pe aplicatia de pe smartphone, care se numeste IoT MQTT Panel: