Sokáig használtam az ESPEasy alapú termosztátomat, ám költözésem után úgy gondoltam, az új helyen nem fogok erősáramot vinni a meglevő butatermosztát helyére (Computherm TR-010), hanem konkrétan rá fogom akasztani a meglévőre és gyengeáramú tápról fogom hajtani. Valamint színes kijelzőt szerettem volna, és a nagyobb felbontáshoz már erősebb vezérlő is jár, szóval ESP32 alapon gondolkodtam, a kevés memóriával és lábbal rendelkező ESP8266 helyett.
És hogy ne csigázzam az érdeklődést, ez lett az eredménye:
Tudom, a kijelző aljánál még valami takaróelem jó lehetett volna, de igazából semmi akadálya az előlap újratervezésének és cseréjének... bár őszintén szólva nekem ez is megfelel. :) Az első változat - a fejemben - ennél sokkal jobban le volt kerekítve, de némi áttervezés és modellezés után a belevaló alkatrészekre tekintettel ez tűnt a legpraktikusabb formának.
Szükséges alkatrészek listája:
Eszköz | Bruttó ár |
Lilygo TTGO T8 ESP32 fejlesztői lap (*) | 6000 Ft |
1.44" TFT 128x128 ST7735 (*) | 1400 Ft |
SR602 mini PIR mozgásérzékelő (*) | 630 Ft |
KY-040 rotary encoder (*) | 700 Ft |
5x7cm protolap (*) | 140 Ft |
HTU21D I2C hőmérő (*) | 1000 Ft |
4.7K ohmos ellenállás x1 | 20 Ft |
S8050 NPN tranzisztor | 20 Ft |
1N4001 dióda | 10 Ft |
5V DC relé (*) | 500 Ft |
DC-DC feszültség Step-Down átalakító 8-55V -> 3.3V 2A (*) | 1200 Ft |
2-es csavaros sorkapocs 5.08" (*) | 60 Ft |
DC foglalat, beépíthető 5.5x2.1mm DC022B (*) | 80 Ft |
Összesen: | 11760 Ft |
Jogosan merülne fel a kérdés: tényleg ez az aránylag drága fejlesztői lap kell a projekthez? A válasz: nem feltétlen, csak legyen elég szabad lába és fusson rajta a Tasmota. :) PSRAM-al szerelt WROVER kiadás erősen ajánlott a grafika miatt, bár az új C3, S3 kiadások olcsóbbak már, csak figyelni kell, melyik binárist szedi le hozzá az ember.
Figyelmes szemlélő észreveheti, hogy a doboz ára a fenti összegben még nincs benne. Méghozzá azért, mert 3D nyomtatással készült, így nehezen tudnám megsaccolni a felhasznált 80 gramm anyag milyen értéket képvisel pontosan, másrészt bizony nem elsőre, de még csak nem is másodjára sikerült kinyomtatni. Mondjuk inkább úgy, hogy megfizethetetlen. :)
A fenti eszközök bekötési rajza a következő:
Röviden a lényeg:
A DC-DC stepdown feszültségátalakító készít a bejövő 12V-ból 5V-ot, ami ellátja a relét és az ESP32 fejlesztői lapot árammal. A mozgásérzékelő, a hőmérő az enkóder és a kijelző a fejlesztői lap 3.3V-os lábáról kap áramot. A hőmérő I2C buszra, a kijelző SPI buszra, a többi eszköz egyszerű GPIO-ra van kötve.
Az NPN tranzisztoron keresztül vezérelt relé zárja rövidre a C és NO kapcsokat, ha szükséges bekapcsolni a fűtést - az eredeti TR-010 is csak ennyit csinál.
Az egyértelmű, mit keres a hőmérő a kapcsolásban, no de mit akarok én a mozgásérzékelővel? Egyszerű: ha sokáig nincs mozgás, kikapcsolom a kijelző háttérfényét.
Mindez így nézett ki összeforrasztás után:
És akkor térjünk rá a dobozolásra. Első körben szereztem egy közepes kategóriának mondható 3D nyomtatót (Creality Ender 3 Pro), összeraktam, igazítgattam, próbálgattam. Ha azt mondom, hogy már egy éve is ezen a projekten dolgoztam, talán látható, hogy nem tíz perc elfoglaltságot adott.
Utána megtanultam az egyszerűnek tűnő, online Onshape 3D tervezőprogram használatát. Ami ingyenes, de cserébe az elkészült projektek nyilvánosan elérhetőek bárki számára.
Ennek örömére meg is osztom mindenkivel, bár csak annak lesz hasznos, aki pont ilyen TR-010-re szeretne ráaggatni valami okosítást:
https://cad.onshape.com/documents/d1e8c1ac4350be7cbb450e41
És igen, néhány próbálkozást követően belefért az egész elektronika és nem nyomta fel a tetejét sem, valamint a fedőn levő kivágások is jó pozícióba kerültek.
Már csak annyi volt hátra, hogy a fent levő sorkapocsra bekössem a TR-010ben levő két vezetéket, a bal oldalon levőre pedig a DC aljzaton keresztül a 12V-ot, és máris működőképes lett az egység.
Vagy nem. :) Kell ugyanis rá egy működtető szoftver is!
Kísérleteztem kedvenc MicroPython-ommal, de be kellett látnom, hogy a 128x128-as felbontás 15 bites színmélység mellett már nem csak rengeteg memóriát, de aránylag sok processzoridőt is igényel, amivel a micropython elég "nagyvonalúan" bánik.. szóval az enkóder elforgatásakor eléggé szaggatott a kép frissítése.
De sebaj, B tervnek itt volt a Tasmota! Ami az elmúlt évek során valami elképesztően komplex dologgá nőtte ki magát, és bizony grafikus kijelzést is támogat. Bár az igazán hasznos dolgokat egyedileg kell megírni rá, ekkor jön képbe ismét a Berry, amiről már írtam korábban.
A Berry-ről azt kell tudni, hogy kissé hasonlít a MicroPython nyelvre, épp csak annyira tér el tőle, hogy a haját tépje az, aki sokat használta a Pythont és nehezen áll át az apró különbségekre. :) Egyébiránt fantasztikus dolgokat össze lehet hozni, bár mintaprogramokban nem bővelkedik, így feltételezem nem használják azért nagy tömegek.
Van ugyan a Tasmotának egy termosztát nevű kiegészítője, de ugyanaz a bajom vele, mint a gyári programokkal: nem úgy működik, ahogy én szeretném.. úgyhogy írtam egy sajátot.
No de, első körben töltsünk fel egy alap Tasmotát az ESP32 lapunkra, legegyszerűbben a https://tasmota.github.io/install/ oldal meglátogatásával tudjuk ezt megtenni, ami egy webes soros konzolon keresztül küldi rá a firmware-t az eszközünkre, amit kábelen rákötöttünk a gépünkre, feltéve persze, ha támogatott böngészőt használunk. (Chrome)
Az itt felsorolt firmware-ek között van egy LVGL jelölésű, ebben vannak a grafikus megjelenítés testreszabását segítő funkciók.
Sajnos nekem egy régi ESP32 rev1 vezérlő jutott, amiben a PSRAM bekapcsolásához kell egy javítás a Tasmotához, ezért forrásból fordítottam magamnak binárist, ha valaki még így járt, akkor íme az én verzióm:
Persze, ha a normál LVGL firmware megfelelően működik, akkor már a célegyenesben érezhetjük magunkat.
A GPIO beállítások (Beállítások/Eszközbeállítások) az én bekötési rajzom szerint a Tasmotában az alábbiak:
ESP32 láb | Funkció |
---|---|
GPIO0 | OptionA 3 |
GPIO5 | SSPI CS |
GPIO13 | Backlight |
GPIO15 | SSPI DC |
GPIO18 | SSPI CLK |
GPIO21 | I2C SDA |
GPIO22 | I2C SCL |
GPIO23 | SSPI MOSI |
GPIO25 | Switch 1 |
GPIO26 | Relay 1 |
GPIO27 | Display Rst |
GPIO32 | RotaryA |
GPIO33 | RotaryB |
GPIO34 | Switch_n 2 |
GPIO39 | Relay 2 (dummy) |
Az "Option A 3" egyszerűen azt jelzi a Tasmotának, hogy az Universal Display Driver -t szeretnénk használni, erre ő betölti. Az SSPI jelölésű lábak az SPI megjelenítő megfelelő lábaira vannak kötve, a Backlight alias Háttérfény a kijelző háttérfényének engedélyező lábára, erre egyébként a Tasmota létrehoz egy kapcsolót, a többi létező kapcsolók után. (esetünkben ez a 3-as lesz)
A Relay 1 ugyebár a relét fogja vezérelni, illetve az állapotát követni, a Switch 1 kötelező elem hozzá, ezt az enkóder gombjára kötöttem. A RotaryA és RotaryB megy az enkóder DT és CLK lábaira. A Switch_n 2 a mozgásérzékelő kimenetére van kötve, az "n" azt jelenti, hogy nem kérünk PULLUP-ot arra a lábra. A GPIO39 csak egy "virtuális" relé, már csak azért is, mert az ESP32 utolsó pár lába nem lehet kimenet, és nincs felhúzó ellenállás sem rajta, ellenben a Tasmotában csak úgy jelenik meg a bemenet is, ha tartozik hozzá egy relé, ezek ugyanis logikailag párban vannak. A HTU21 meg ugye I2C-s, kétvezetékes modul.
Az SPI kijelző életre keltéséhez fel kell töltenünk egy display.ini fájlt (Consoles/Fájlrendszer kezelése), íme az enyém a 128x128-as modellhez:
(Ha netán valaki más típusúval próbálná ugyanezt, a Tasmota github-on a displaydesc mappa alatt talál alternatív .ini állományokat)
https://github.com/arendst/Tasmota/tree/development/tasmota/displaydesc
És akkor végül a Berry program, ami intézi a termosztát funkciókat, elérhető githubon:
https://github.com/enesbcs/tasmota-custom-scripts/tree/main/thermostat
A fenti thermostat.be állományt letöltjük gépünkre és feltöltjük a display.ini mellé az ESP32-re. Miután beállítottunk benne mindent megfelelően és teszteltük hogy működik, úgy tudjuk automatikusan elindítani, hogy létrehozunk mellette az ESP32 fájlrendszerén egy autoexec.be állományt, amibe ennyit írunk be:
load('thermostat.be')
No de mit is csinál ez a thermostat.be?
Ez kérem egy egyszerű 358 soros program, ami 60 másodpercenként lekéri a beépített HTU hőmérőtől a hőmérsékletet, és ha a beállított célhőmérséklet (SETPOINT) alatt van, akkor bekapcsolja a RELAY_HEATING által hivatkozott számú relét (1), ha HYSTERESIS-el a SETPOINT felett van, akkor kikapcsolja a relét.
A szkript elején vannak a módosítható változók: a homeronev cseles módon a hőmérő nevét takarja, mely esetemben HTU21, de ha valaki más típust tesz bele, akkor a Console-ban megjelenő "tele/eszköznév/SENSOR" üzenetek között látja az övének mi a neve.
A ROT_STEP segítségével lehet állítani az enkóder forgatásakor hány fok Celsius-al változzon a célhőmérséklet, a ROT_MIN a legkisebb, a ROT_MAX a legnagyobb lehetséges érték. (egyébként a Rotary enkóder Tasmota alatt 0 és 100 között állítható hangerőszabályzó-szerű bemenet, de a SetOption43 beállítás segítségével 0/1 érték visszaadásra lehet rávenni, ezt a szkript végén található Backlog beállítósor el is végzi)
Haladó funkció, ha a HEAT_MAX_TIME nem 0, akkor az abban megadott ideig megy maximum a fűtés, utána HEAT_COOLDOWN_TIME ideig pihenőt tart, nem fűt. Nyilván a rendszer tehetetlensége miatt a radiátorok még tovább melegítik ilyenkor a levegőt, ha jól állítjuk be ezt a két időt, akkor már az esetek többségében nem is kell visszakapcsolnia a termosztátnak a COOLDOWN lejárta után sem - egy ideig. Ez függ a lakás térfogatától, szigetelésétől, meg hogy milyen hideg van kint. Nekem a 30 perc / 5 perc jött be eddig.
A DISPLAY_OFF_TIME -ban megadott ideig, ha nem jelez mozgást a mozgásérzékelő (SW_MOTION-ban beállítva, hogy 2-es bemenet) akkor kikapcsolja a RELAY_DISPLAY által vezérelt kijelző háttérfényt. (ez ugyebár az utolsó relécsoport lesz automatán, esetünkben a 3-as)
Az EXT_TEMP_TIMEOUT idő azt jelenti, hogyha ennyi ideig nem érkezik bejövő adat egy külső hőmérőtől, akkor a belső hőmérőt használja.
A DISCOVERY_PREFIX pedig, ha üres vagyis "" -re van állítva, akkor kikapcsolja az MQTT Autodiscovery funkciót, ha pedig meg van adva a "homeassistant" vagy akár a "domoticz" akkor minden indításnál elküldi a konfigurációs objektumait az MQTT bróker számára.
(Ahogy arról már írtam, a Domoticz is támogatja a HA Autodiscovery funkciót 2022 óta)
Ez az Autodiscovery rész egyébként teljesen a szkriptbe van ágyazva, mivel a Tasmota új verzióiból már kivették, persze forrásból történő fordításkor még engedélyezhető, de az általam implementált termosztát funkciókat akkor sem tudná a beágyazott változat kezelni, így inkább az egészet megoldottam én.
Extra még, hogy a SETPOINT-ot el is tárolja az eszköz, így áramkimaradás esetén ez megmarad. Újraindulását követően pedig az aktuális hőmérséklet függvényében eldönti, hogy kell-e fűteni vagy sem abban a pillanatban. (persze indulás után kell 60 másodperc, mire az első hőmérsékletadat megérkezik, addig a fűtés KI állapotban marad természetesen)
MQTT funkciók:
- stat/<eszköznév>/thermostat/tmp jelenti a hőmérsékletet a saját hőmérőről (C)
- stat/<eszköznév>/thermostat/target_t jelenti az aktuális SETPOINT-ot (C)
- stat/<eszköznév>/thermostat/ext_tmp visszajelzi a külső hőmérő adásának vételét az adattal (C)
- stat/<eszköznév>/thermostat/disabled 0 vagy 1 (0=automatikus működés, 1=fix KI)
- cmnd/<eszköznév>/thermostat/target_t fogadja az általunk kért SETPOINT értékét (C)
- cmnd/<eszköznév>/thermostat/ext_tmp fogadja a külső hőmérő értékét (C)
- cmnd/<eszköznév>/thermostat/disabled 0 vagy 1 állítja a fix Ki (1) vagy automata (0) állapotot
HTTP funkciók:
Külső hőmérő adatküldés, 20.5 fok:
http://IPCIM/control?cmd=thermo,exttemp,20.5
Célhőmérséklet beállítása 23 fokra:
http://IPCIM/control?cmd=thermo,setpoint,23
Automatikus üzemmód távoli beállítása:
http://IPCIM/control?cmd=thermo,mode,1
Fix KI állapot:
http://IPCIM/control?cmd=thermo,mode,0
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.