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.

Advertisements

11 Responses to Sterownie urządzeniami elektrycznymi przez WiFi

  1. SpeX says:

    Dwie sprawy:
    1) Jak będziesz załączał urządzenia 230V, to nie lepiej było by dołożyć jeszcze sprawę zasilania 230V>5V do puszki, dzięki temu oszczędzisz na podciąganiu zasilania 5v. A 230 i tak musisz mieć.
    2) Nie da się tego sterować w inny sposób niż za pomocą „poleceń” GET?

    • techniczny says:

      1. Byłoby to możliwe, ale urządzenie jest uniwersalne – równie dobrze możne sterować sygnałami niskonapięciowymi. W moim przypadku będzie prawdopodobnie sterować kotłem gazowym.
      2. Wystarczy wpisać właściwy adres w przeglądarce. Łatwo to także zrobić z dowolnego skryptu. Natomiast w bardziej złożonej wersji oprogramowania planuję sterowanie przez pakiety UDP, tak jak w, niedawno opisywanym, urządzeniu do radiowego sterowania.

  2. Tomek says:

    Hej, Chciałbym zrobić zrobić coś takiego, nawet kupiłem nodemcu v2 i 2x moduły przekaźnikowe po 2 przekaźniki. Wszystko fajnie, ale nie mogę znaleźć normalnego softu. A mam tylko 2 życzenia: aby to działo dość płynnie i aby dało się sterować tym z internetu, z „każdego miejsca na ziemi”, ponieważ takie łączenie się za każdym razem z modułem jest niewygodne i czasochłonne. Tak w sumie to znalazłem ciekawą propozycję, jest to supla. ALE maja jakieś upośledzone gotowe softy i zero pomocy co do stworzenia własnego. Sprawdzałem parę softów od nich, zwątpiłem. Napisałem na e-mail i na fb. Na fb i emailu dostałem odpowiedź: napisz na forum. To fajnie napisałem na forum, nikt nie odpisywał przez ponad tydzień, potem odpisał jakiś admin, powiedział żeby samemu napisać… Masz jakieś propozycje co do jakiegoś softu?

    • techniczny says:

      Softu do czego konkretnie?

      • Tomek says:

        Do ESP8266-12E popularnie zwanego nodemcu v2 🙂 chyba, że chodziło o zastosowanie, to do sterowania dwoma przekaźnikami, a sprawa wydaje się być prosta bo chodzi o zwykłem sterowanie wartościami na pinach.

      • techniczny says:

        ESP-12 to jedna z części zastosowanych w NodeMCU v2. Co do oprogramowania – przedstawione we wpisie pozwala na płynne sterowanie (cokolwiek to znaczy). Z dowolnego urządzenia, w tym z telefonu (program pewnie wkrótce opiszę). Natomiast przyjęte podejście zakłada użycie jakiegoś centralnego sterownika (u mnie Raspberry Pi lub NAS QNAP).

        Jeżeli chodzi o sterowanie z Internetu, to drogi są dwie:
        – przekierowanie portu na routerze
        – połączenie w drugą stronę – urządzenie łączy się z jakimś serwerem/chmurą i czeka na zmianę stanu np. jakiejś strony; w ten sposób można by sterować np. przez twittera…

  3. Tomek says:

    Właśnie na samym początku obrałem drogę 2, dokładnie tak jak opisałeś. Ale troszkę mnie to przerosło i się zatrzymałem z braku umiejętności i zacząłem szukać projektów typu supla, ale wyszło jak wyszło 😛 i w sumie daje niewiem jak to zrobić. 😦

  4. Tomek says:

    Kupiłem sobie taki relaybox ale w międzyczasie zanim coś z nim ruszyłem, kolegał pokazał mi orządzenie o nazwie SONOFF, które jest dokładnie tym samym, ale jest już gotowcem i kosztuje poniżej 6USD jeśli kupije się je z Chin. Można je samodzielnie programować, bo w środku siedzi esp8266. Wadą jest to, że posiada tylko jeden relabox a tm samym można sterować tylk jednym urządzeniem. Jest też wersja dual, ale z tego co wyczytałem jest jakiś problem z jej flashowaniem. Obecnie czekam na tego Sonofa, jak dojdzie to się z nim pobawię. Chcę go wykorzystać do automatycznego wyączania/włączania modemu gsm. W domu mam internet zasilany z LTE. Modem LTE podpiety jest do routera z OpenWRT i niestety co jakiś czas (raz na 2 tygodnie) siada połączenie i potrzebny jest twardy restart. I właśnie chcę tuta wykorzystać tego Sonoff’a. Z poziomu serwera napiszę skrypt, który w wypadku braku internetu najpierw wykona reboot, a jesli to nie pomoże twardy restart. W skrypcie trzeba jeszcze dodać troszę logiki, aby taka akcja odbywała się nie częściej niz raz na jakiś czas (np. na godzinę), aby w przypadku problemu po stronie dostawcy, nie zabić modemu i routera.

    • techniczny says:

      Warto jeszcze rozważyć sterowanie przez „gniazdka” na 433MHz, także opisane na blogu. Też jest ekonomiczne i bardziej uniwersalne.

      Natomiast plusem tego rozwiązania jest możliwość dołączenia większej liczby przekaźników lub np. czujników.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: