Sterownie urządzeniami elektrycznymi przez WiFi

Niedawno obiecałem napisać parę słów o sterowaniu modułem przekaźników z użyciem popularnego układu ESP8266 . Opiszę budowę urządzenia, które pozwoli sterować urządzeniami elektrycznymi, także zasilanymi 230V, przez WiFi. Oczywiście jego zastosowania są znacznie szersze. Można go użyć np. do sterowania roletami, czy otwierania bramy. Może także sterować kotłem gazowym lub na ekogroszek przez podłączenie w miejsce regulatora termostatycznego, co pewnie opiszę w jednym z kolejnych wpisów.

NodeMCU - sterownie przkaźnikami

W pierwszej chwili chciałem użyć popularnej wersji ESP-01, której używam m.in. do konstrukcji internetowego termometru. Ostatecznie jednak zdecydowałem się na użycie NodeMCU v3, produkowanego przez LoLin. Nazwa producenta jest o tyle istotna, że płytka v3 LoLin jest większa niż standardowe NodeMCU, a co za tym idzie, inne będą wymiary obudowy urządzenia.

NodeMCU LoLin

Dlaczego akurat NodeMCU ? Przyczyny są dwie - koszty i prostota. NodeMCU ma jedną, bardzo ważną zaletę - posiada na pokładzie USB, z którego można zasilać układ. ESP8266 wymaga napięcia 3,3V, więc siłą rzeczy NodeMCU musi posiadać stabiliztor 3,3V. Popularne (i tanie) moduły przekaźnikowe wymagają natomiast napięcia 5V. Jeżeli więc podłączymy do NodeMCU zasilacz 5V, to będzimy mieli dostępne oba potrzebne napięcia. Stosując ESP-01 potrzebowalibyśmy dodatkowej płytki PCB ze stabilizatorem i gniazdem zasilania, co sprawiłoby, że całość byłaby bardziej złożona i nieco droższa. Może też trochę mniejsza, ale z drugiej strony NodeMCU daje duży zestaw wyjść, które można użyć gdy trzeba będzie podłączyć więcej przekaźników lub inne elementy.

To co trzeba wiedzieć wybierając moduł przekaźnikowy , to że powinien być on sterowany zwarciem do masy. To jednak bardzo popularne rozwiązanie. Powinien być on też podobny do tego ze zdjęcia, żeby wymiary pasowały do obudowy. Nie jest to duży problem, bo typów bliźniaczych i podobnych modułów jest obecnie ograniczona liczba i nie ma problemu z zakupem takiego, jak trzeba.

NodeMCU i moduł przekaźników

Zakładamy więc, że urządzenie dostanie prąd z zasilacza 5V ze złączem microUSB (choćby popularnej ładowarki do telefonu). Piny VUSB i GND podłączymy do wejść VCC i GND w module przekaźnikowym. Zasilanie więc już mamy, teraz trzeba zadbać o sterowanie. Ponieważ moduł ma dwa przekaźniki, potrzebujemy dwóch wyjść NodeMCU. Wykorzystamy piny D5 i D6, które podłączymy do wejść IN1 i IN2 w module przekaźników. Ustawienie stanu niskiego na wyjściu powoduje załącznie przekaźnika, a stan wysoki wyłącza go. Potrzebujemy więc tylko 4 krótkich przewodów.

OpenSCAD - projekt obudowy

Dla uproszczenia połączeń oba układy w obudowie powinny być w pozycji “złączami do góry”. Wymusza to odwrócenie NodeMCU, co oczywiście nie ma wpływu na jego pracę. Oba układy mają otwory montażowe, które zostaną użyte do ustabilizowania w obudowie przez wypustki w dolnej części obudowy, zaś jej górna część będzie dociskała płytki tak, żeby się nie wysunęły. Do projektowania użyję tradycyjnie programu OpenSCAD , zaś za przygotowanie do druku będzie odpowiadał Repetier Host. Góra część obudowy zostanie wydrukowana z transparentnego PET-G firmy Devil Design , żeby było widać kiedy diody od przekaźników świecą.

ESP8266 - sterowanie urządzeniami elektrycznymi

W obudowie zostało umieszczone dodatkowe wyprowadzenie na przewód, którym w przyszłości ma być podłączony termomentr DS18B20, ponieważ urządzenie chcę zastosować w przyszłości do sterowania kotłem. Z tego powodu do dolnej części obudowy dodane zostały także uchwyty do przykręcenia na ścianie. To jednak temat na osobny wpis.

Gdy już mamy urządzenie gotowe, pora zająć się oprogramowaniem. NodeMCU, jak już opisywałem, programuje się z użyciem języka LUA. Zaczniemy od bardzo prostego przykładu - załączania i wyłączania przekaźników co określony czas.

local relay1time = 1300
local relay2time = 3330

local relay1state = 1
local relay2state = 1

gpio.mode(5, gpio.OUTPUT)
gpio.mode(6, gpio.OUTPUT)

local changeRelay1=function()
 relay1state=1-relay1state
 gpio.write(5, relay1state)
end

local changeRelay2=function()
 relay2state=1-relay2state
 gpio.write(6, relay1state)
end

tmr.alarm(0, relay1time, 1, changeRelay1)
tmr.alarm(1, relay2time, 1, changeRelay2)

Wgrywanie programu do NodeMCU już opisywałem . Po wykonaniu pliku wszystko działa jak należy.

To dobry program do testu czy podłączenie przekaźników jest poprawne, jednak skoro mamy sterować urządzeniami przez WiFi, to trzeba połączyć się z siecią i w jakiś sposób przyjąć polecenia. Program będzie możliwie najprostszy, bo bardziej zaawansowane funkcje zostaną opisane przy okazji tekstu o sterowaniu ogrzewaniem. Niech do sterowania posłuży przeglądarka internetowa, a polecenie włączenia lub wyłączenia będzie podawane w adresie jako 0 lub 1 dla każdego z przekaźników, np. /00 - wyłączenie przekaźników, /01 - włączenie drugiego przekaźnika.

Do wykonania tego zadania potrzebna jest podstawowa znajomość protokołu HTTP (czyli tego, jak łączy się z serwerem przeglądarka), jednak ten temat był poruszany choćby przy opisie protokołu do komunikacji urządzeń. Wiemy więc, że oczekujemy, że przeglądarka rozpocznie komunikację od GET /XX HTTP, gdzie XX to stan przekaźników, którego oczekujemy. Pozostaje więc nasłuchiwać na porcie 80 i reagować na zawartość początku komunikacji.

local SSID = "ssid"
local PASSWORD = "password"

gpio.mode(5, gpio.OUTPUT)
gpio.mode(6, gpio.OUTPUT)

wifi.setmode(wifi.STATION)
wifi.sta.config(SSID, PASSWORD)
wifi.sta.autoconnect(1)

local function connect(conn, data)

   conn:on ("receive",
      function (cn, req)
         if(string.sub(req,1,5)=="GET /") then

           if(string.sub(req,6,6)=="1") then 
             gpio.write(5,gpio.LOW)
           else
             gpio.write(5,gpio.HIGH)
           end

           if(string.sub(req,7,7)=="1") then 
             gpio.write(6,gpio.LOW)
           else
             gpio.write(6,gpio.HIGH)
           end
           cn:send ("HTTP/1.1 200 OK\n\nOk")
         else
           cn:send ("HTTP/1.1 200 OK\n\nError")
         end
         cn:close()
      end)
end

svr=net.createServer(net.TCP, 30)
svr:listen(80, connect)

Po wgraniu programu, urządzenie łączy się z siecią wifi. Po uruchomieniu pliku (lub po restarcie, jeżeli nazwaliśmy go init.lua), można włączyć przekaźniki łącząc się przeglądarką z adresem http://adres_urzadzenia/11. To oczywiście najprostszy przykład, ale w pełni działający.

Pliki z projektem obudowy można znaleźć w serwisie thingiverse.com .