
Witajcie moi drodzy
Pokażę tutaj jak można łatwo złożyć z gotowych modułów (ESP8266, zasilacz, przekaźnik) własny sterownik IoT na WiFi. W przykładowej wersji pozwoli on nam przez internet włączać/wyłączać jedno urządzenie. Będzie to tak jakby Sonoff wersja DIY, ze szczegółowym opisem kolejnych kroków. Do projektu użyję gotowego, darmowego firmware Tasmoty dla ESP. Dodatkowo przedstawię też jak można wygodnie sterować urządzeniami Tasmoty z darmowej aplikacji na telefon (bez użycia pośrednika/brokera).
Temat oczywiście przeznaczony jest dla nieco mniej zaawansowanych użytkowników. Raczej doświadczeni się tu nie dowiedzą wielu rzeczy.
Wstęp
Oczywiście samego Sonoffa nie ma raczej sensu robić samodzielnie, bo można go łatwo zakupić. Ale pokazana tutaj metoda jest uniwersalna, pozwala zrobić dowolny sterowany przez WiFi układ. Bardzo dużo można zrobić bez rekompilacji firmware Tasmoty (ten soft pozwala przez stronę ustawić co jest na jakich pinach ESP), a jeszcze więcej możliwości otwiera się gdy jesteśmy gotowi zrobić własną kompilację firmware i znamy trochę języka C.
W ten sam sposób można też przerzucić dowolne gotowe urządzenie 'smart home' oparte na ESP8266 (np. produkcji Blitzwolfa) na Tasmotę i używać go normalne z softem open source, wolnym od pośrednictwa chmury producenta. Niektórzy mają często różne zarzuty, że producent może np. śledzić i zapisywać działania użytkownika, a proces z tematu wyklucza to ryzyko.
Użyte moduły
Do projektu użyłem łatwych do kupienia modułów.
Przede wszystkim, moduł WiFi, czyli płytka z ESP8266, tutaj ESP8266-01. Kilka zdjęć z aukcji:


Wyprowadzenia:

UWAGA: ESP8266 zasilamy z 3.3V. Napięcie 5V go uszkodzi!
Zasilacz 5V. Im mniejszy tym lepiej, ale musi zapewniać dostateczny prąd dla ESP i dla tego co chcemy podłączyć. Pomiary prądu przy napięciu 5V dla ESP8266-01 i jednego przekaźnika umieszczam na końcu tematu.

Parametry:
Quote:
Input voltage AC85 ~ 265v 50 / 60HZ
Output voltage DC5V
Operating current 500mA Dimensions
Volume: LWH 32 * 18 * 13 (mm)
Zdjęcia:



Zasilacz powyżej to oczywiście zasilacz impulsowy w topologii flyback, oparty o układ AP8012, po stronie wtórnej widać też TL431 (czyli precyzyjne źródło napięcia referencyjnego), pod dużym kondensatorem łączącym stronę wtórną z pierwotną jest transoptor. Na wyjściu ten zasilacz ma dwa kondensatory elektrolityczne i dławik, tworzące razem filtr, ale na wejściu nie ma żadnego bezpiecznika, więc też taki należy dać luzem. Bezpiecznik dobrałem od starego zasilacza 5V o podobnej mocy.
Przekaźnik na 5V, SRD-05VDC-SL-C jest bardzo popularny:

Schemat wewnętrzny, wyprowadzenia:

Zdjęcie:

Dodatkowo:
- jakiś konwerter USB na UART do wgrania wsadu na ESP (lub 'programator' ESP na USB)
- regulator LDO 3.3V, do zasilanie ESP. Pod ręką miałem MCP1702, regularnie też używam TC1264
- Tranzystor (do włączania przekaźnika). Użyłem BC547
- Dioda którą podłącza się równolegle do uzwojenia przekaźnika, może być 1N4148
- Przycisk
- Kilka kondensatorów (100nF przed LDO, 100nF za LDO, jakiś elektrolityczny za LDO)
- gniazdo goldpin 4x2 pod ESP i dodatkowo lepiej też pod zasilacz (by można go łatwo wyjąć)
- Drobnica (rezystory, zworki)
Poniżej przedstawię krok po kroku procedurę składania własnego Sonoffa.
Krok 1 - programowanie ESP8266
Najpierw trzeba wgrać odpowiedni soft na ESP8266. Można to zrobić dowolną przejściówką USB/UART HW-597:

Ta przejściówka wspiera poziom logiczny 3.3V UART wymagany przez ESP8266; w celu ustawienia go trzeba dać zworkę na piny VCC i 3.3V; jednak zasilić ESP8266 nie możemy z pinu 3.3V tam bo ma za małą wydajność prądową, trzeba podłączyć regulator LDO 3.3V do 5V z USB (też jest wyprowadzone na przejściówce). Dodatkowo potrzebujemy rezystorów 10k na RST i CH\PD. Szczegóły poniżej:

(warto wiedzieć, że np. w przypadku innego modułu z ESP, np. czegoś od Tuyi, może być potrzeba umieszczenia rezystora pull-up na IO0, ale płytka użyta w tym temacie już ten rezystor na sobie ma, dlatego go nie dałem na schemat)
Połączenia te wykonałem na płytce stykowej:


Najpierw sprawdziłem działanie komend AT. Firmware od AT jest domyślnie wgrany na ten moduł z ESP, ale oczywiście nie będzie działać jeśli go nadpiszemy. Nie trzeba zwierać IO0 by przetestować AT.

Po wysłaniu komendy "AT" moduł odpowiedział "OK", więc komunikacja działa.
Następnie przyszła pora wgrania wsadu Tasmoty. Do pobrania stąd:
http://ota.tasmota.com/tasmota/release/
Po stronie komputera użyłem esptool.py zainstalowanego wraz z paczką wsparcia ESP dla Arduino IDE:
https://github.com/esp8266/Arduino
Zainstalowałem ją poprzez Boards Manager.
Procedura programowania tutaj jest następująca:
- odłączyć wszystko od zasilania (wyjąć wtyczkę z portu USB)
- zewrzeć pin GPIO0 do masy
- podłączyć z powrotem zasilanie
- odczekać kilka sekund
- odłączyć GPIO0 od masy
- uruchomić esptool
Oczywiście zamiast odcinania zasilania można użyć po prostu pinu RESET, ale wolę tu opisać sposób bez użycia pinu RESET gdyż niektóre gotowe moduły/urządzenia smart np. od Tuya nie mają pinu RESET wyprowadzonego, wiec ten sposób stąd jest uniwersalniejszy.
Na początek samo sprawdzenie komunikacji - komenda esptool.py chip_id. Powinno poprawnie samo wykryć port COM a potem już moduł ESP, jego MAC, itp.

Jak wszystko jest ok, to można już programować. Komenda esptool.py write_flash 0x0 tasmota.bin (plik .bin umieściłem w tym samym folderze co było esptool).

Od tego momentu ESP ma wgrany flash Tasmoty (i nie będzie już obsługiwać komend AT, flash od AT został nadpisany)
Krok 2 - konfigurowanie Tasmoty - konfiguracja WiFi
Po ponownym uruchomieniu modułu (pamiętamy, by odpiąć GPIO0 od masy) powinna ukazać się nam sieć WiFi Tasmoty:

Po podłączeniu się do tej sieci można rozpocząć konfigurację Tasmoty, czyli podać urządzeniu namiary na nasze WiFi. Urządzenie dostępne jest zawsze na IP 192.168.4.1 (oczywiście to tylko tymczasowo, potem dostanie już swoje IP przez DHCP od naszego routera):

Tutaj też ustawiamy nazwę hosta naszego urządzenia (hostname) której możemy używać do jego rozpoznania zamiast adresu IP.
Zapisujemy zmiany:

W tym momencie sieć WiFi od Tasmoty powinna zniknąć. Natomiast nasz router powinien wykryć nowe urządzenie.

192.168.0.107 to jest IP przypisane ESPowi poprzez DHCP przez nasz router. Te IP jest zmienne, może w przyszłości być inne. Komunikat "lease host name not found" oznacza, że mój router nie wspiera ustawiania nazwy hosta klienta, nie jest to niezbędne, choć mogłoby się przydać jeśli byśmy np. używali skanera IP by określić jakie urządzenia mamy podłączone.
Krok 3 - konfigurowanie Tasmoty - konfiguracja pinów wyjścia
Od teraz urządzenie dostępne jest w naszej sieci WiFi pod adresem 192.168.0.107. Można tam określić co jest podłączone do którego pinu ESP i jak jest sterowane:

Otwieramy Configuration:

Potem Configure Module:

W tym miejscu możemy zrobić dwie rzeczy. Można ustawić konkretny rodzaj płytki jaki mamy (ogranicza nam to ilość dostępnych pinów):

Możemy też ustawić rolę konkretnych pinów (a ról jest dużo, wszystko gotowe do użycia):

Możemy ustawić różną ilość przekaźników (po prostu wybiera się im indeks) i Tasmota sama utworzy dla nich przyciski na stronie WWW, fizyczne przyciski z układu też sama z nimi połączy (po indeksie).
Tak zrobiony układ działa - stan diody LED można zmieniać zarówno przyciskiem jak i przez stronę. Po zmianie stanu diody LED przyciskiem strona sama się po chwili odświeża:


Krok 4 - reszta układu
To już jest kwestia inwencji twórczej użytkownika. Można samemu wytrawić PCB, można je zlecić płytkarni, można zlutować całość na uniwersalnej płytce wierconej. Układ jest prosty, nie powinno być żadnego problemu. Należy jedynie pamiętać o tym by zachować odpowiedni odstęp między ścieżkami podłączonymi do sieci a resztą układu. W przypadku płytki wierconej warto w ogóle usunąć oczka miedzi między nimi (lekkie naciśnięcie ich grotem lutownicy spowoduje ich odpadnięcie). Warto też użyć gniazd pod moduł zasilacza i ESP8266, by móc w razie czego je wyjąć np. do update firmware (choć można go też wykonać przez WiFi).
Schemat połączeń:

W zasadzie wszystko jak w Sonoff, warto się też więc z jego schematem zapoznać:


W Sonoff też są dwa napięcia, 5V dla przekaźnika i 3.3V dla ESP. Przekaźnikiem steruje 2N7002.
Ostateczna konfiguracja Tasmoty:

W trakcie składania:

Prawie gotowe:

Krok 5 - obudowa
W układzie występują napięcia niebezpieczne dla życia, więc tym bardziej należy pomyśleć o obudowie. Swoją obudowę zaprojektowałem w Blenderze i wydrukowałem z filamentu PLA na drukarce 3D Ender 3 Pro. Projekt obudowy:


Składanie:


Złożony przekaźnik:

Obudowa składa się z czterech części:
- podstawa
- pokrywa
- dodatkowa osłona terminali śrubowych
- przycisk (a właściwie to "przedłużka" która wciska przycisk tactile switch)
Krok 6 - Statyczne IP
Zostaje jeszcze kwestia adresu IP urządzenia. Domyślnie nadawany jest on dynamicznie przez router poprzez DHCP, czyli może ulec zmianie. Nie zawsze jest to coś co jest przez nas oczekiwane.
Na szczęście Tasmocie można nadać statyczne IP, czyli takie, które się nie zmienia.
Wykonuje się to w konsoli Tasmoty:

Wpisujemy tam: IPAddress 192.168.0.50
W konsoli powinna pojawić się odpowiedź:
Quote:
13:19:26 CMD: IPAddress 192.168.0.50
13:19:26 RSL: stat/tasmota_EC3F8F/RESULT = {"IPAddress1":"192.168.0.50 (192.168.0.107)"}
Następnie trzeba uruchomić ponownie urządzenie:

Od tego momentu urządzenie będzie mieć ciągle ten adres IP. Gdybyśmy korzystali z MQTT i brokera nie byłoby to potrzebne, ale tutaj pokazuję jak poradzić sobie bez tego.
Krok 7 - Aplikacja na telefon
Normalnie trzeba by postawić jeszcze swojego brokera MQTT, czyli takiego pośrednika między naszym telefonem a urządzeniami Tasmoty, ale do pewnego stopnia można to pominąć.
Są aplikacje które pozwalają bezpośrednio sterować urządzeniami Tasmoty.
Różnią się one od aplikacji Blitzwolfa, Smart Life, i innych firm przede wszystkim tym, że nie wymagają połączenia z serwerem producenta, czyli też nie śledzą, nie zbierają danych, a my mamy nad wszystkim kontrolę.
(Chociaż w idealnym scenariuszu to powinniśmy sami skompilować taką aplikację z kodu źródłowego, a nie ściągać np. z Google Play).
Przykładem takiej aplikacji może być Tasmota Control:

UWAGA: DHCP na routerze nie gwarantuje, że te samo urządzenie dostanie zawsze to samo IP. Jeśli chcemy na dłuższą metę korzystać z tej apki, to musimy skonfigurować to tak, by miało statyczne IP. Inaczej sparujecie apkę z urządzeniem, a potem minie kilka dni (lub miesięcy) i nagle nastąpi zmiana IP urządzenia na inne... alternatywnym rozwiązaniem jest odnoszenie się do urządzenia po jego nazwie hosta. Można jej używać zamiast adresu IP.
Po uruchomieniu Tasmota Control mamy do wyboru trzy przyciski:

W Configuration dodajemy nowe urządzenie. Sprowadza się to tylko do wpisania jego adresu IP (i portu 80, gdyż komunikacja odbywa się po HTTP). Nic więcej nie potrzeba:




Interfejs jest tu troszkę dziwny, bo najpierw musimy kliknąć "Add", potem dopiero znaleźć dopiero co dodane urządzenie na liście, kliknąć "Edit" i tam w "General" ustawić IP. Ale to wersja beta.
Od tego momentu w Devices mamy nowe urządzenie:

I możemy nim sterować przez telefon, oczywiście bez pośrednictwa osób trzecich (bez zewnętrznych firm, które mogą o nas gromadzić dane) i bez potrzebny podłączenia się do internetu, wszystko w obrębie naszego jednego WiFi.
Krok 8 - prezentacja
Filmik poniżej pokazuje działanie złożonego przekaźniczka, wraz z jego strona WWW do kontroli (tą postawioną na ESP) oraz aplikacją Tasmota Control. Widać jak szybko reaguje przekaźnik na przycisk oraz jak szybko aplikacje pokazują jego nowy stan:
Warto tu jeszcze zaznaczyć jak to wewnętrznie działa. Aplikacje tutaj na bieżąco muszą odpytywać ESP o jego stan, używają do tego protokołu HTTP, a dokładniej zapytań w stylu:
http://192.168.0.50/cm?cmnd=Status%200
To samo można wysłać przez przeglądarkę i zobaczyć co Tasmota odpowie. Odpowiedź Tasmoty:

Ta odpowiedź jest w formacie JSON.
Tak samo aplikacje sterują przekaźnikiem. Wysyłają komendę poprzez HTTP:
http://192.168.0.50/cm?cmnd=Power%20TOGGLE
ESP odpowiada na to:
{"POWER":"ON"}
Oczywiście mamy jeszcze MQTT, ale tutaj akurat nie jest on używany.
Dodatkowo nasuwa się już jeden wniosek - otwarta aplikacja (lub strona internetowa) aktywnie odpytuje ESP o jego stan. To aplikacja nawiązuje połączenie (jako klient) a ESP tylko odpowiada.
Pomiar napięcia, prądu
Zmierzyłem też ile prądu pobiera przedstawiony tu układ, osobno z włączonym i wyłączonym przekaźnikiem.
Pomiar wykonałem na wyjściu zasilacza 5V (czyli straty na nim nie są uwzględnione), czyli przed użytym regulatorem 3.3V MCP1702.
Na wyjściu jest stabilne 5V, nawet pod obciążeniem:

Następnie zużycie prądu. Z włączonym przekaźnikiem:

Z wyłączonym:

Zużycie prądu trochę się zmienia w zależności od tego czy ESP nadaje. Na zdjęciach powyżej są największe zanotowane pomiary jakie miałem, czasem były też niższe. W trakcie pomiarów ESP był podłączony do mojej sieci WiFi i miałem jego stronę internetową otwartą (czyli ESP na bieżąco się komunikował i musiał nadawać; bo zarówno strona internetowa jak i aplikacja na telefon na bieżąco odpytują ESP o jego stan).
Zauważyłem, że w momencie gdy ESP nie nadaje wcale to zużycie prądu spada z pokazanego 60mA nawet do 20mA.
Podsumowując, przy aktywności sieciowej ESP mamy:
- z włączonym przekaźnikiem aż do 140mA przy 5V, czyli 0.7W (+ straty na zasilaczu)
- z wyłączonym przekaźnikiem aż do 70mA przy 5V, czyli 0.35W (+ straty na zasilaczu)
Gdy ESP nie nadaje, to zużycie prądu spada. ESP nie nadaje cały czas, więc pewnie zasadniczo zużywa mniej niż te 0.7W.
Wyniki moich pomiarów są zgodne z pomiarami dla klasycznego Sonoff które znalazłem w sieci.
Wskazówka: Jak działa odświeżanie strony Tasmoty?
Możemy jeszcze podejrzeć jak zrealizowane jest odświeżanie strony WWW urządzenia Tasmoty. W tym celu obejrzymy jej źródło wpisując w przeglądarce:
view-source:http://192.168.0.50/?
W ten sposób można obejrzeć kod HTML dowolnej odwiedzanej przez nas strony internetowej.
Kod strony Tasmoty wygląda tak:
Code: html
Mamy tutaj trzy sekcje. Sam kod HTML strony, styl CSS strony (blok style) oraz kod skryptu Javascript który odpytuje dokładnie co 2345 ms urządzenie Tasmoty o jego stan, tutaj:
Code: javascript
Funkcja 'la' wywołuje sama siebie poprzez setTimeout i regularnie wysyła kolejne zapytania GET poprzez XMLHttpRequest które potem są odbierane w onreadystatechange. Funkcja z onreadystatechange podmienia tylko fragment strony ze stanami przekaźników, nie przeładowuje całej strony.
Wskazówka: Reset Tasmoty
Tasmota posiada wbudowaną możliwość zresetowania ESPa do stanu sprzed parowania z WiFi. Uruchamia się ją dłuższym wciśnięciem przycisku określonego jako Button1 (około 40 sekund). Po jej włączeniu ESP znów jest widoczny jako otwarta sieć "tasmota-xxxx".
Wiąże się z tym jednak pewien problem.
Jeśli konfigurujemy nasze urządzenie samodzielnie i coś źle ustawimy z przyciskiem (np. damy wersję active-up z rezystorem pull-up), na skutek czego ESP "pomyśli", że ma wciśnięty ciągle przycisk, to po 40 sekundach sam zresetuje się do stanu początkowego.
Da się jednak to łatwo wyłączyć.
W konsoli Tasmoty wpisujemy:
setoption1 1
oraz
setoption13 1
Wskazówka: Piny ESP8266
Przy podłączaniu elementów do ESP8266 musimy mieć świadomość tego, że ściągnięcie do masy niektórych pinów może zablokować bootowanie układu. Wtedy ESP8266 po prostu się nie włączy i nie będzie obecny w sieci WiFi.
Problem jest o tyle większy, że wszystko będzie działać jeśli podłączymy coś do tych pinów już w trakcie działania ESP (np. podczas zabaw na płytce stykowej). Kłopoty zaczną się dopiero gdy odłączymy i ponownie podłączymy zasilanie.
Poniżej lista pinów ESP8266-01 na które trzeba uważać:
- GPIO0 (stan niski przy bootowaniu powoduje włączenie trybu programowania)
- GPIO1 (pin TX; stan niski przy bootowaniu powoduje włączenie chip_test_mode)
- GPIO2 (niski stan zablokuje bootowanie)
- GPIO15 (pin CS od SPI; wysoki stan na nim zablokuje bootowanie)
Stan niski na pinie może powodować również taki układ:

Gdy podłączymy go np. do GPIO1 (TX) to ESP się nie uruchomi.
Więcej można poczytać o tym w nocie katalogowej ESP8266:

Dla wygody poniżej ją załączam:
Wskazówka: Nazewnictwo pinów ESP
Warto tu jeszcze zwrócić uwagę na to, że nie zawsze numer pinu GPIO odpowiada numerowi pinu na używanej płytce. Na przykład w przypadku NodeMCU:

Na grafice widać wyraźnie, że np. D1 to GPIO5, D4 to GPIO2, a D3 to GPIO0. Może to przysporzyć nieco kłopotów poczatkującym, dlatego tu o tym wspominam.
Wskazówka: Pamięć ESP8266
Sam ESP8266 nie posiada pamięci Flash; pamięć ta znajduje się w układzie tuż obok, na zdjęciu poniżej jest to MK25D80B:

80 sugeruje, że jest to pamięć 8Mbit, czyli 1MB:

Zgadza się to też z tym co wykrywa programator:

1MB to może być dość mało, zwłaszcza jeśli chcemy mieć możliwość aktualizowania wsadu przez WiFi. W tej sytuacji rozmiar pamięci Flash powinien być na tyle duży, by móc jednocześnie pomieścić aktualny wsad i nowy wsad, gdyż w procesie aktualizacji oba muszą być w pamięci jednocześnie. Możemy na szczęście odlutować pokazaną powyżej pamięć Flash i na jej miejsce dać zamiennik o większym rozmiarze, na przykład W25Q32BVSSIG/W25Q32BVSIG/25Q32BVSIG/W25Q32.

Wskazówka: ESP8266 USB Flasher
Pokazana przeze mnie metoda wgrania wsadu na ESP8266 przy użyciu przejściówki HW-597 jest uniwersalna, ale można też kupić pod ten konkretny użyty tutaj moduł ESP-01 gotowy programator:

ESP-01 po prostu się na niego nakłada:

Z pewnością jest to prostsze niż to co przedstawiłem, choć samo działanie jest identyczne.
Wskazówka: Pisanie programów pod ESP8266
Warto jeszcze wspomnieć, że możemy samodzielnie pisać programy pod ESP8266, używa się do tego Arduino IDE. Trzeba w tym celu zainstalować paczkę wsparcia ESP poprzez Boards Manager. Szczegóły tutaj:
https://github.com/esp8266/Arduino
Poruszałem tą kwestię już w innym temacie, tutaj:
https://www.elektroda.pl/rtvforum/viewtopic.php?p=19056892#19056892
W temacie powyżej użyłem modułu TYWE3S z urządzenia 'smart', ale tam też siedzi ESP8266, tylko inaczej są wyprowadzone piny.
Załącznik
Umieszczam tutaj mój model obudowy klonu Sonoff wykonany w programie Blender:
Jak otworzycie go Blenderem, to możecie wyeksportować STLe.
Podsumowanie
W pokazany tutaj sposób możemy samodzielnie złożyć własny kontroler IoT z dowolną ilością przekaźników, przycisków i nie tylko. Wsad Tasmoty można do niego wygodnie dostosować przez formularz WWW. Można również go kontrolować przez WWW i przez aplikację na telefon; nie jest potrzebny do tego żaden zewnętrzny serwer ani broker. Ważne tylko jest statyczne IP, bo inaczej prędko nasze urządzenie IoT się "zgubi" lub nawet zamieni miejscami z innym urządzeniem. Zamiast statycznego IP można też użyć nazwy hosta (unikalnej dla każdego urządzenia, ustawianej przy konfiguracji Tasmoty), wtedy IP już może być zmienne.
Do opracowania została kwestia MQTT oraz brokera, ale jak widać nie są one niezbędne do zrobienia sobie własnej namiastki 'smart house'.
Czy macie jakieś doświadczenia z Tasmotą lub ogólnie tematem ESP i IoT? Zapraszam do dyskusji.
Cool? Ranking DIY