ESP8266 i Linux, pierwszy program z obsługą DHT11
W zeszłym miesiącu podałem nieco podstawowych informacji o ESP8266 i obsłudze z poziomu Windows. W tym wpisie pokażę jak wgrać firmware za pomocą komputera z linuksem. Napiszemy też pierwszy, całkiem przydatny program wyświetlający temperaturę i wilgotność powietrza na stronie www. Z uwagi na multiplatformowość używanego narzędzia ESPlorer, podane niżej wskazówki zadziałają na komputerach Windows jak i Linux.
Linux i wgrywanie firmware NodeMCU do ESP8266
Firmware pobieramy ze strony źródłowej, czyli: GitHub NodeMCU Releases. W linuksach do wgrania softu, wystarczy prosty skrypt w pythonie o nazwie esptool.py, który można znaleźć tutaj: GitHub Esptool. By wszystko zadziałało, prócz pythona potrzebna będzie biblioteka python-serial, najczęściej jest ona już w systemie. Zaczynamy od podłączenia ESP-01 do przejściówki RS232 TTL<->USB – masa, zasilanie 3V3 do VCC i CH_PD, RX do TXD, TX do RXD, na czas wgrywania masa do GPIO0. Dokładniejszy opis zrobiłem w poprzednim wpisie.
W folderze, w którym zapisany został skrypt esptool.py otwieramy terminal i nadajemy prawa do uruchamiania:
chmod +x esptool.py
Uruchamiając skrypt trzeba podać jako parametry: port, do którego jest podłączony ESP-01 (w tym przypadku ttyUSB0), tryb pracy (write_flash), adres początku zapisu (0x000000), ścieżka do pliku z firmware. Ja musiałem wklepać:
./esptool.py --port /dev/ttyUSB0 write_flash 0x000000 nazwa_pliku_firmware.bin
Po około minucie w ESP8266 mamy nowe oprogramowanie. W terminalu wyglądało to tak:
Występujące błędy najczęściej są spowodowane brakiem podłączenia portu GPIO0 do masy, złym portem szeregowym (niewłaściwą nazwą), kiepskim (niestabilnym) napięciem 3,3V z przejściówki RS232<->USB.
Warto sprawdzić, czy ESP8266 “żyje”, poprzez podpięcie się do niego przez port szeregowy jakimkolwiek terminalem z prędkością 9600. Ja użyłem prostego i popularnego minicoma, zestawiając połączenie:
minicom -D /dev/ttyUSB0 -b 9600
ESP-01 ma się dobrze, komunikuje się z komputerem 🙂
Usprawnienie – przejściówka dla ESP-01 do płytki stykowej
Od tego miejsca wszystkie informacje będą przydatne zarówno dla posiadaczy Windowsów jak i fanów pingwina. Bawiłem się trochę ESP-01, które było podpięte kilkoma kabelkami do płytki stykowej, kolejne kabelki łączyły się z przejściówką PL2303. Przesuwanie i przenoszenie takiego potworka powodowało rozłączanie się przewodów i niepotrzebnie wprowadzało nerwową atmosferę. W kwadrans skleciłem prostą przejściówkę, która rozszerza dwa rzędy po 4 goldpiny ze 100 milsów na 400, co pozwala wpiąć ESP-01 do płytki stykowej. Potrzebne materiały to dwa rzędy po 4 goldpiny męskie i żeńskie (gniazda) lutowane do druku oraz kawałek uniwersalnej płytki drukowanej. Połączenia zrobiłem kropelkami cyny, na tzw. zwarcia, które akurat tutaj są przydatne.
I teraz moduł ESP-01 można ładnie wpiąć w płytkę stykową.
Rozwiązanie zredukowało liczbę kabli do czterech – masa, zasilanie, RX i TX podłączonych do konwertera na chipie PL2303.
Pierwszy program – serwer www z obsługą czujnika DHT11
ESP8266 może pracować niejako w dwóch trybach: pierwszym, kiedy to wykonuje program wpisywany w czasie rzeczywistym, linijka po linijce oraz w znacznie funkcjonalniejszym, drugim, gdy program w postaci pliku lua jest zapisany we flashu. Cały kod może być podzielony na kilka plików, ale tylko ten o nazwie init.lua będzie wykonywany automatycznie po starcie modułu. Cały poniższy kod będzie znajdował się właśnie w tym pliku.
Warto jeszcze wspomnieć o obsłudze DHT11 – w sieci jest wiele przykładów, często z dodatkowym kodem obsługi transmisji. Sporo osób pisało później, że ich czujniki pokazywały bzdury. Trochę posiedziałem nad tematem i doszedłem do wniosku, że najczęstszym winowajcą był firmware, a właściwie wiele jego różnych wersji. Często wystarczyło, że ktoś wgrał inny soft niż autor kodu i problem gotowy. Ostatecznie problem został rozwiązany przez deweloperów nodemcu, którzy zaszyli moduł DHT. Od wersji 0.9.6 obsługa DHT11/22 sprowadza się do pojedynczych komend.
Cały kod programu wygląda tak:
function czytaj_dht() pin = 4 --pin GPIO2 podlaczony do DATA w DHT11 status,temp,humi,temp_decimal,humi_decimal = dht.read11(pin) if( status == dht.OK ) then print( "Temperatura: "..temp.."°C; ".."Wilgotnosc: "..humi.."%"); elseif( status == dht.ERROR_CHECKSUM ) then print("Blad sumy kontrolnej czujnka DHT"); elseif( status == dht.ERROR_TIMEOUT ) then print( "Czujnik DHT nie odpowiada" ); end end wifi.setmode(wifi.STATION) wifi.sta.setip({ip="10.0.0.215",netmask="255.255.255.0",gateway="10.0.0.1"}) wifi.sta.config("air2radio","silne_haslo") srv=net.createServer(net.TCP) srv:listen(80,function(conn) czytaj_dht() conn:send('<html><head><meta content="text/html;charset=utf-8"/>\ <meta http-equiv="refresh" content="60"/>\ <title>ESP8266 i DHT11 - grylewicz.pl</title></head>\ <body style="background-color:#FFFFFF; font-size:50px"><font color="black">\ <center>Test ESP-01 i DHT11<br><br>\ <IMG SRC="http://esp8266.fancon.cz/common/tmp.gif"WIDTH="64"HEIGHT="64"><br>\ '..temp..'°C<br>\ <IMG SRC="http://esp8266.fancon.cz/common/hyg.gif"WIDTH="64"HEIGHT="64"><br>\ '..humi..' %<br><br></font></center></body></html>') conn:on("sent",function(conn) conn:close() end) end)
Do wgrania kodu, najwygodniej będzie posłużyć się narzędziem ESPlorer, o którym już wspomniałem tutaj. Po pobraniu i rozpakowaniu paczki ze strony http://esp8266.ru/esplorer/, użytkownicy Windowsa uruchomią go klikając w plik ESPlorer.bat, linuksiarze wpiszą w terminalu:
java -jar ESPlorer.jar
Oczywiście, bez względu na posiadany system operacyjny, niezbędna jest java.
Kod powyższego programu kopiujemy i wklejamy w okienko z lewej strony (1). Następnie odświeżamy porty (2), upewniamy się, że został wybrany właściwy (3), zestawiamy połączenie Open (4). Dla pewności można wcisnąć Format (5), co usunie wszystkie wcześniej zapisane pliki w pamięci ESP8266. Wciskając Save to ESP (6) po raz pierwszy zostaniemy poproszeni o podanie nazwy pliku – wpisujemy init.lua i program zacznie być kopiowany linijka po linijce do modułu. Po prawidłowej transmisji wciskamy Reset (7) i program powinien zacząć działać.
W przypadku częstych błędów transmisji warto dołożyć w linię zasilania 3V3 kondensator elektrolityczny o pojemności kilkuset mikrofaradów. Ustabilizuje to napięcie zasilania i pozwoli na poprawną komunikację. Mój układ zmontowany na płytce stykowej wygląda tak:
Pin 2 (Data) czujnika DHT11 jest dołączony do portu GPIO2 oraz do napięcia 3,3V przez rezystor 4,7kΩ. Nagrałem krótki film prezentujący ładowanie softu do ESP8266 w ESPlorer:
Jak to działa? Na początku mamy funkcję, której zadaniem jest odczyt temperatury i wilgotności z czujnika oraz sprawdzenie poprawności transmisji. Kolejna części jest odpowiedzialna za połączenie WiFi, korzystamy ze statycznego IP, wpisujemy też nazwę sieci i hasło, do której ma się połączyć moduł ESP-01. Trzecia część to uruchomienie serwera www na porcie 80. Każde jej wywołanie (żądanie na porcie 80) spowoduje wywołanie zdefiniowanej na początku funkcji odczytu z czujnika z zwrócenie kodu HTML Przeglądarka będzie sama odświeżać stronę co 60 sekund, więc wyświetlane wyniki będą aktualne. Generalnie moduł ESP-01 nie musi mieć dostępu do internetu, komputer z którego się łączymy również – co najwyżej nie wyświetlą się obrazki termometru i kropelki wody, pobierane z zewnętrznego serwera. Po wpisaniu IP naszego mikroserwerka powinniśmy ujrzeć mniej więcej taką stronę:
Jak widać możliwości zarówno sprzętu jak i oprogramowania są duże, a osiągnięte wyniki zostały uzyskane niewielkim nakładem czasu jak i pieniędzy.
Od razu polecam Ci arduino w ESP, nodemcu mało, że się zwiesza to ekspresowo zajmuje pamięć. Z raportu po wrzuceniu firmware do ESP z Arduino
—
Szkic używa 252 898 bajtów z (58%) pamięci programu. Maksimum to 434 160 bajtów.
Globalne zmienne używają 39 172 bajtów z (47%) dynamicznej pamięci, pozostawiając 42 748 bajtów dla lokalnych zmiennch. Maksimum to 81 920 bajtów.
—
Ogólnie po resecie wolne około 38kb ramu. Załadowałem DHT11, DS18B20, serwer www, i wysyłkę danych na thingspeak to samo na nodemcu czasem nie chciało się załadować z braku pamięci a ramu po wszystkim miałem około 8kb
Dzięki za info, an pewno pobawię się ESP i Arduino. Co do nodemcu, to na razie nie zauważyłem niestabilnej pracy, niektóre układy pracowały bez przerwy przez kilka dni i było OK.
Cześć, Od jakiegoś czasu chciałem zabrać za elektronikę i zbudować kilka elementów do ‘inteligentnego domu’. Ogólnie jestem programistą, z wykształcenia fizykiem ale z samą elektroniką nie miałem wiele wspólnego.
I tu moje pytanie: ja zrobić żeby zasilać prezentowany przez ciebie układ z baterii ?
Hej. Jeśli napięcie baterii będzie wynosiło 3.0-3.6V, to możesz podłączyć ją bezpośrednio pod ESP8266. Jeśli będzie wyższe, zastosuj przetwornicę obniżającą (step-down), np. na układzie XM1584 (na aliexpress kupisz za $0,60). Z uwagi na pobór prądu, bateria powinna mieć sporą pojemność. Warto rozważyć akumulator żelowy.
Próbowałem zrobić interaktywną stronkę wg tego poradnika. Usunąłem nawet sporo opcji, więcej nic nie ruszałem.
http://www.allaboutcircuits.com/projects/how-to-make-an-interactive-tcp-server-nodemcu-on-the-esp8266/
Po załadowaniu strona wyświetla się w porządku, zaś po naduszeniu kontrolki dubluje się. Testowałem na iphone i androidzie. W komputerze strona wyświetla się i działa w porządku.
https://scontent-ams2-1.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/10314610_1102743989770174_5218556967554209823_n.jpg?oh=e9ac90e709e5ca17d8e37210bd808e38&oe=570EBA15
W czym może tkwić problem?
Fajny przykład. Da się podłączyć moduł micro-SD i zapisać na karcie dane z czujnika.