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.

ESP8266 podłączone do komputera

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:

Wgrywanie firmware do esp8266 w linuksie

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 🙂

Połączenie minicomem z ESP8266

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.

Przejściówka płytka stykowa - esp-01

I teraz moduł ESP-01 można ładnie wpiąć w płytkę stykową.

ESP01 na płytce stykowej

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..'&degC<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ć.

ESPlorer - wgrywanie softu

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:

Płytka stykowa - DHT11 i ESP8266

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ę:

Serwer www na ESP8266

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.

Możesz również polubić…

7 komentarzy

  1. orideith pisze:

    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

    • Wojtek pisze:

      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.

  2. piotrbrzuska pisze:

    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 ?

    • Wojtek pisze:

      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.

  3. maniek1818 pisze:

    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?

  4. Jerzy pisze:

    Fajny przykład. Da się podłączyć moduł micro-SD i zapisać na karcie dane z czujnika.

  1. 10.04.2016

    […] jest dość prosty. Ja swój układ zbudowałem na płytce stykowej z użyciem modułu ESP-01 z adapterem, płytki zasilającej ustawionej na 3,3V i cyfrowego czujnika temperatury DS18B20. Poglądowo […]

Leave a Reply

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.