ESP8266 wifis nyomógomb (The Button)
2018. október 31. írta: eNeS

ESP8266 wifis nyomógomb (The Button)

Bár alapvetően nem kedvelem az elemes megoldásokat, néha szükséges lehet olyan helyre tenni egy nyomógombot, ahová nem kényelmes kábelezni. Erre lehet megoldás egy sima 433Mhz-es RF nyomógomb, ami egy gombelemről is bírja hónapokig, és hozzá egy RF-Wifi Bridge eszköz. (Pl Sonoff RF Bridge vagy Broadlink RM Pro) Vagy vehetünk egy Bluetooth-os FLIC-et, (kb 10ezer Ft), vagy egy sima Bluetooth-os kulcskeresős nyomógombot...

Vagy készíthetünk saját, WiFi-s nyomógombot! Az ötlet nem saját, az eredeti projekt megtalálható >itt<.
Az alapötlet egy kis méretű ESP-03 (ESP8266-03) használata, és annak egy LED-es nyomógombos lámpa belsejébe építése.
Így néz ki majdnem kész állapotban a fedele nélkül:

button_1.jpg

Látható, hogy még így is 3 dimenzióban kell gondolkodni a beépítésnél, mert elég szűkös a rendelkezésre álló hely. Az elemekről a + és - pontokat átforrasztottam (nem átkötést tettem a harmadik elem helyére) a megfelelő pontokra, amin 3V érkezik. (2x1.5V)
(A jobb sarokban látható ellenállás célját ne keressük, már nincs neki, nem volt kedvem leforrasztani a tesztelések befejezése után, a bal oldali ellenállás a LED előtét-ellenállása, a maradék kettő pedig az ESP modul alatt/mögött van elrejtve)

Kívülről így nézett ki az eredeti nyomógombos lámpa: (többféle színben kapható persze)

button_4.jpg

És szétpattintva:

button_3.jpg

Beszerezhető 3 és 4 LED-es változata is, az átalakítást követően egynél többet azonban művészet lenne belezsúfolni, ám mivel az elsődleges cél egy gomb használata, visszajelzésre bőven elegendő egy LED.

Nem titok, hogy a wifis megoldások többet fogyasztanak mint az RF, vagy akár a Bluetooth eszközök, ezért nem feltétlenül praktikusak minden esetben. Két gombnyomás közt én Modem-Sleep módba teszem az eszközt, ám az elemek élettartamáról egyelőre nem tudok nyilatkozni, még deep-sleep móddal lehetne maximalizálni az elem élettartamot.
UPDATE: Már tudok nyilatkozni, ModemSleep módban feszültségátalakítóval 1 napot bírt két elemről... kevés, muszáj lesz továbblépni a Light-Sleep módba, ami egy köztes átmenet a plugin új verziója már támogat, ám ebben a módban a gombnyomás ébreszti fel az eszközt, és nem tudja megkülönböztetni a hosszú és rövid gombnyomást, sőt magát az ébredés előtti gombnyomás tényét is elnyeli a rendszer.

Néhány apró módosítást azért eszközöltem az eredeti projekthez képest, példának okáért nem volt kéznél RGB LED, így sima fehér LED-et használtam, a két AAA elem használata stimmel - de csak mert szintén nem volt kéznél 1.8V-5V -> 3.3V step-up konverter, mert akkor 3 db AAA is jó lenne. Csak kis méretű 0.8V-3.3V -> 3.3V átalakító volt raktáron nálam, (UPDATE: ami zsákutca, nem ajánlott!)... mivel ha csak simán rákötnénk az ESP modult az elemekre (2x1,5V=3V), ahogy az eredeti leírás szerint van, azt tudni kell, hogy az ESP8266 2.5V-3.3V tápfeszültségről tud működni, tehát amikor az elemek töltöttsége 2.5V alá csökken, akkor nem indul el/leáll. Amennyire én tudom (bár konkrét adatokat nem találtam) 0.8-1V között tekinthetjük lemerültnek a 1.5V-os elemet, ez után már nagyon gyorsan csökken a feszültsége.
Nagyon jó lett volna az elemek feszültségét direktben rávezetni az ESP8266 egyetlen analóg bemenetére, de az ESP-03 modulon ez nincs kivezetve, én pedig nem vagyok elég rátermett az SMD forrasztáshoz, így sajnos az akkufeszültséget nem tudja lejelenteni a kütyü, pedig nagyon jó lenne...

Az ESP-03-on kívül más ESP modul használata a méretei miatt nem lenne könnyű:

esp03.jpg

Íme a méretarányok:

button_2.jpg

Balfra fent egy ESP-12F modul, alatta egy teljes D1 Mini látszik, középen fent az eredeti elektronika, alatta az ESP-03 segítségével kialakított helyettesítő panel. (a protolapból nem kell túl sokat felhasználni)

A szükséges anyagok jegyzéke:

Eszköz Bruttó ár
ESP-8266-03 Wifi modul (*) 588 Ft
Nyomógombos LED világítás (*) 283 Ft
2 x 1.5V AAA elem 2 x 154 Ft
Nyomógomb 13mm 10 Ft
Fehér LED 5mm x1 24 Ft
330 ohmos ellenállás x1 10 Ft
10k ellenállás x 1 10 Ft
2.7k ellenállás x 1 10 Ft
mini DC-DC 0.8-3.3V -> DC 3.3V Step UP átalakító (*) <- ez a típus NEM AJÁNLOTT! 311 Ft
5x7cm protolap (*) 60 Ft
Összesen: 1614 Ft

Megj: Az általam használat step-up átalakító helyett egy ilyen lett volna jobb. Amit beépítettem, a feszültség csökkenésekor már nem tud elegendő áramerősséget biztosítani az ESP modul számára, így olyan, mintha nem is lenne, csak plusz fogyasztóként viselkedik...

ESP lábkiosztás:

Láb cimke Alternatív megnevezés Rákötött eszköz
TX GPIO1/D10 -
RX GPIO3/D9 -
D3 GPIO0 Nyomógomb
D4 GPIO2 -
D0 GPIO16/WAKE -
D5 GPIO14 -
D6 GPIO12 -
D7 GPIO13 LED +
D8 GPIO15

-

 
Bekötési rajz:

 bekotes_button.jpg

Aki már olvasta korábban ezt a blogot nem fog meglepődni azon, hogy a firmware pedig az ESPEasy lett!

espeasy_inside.png

Apró probléma, hogy az ESP-03 modulokon hivatalosan 512K flash tárhely található, ami ügyes kezűek által cserélhető ugyan forrasztópákával, de alapból mondhatni nem sok mindenre elegendő manapság. Én valamilyen isteni csoda folytán 1M flash-el szerelt ESP-03 modult kaptam, ezt az esptool is megerősítette, amin nem győztem csodálkozni. (ám mire megérkezett Kínából, már régen sikerült lefordítanom az ESPEasy régi stabil változatát 512k-s méretre, a saját pluginjeimmel és ModemSleep támogatással)

Az ESPEasy a már korábban ismertetett módon, pl a pyflasher segítségével tölthető fel, annyi nehezítéssel, hogy közvetlenül az RX-TX lábakra kell kötni az USB programozót. (a 2mm-es lábtávolság miatt ez közel sem olyan egyszerű feladat, ahogy sokan gondolnák) A programozás elemes betáplálásról is működik (teszteltem) a programozó GND lábát kell az elemek mínuszára közösíteni, a TX->RX-re, RX->TX-re. A gombot pedig nyomva kell tartani (ez GPIO-0 GND-re) az elem behelyezésekor, így lép programozói módba.

esp03_programming.JPG

No meg persze a flash tárhelyhez megfelelő binárist kell feltölteni:

MODEMSLEEP mód

Az alábbiakban az első próbálkozásos ModemSleep módszer található.

ESPEasy eszközbeállítások:

 button_espeasy.jpg

Bár akadálya nincs a sima Switch input segítségével megoldani a gombnyomás detektálását, én azonban a saját Pushbutton nevű pluginomat alkalmazom, ami meg tudja különböztetni, hogy rövid vagy hosszú gombnyomást érzékelt. Hogy mi számít hosszúnak, azt az eszközbeállításokon belül lehet megadni, nálam ez 2 másodperc lett. Bekapcsoltam az Internal Pullup-ot is a GPIO-0 bemenetre, és a kreatív "gomb" lett a gomb neve.
Készítettem még egy System Info eszközön segítségével egy wifi jelerősség kalkulátort, ami az RSSI típust kiválasztva, egyszerűen "rssi" néven fut, és az alábbi formula alakítja Domoticz kompatibilissé: "((%value%+97)/5)+1"

A wifiman engedélyezése után hasznáható a "modemsleep" parancs, a "glob" nevű Dummy eszközt pedig azért hoztam létre, hogy az "idx" nevű bejegyzése tárolja éppen a rövid vagy a hosszú gombnyomás jön-e, a "sleepok" pedig jelzi, hogy engedélyezett a modemsleep használata.

Rules - szabályok:


on System#Boot do
 taskvalueset,5,1,0
 taskvalueset,5,2,0
 timerset,2,120
endon

on gomb#Shortpress do
 taskvalueset,5,1,127
 event,wakeup
endon

on gomb#Longpress do
 taskvalueset,5,1,128
 event,wakeup
endon

on wakeup do
 taskvalueset,5,2,1
 If [wifiman#Connected]>0
  event,evalbtns
 else
  modemsleep,0
 endif
endon

on evalbtns do
 taskrun,3
 if [glob#idx]>0
  Publish domoticz/in,{"idx":[glob#idx],"nvalue":1.00,"svalue":"On", "RSSI": [rssi#rssi]}
  pulse,13,1,100
  Publish domoticz/in,{"idx":[glob#idx],"nvalue":0.00,"svalue":"Off", "RSSI": [rssi#rssi]}
 endif
 timerset,1,1
endon

on MQTT#Connected do
 event,evalbtns
endon

on Rules#Timer=1 do
 if [glob#sleepok]>0
  modemsleep,1
 endif
 if [glob#idx]=127
  pulse,13,1,200
 endif
 if [glob#idx]=128
  pulse,13,1,500
 endif
 taskvalueset,5,1,0  
endon

on Rules#Timer=2 do
 taskvalueset,5,2,1
endon

 A fenti szabályok a gomb rövid megnyomása esetén a 127-es, hosszú megnyomása esetén a 128-as IDX-ű eszközt billentik ON állásba, majd rögtön utána OFF-ba (nyomókapcsoló...) Domoticz MQTT-n keresztül. Ez után ModemSleep módba lép az eszköz, ezzel 80mA-ről 15mA-ra csökkentve a fogyasztást. Bekapcsolástól számított 120 másodperc után akkor is ModemSleep módba lép az eszköz, ha nem történt gombnyomás. ModemSleep módban természetesen leáll a wifi, nem pingelhető, nem érhető el az eszköz, csak gombnyomáskor, mikor felébred lejelenteni.. ez némi csúszást is okoz, mert lekéri az IP címét, csatlakozik az MQTT szerverhez minden alkalommal, és utána tudja kiküldeni a státuszát.

A fenti szkriptet erősen át kell dolgozni a régi 512k-ra fordítható 1.2-es ESPEasy számára, mert pl nem támogatja az MQTT#Connected eseményt, így több időzítést/várakozást kell beletenni. Át kell dolgozni akkor is, ha nem ModemSleep, hanem a kisebb fogyasztású LightSleep módot akarjuk használni, mivel ekkor nem érzékelhető a gombnyomás ébredés után, fel kell tételeznünk, hogy egy gombnyomás ébresztett fel és automatán küldeni pl az MQTT#Connected eseményre az ON állapotot.. természetesen így nem lehet megkülönböztetni a rövid és hosszú gombnyomást sem.

LIGHTSLEEP mód

Az alábbiakban a fenti projekt LightSleep-es megvalósításához szükséges módosítások találhatóak.
Első és legfontosabb: a step up konvertert ki kell hagyni, a 2 db AAA elem stimmel, minden más maradhat.

Az ESPEasy-t újrafordítottam a FEATURE_ADC_VCC "true"-ra állításával, mivel ezzel közvetlenül tudjuk olvasni a chipbe érkező feszültségét, ez az opció a TOUT analóg bemenet kiváltására használható, a kettő együtt nem működik. Ám mivel az ESP-03-on nincs is kivezetve az analóg láb, ez nem jelent problémát.

Az eszközök annyiban változnak, hogy beszúrtam még egy Sysinfo típusú eszközt a 6. helyre:

button_espeasy_ls.jpg

Az rssi-hez ugyanaz a formula jó, mint amit feljebb írtam, a vcc eszközhöz pedig a szükséges, Domoticz kompatibilis formula: "((%value%-2.5)*100)"

A wifiman eszközt át kell állítani LightSleep módra az alábbi szerint:

button_espeasy_wm.jpg

A GPIO-0 bemeneten hagytam a gombot, és LOW szintre húzza megnyomáskor, ez lesz az ébresztésre a jel. A LightSleep-nél a CPU közben áll, tehát semmilyen ciklus vagy egyéb GPIO bemenet sem működik az ébredésig, ami leírás szerint 3 milliszekundum... plusz a wifi kapcsolat létrehozása és az MQTT szerverre történő visszakapcsolódás ideje. Ne tévesszen meg senkit, hogy a parancs neve modemsleep maradt, ha megfelelően van beállítva a light módot fogja indítani.. visszaállítani pedig úgyis csak gombnyomással lehet.

A gomb eszközt meghagytam azért, ha valaki olyan gyorsan meg tudná nyomni, amíg az eszköz nem lépett vissza Sleep módba, akkor kezelje a gombnyomást, egyébként nem szükséges, mert felébredés után az MQTT#Connected esemény indítja az MQTT küldési folyamatot.. csak előbb megbizonyosodik róla, hogy az RSSI és a VCC értéke is elérhető. A Timer1 arra az esetre szolgál, ha nem lenne elérhető az MQTT kiszolgáló, ekkor is visszalép Sleep módba, a fogyasztás csökkentése céljából. A Timer2 arra biztosíték, hogyha véletlenül egyidőben érkezik be a vcc és az rssi értéke, és nem fut le az OFF mqtt üzenetküldés+Sleep, akkoris ráfusson arra az ágra. A hosszú gombnyomás - ha jó időzítéssel sikerül beütni, letiltja a Sleep módba váltást, diagnosztikai célra.

És akkor a végső, komplett, működő szabályrendszer:


on System#Boot do
 gpio,13,1
 modemsleep,0
 timerset,1,60
 taskvalueset,5,2,0
 gpio,13,0
endon

on gomb#Shortpress do
 event,preparedata
endon

on gomb#Longpress do
 taskvalueset,5,2,1
endon

on MQTT#Connected do
 event,preparedata
endon

on Rules#Timer=1 do
 event,dosleep
endon

on preparedata do
 Publish domoticz/in,{"idx":127,"nvalue":1.00,"svalue":"On"}
 taskvalueset,5,3,0
 taskvalueset,5,4,0
 pulse,13,1,100
 taskrun,3
 taskrun,6
 timerset,2,1
endon

on rssi#rssi do
 taskvalueset,5,3,1
 event,dosignal
endon

on vcc#vcc do
 taskvalueset,5,4,1
 event,dosignal
endon

on Rules#Timer=2 do
 event,dosignal
endon

on dosignal do
 if [glob#rssi]>0 and [glob#vcc]>0
  Publish domoticz/in,{"idx":127,"nvalue":0.00,"svalue":"Off", "RSSI": [rssi#rssi], "Battery": [vcc#vcc]}
  event,dosleep
 endif
endon

on dosleep do
 taskvalueset,5,3,0
 if [glob#sleepok]<1
 modemsleep,1 
 endif
endon

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr5714333979

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.

Nincsenek hozzászólások.