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.
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 🙂
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.
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.
Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…
Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…
Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…
W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…
Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…
Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…
Zobacz komentarze
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.