Witam,
Dziś pokażę jak w łatwy sposób odczytać temperaturę, wilgotność i ciśnienie przy użyciu ESP8266 i czujnika BME280.
BME280
Miniaturowy czujnik typu all-in-one produkcji Bosch. Potrafi mierzyć temperaturę, wilgotność i ciśnienie. Do komunikacji z nim możemy użyć I2C albo SPI. Dodatkowo imponująca dokładność pozwala na pomiar wysokości na jakiej znajduje się czujnik – względem poziomu morza. Dość dużo, jak na czujnik który od Chińczyka możemy mieć już za 11pln. Czujnik sam w sobie wygląda tak:
Natomiast wygodna w użyciu implementacja następująco:
ESP8266 + BME280 – połączenie
W naszej implementacji do komunikacji użyjemy I2C – w celu oszczędności pinów, dzięki temu będziemy potrzebować 4 przewodów połączeniowych:
- zasilanie: VCC, GND
- komunikacja SDA(SDI) i SCL(SCK)
łączymy je jak na zdjęciu poniżej:
Flash ESP8266
Po poprawnym połączeniu czas przejść do programowania. Do tego celu użyjemy zbudowanej do naszych celów binarki dla NodeMCU i języka LUA.
1. Generowanie pliku *.bin dla NodeMCU
Wchodzimy na stronę https://nodemcu-build.com/ W pierwszym kroku podajemy naszego maila – na którego przyjdzie wygenerowany plik wsadowy. Następnie z dostępnej listy bibliotek zaznaczamy te których będziemy używać, czyli w naszym przypadku do domyślnie zaznaczonych dodajemy tylko BME280 i I2C. Na koniec klikamy na dole „Start Build”.
ProTip: obok nazwy biblioteki jest mała niebieska książeczka, po kliknięciu w nią przechodzimy bezpośrednio do rozdziału danego modułu w fenomenalnej dokumentacji NodeMCU. Wszystko jest napisane jasno, przejrzyście i podparte prostymi przykładami.
Po kilku minutach dostaniemy maila, że nasza paczka jest zbudowana i gotowa do pobrania – w dwóch wersjach integer i float – my będziemy potrzebować wersji zmienno-przecinkowej – więc pobieramy plik float.
2. Flashowanie ESP8266
Pobieramy i instalujemy sterowniki dla naszego układu konwertującego USB-UART, nazwę układu możemy odczytać z opisu na spodzie płytki, lub bezpośrednio z wlutowanego układu, zazwyczaj będą to:
- CH340G, lub
- CP2102
Pamiętamy o uruchomieniu komputera po instalacji sterowników!
Podłączamy nasz ESP8266 NodeMcu v3 do portu USB – niebieska dioda powinna dać oznakę życia, a w Menadżerze urządzeń powinniśmy znaleźć naszą płytkę:
Ze strony https://github.com/nodemcu/nodemcu-flasher całą paczkę klikając w .
Po pobraniu rozpakowujemy paczkę i uruchamiamy program:
\nodemcu-flasher-master\Win64\Release\ESP8266Flasher.exe
W opcji ComPort wybieram port który odczytaliśmy w Menadżerze urządzeń, teraz przechodzimy do zakładki Config i wskazujemy pobrane oprogramowanie poprzez kliknięcie w „zębatkę” – offset zostawiamy na wartości 0x0000, a z lewej strony zaznaczamy X:
Wracamy do zakładki „Operation” i klik „Flash” – operacja flashowana została rozpoczęta:
ProTip:domyślnie prędkość przesyłu ustawiona jest na 11520, doświadczalnie sprawdziłem, że można ją podwoić, większość płytek z którymi pracowałem nie miała z tym problemu – zawsze to 50% czasu zaoszczędzane 😀
ESPlorer ESP8266 – LUA
Najwygodniej pracować w programie ESPLorer, którego pobieramy stąd: https://esp8266.ru/esplorer/ i wypakowujemy. Uruchamiamy program „ESPlorer.jar” (oczywiście musimy mieć zainstalowane środowisko JAVA)
W prawej części programu wybieramy numer portu COM naszego układu, prędkość 11520 i wybieramy OPEN.
Program powinien połączyć się z naszą płytką. Gdy natomiast przez długi czas będziemy widzieli komunikat
„PORT OPEN 115200
Communication with MCU..”
i nic się więcej nie będzie działo, wtedy wciskamy przycisk RESET na płytce NODEMCU – teraz powinno być już OK.
Podczas pierwszego podłączenia układu, przez kilka sekund będziemy widzieć formatowanie systemu plików:
Po chwili układ będzie gotowy do pracy:
ProTip: te szlaczki które widać na powyższych dwóch screenach, to informacje od samego układu – możecie je podejrzeć zmieniając prędkość komunikacji z układem na 74880:
Czas na Hello World!
Przechodzimy do lewej części programu i wpisujemy następujący kod:
1 2 |
print('Hello! I am: ') print(node.chipid()) |
klikamy ctrl+s wtedy program poprosi nas o zapisanie pliku, a po kliknięciu save automatycznie uruchomi skrypt na ESP8266. Naszą uwagę powinno przykuć prawe okno gdzie widzimy proces wgrywania skryptu *.lua i co najważniejsze, jego efekt:
1 2 3 |
> dofile("art.lua"); Hello! I am: 7399601 |
Możemy trochę zrefaktorować nasz kod i wywołać funkcję print z dwoma argumentami:
1 |
print('Hello! I am: ' ..node.chipid()) |
i otrzymać:
1 2 |
> dofile("art.lua"); Hello! I am: 7399601 |
Ok, podstawy mamy za sobą, czas połączyć się z czujnikiem.
ESP8266 + BME280 – odczyt wartości
Ok, mamy podłączony BME280, ESP8266 jest widoczny w ESPlorer, czas wreszcie odczytać jaką mamy temperaturę.
1 2 3 4 5 |
scl, sda = 1,2 --SCL podłączony do portu D1, a SDA do D2 i2c.setup(0, sda, scl, i2c.SLOW) --inicjalizacja i2c (id, SDApin, SCLpin, speed) bme280.setup() T = bme280.temp() --odczyt temperatury - wartość zwracana jest pomnożona przez 100 print("temperatura = " ..T/100) |
i efekt:
1 2 |
> dofile("art.lua"); temperatura = 23.56 |
zwróćcie proszę uwagę, ze komentarze w jezyku LUA zaczynają się od „–„.
Jeśli natomiast zobaczyć błąd podobny do tego:
1 |
PANIC: unprotected error in call to Lua API (bme280.lua:4: attempt to perform arithmetic on global 'T' (a nil value)) |
Funkcja bme280.temp() nie wykonała się poprawnie i zwrócono ‚nil’ – wszystko wskazuje na to, że albo czujnik jest uszkodzony, albo źle podłączony!
Rozszerzmy nasz skrypt o odczyt pozostałych wartości:
1 2 3 4 5 6 7 8 9 |
scl, sda = 1,2 --SCL podłączony do portu D1, a SDA do D2 i2c.setup(0, sda, scl, i2c.SLOW) --inicjalizacja i2c (id, SDApin, SCLpin, speed) bme280.setup() T = bme280.temp() --odczyt temperatury - wartość zwracana jest pomnożona przez 100 P = bme280.baro() --odczyt cisnienia - wartość jest pomnozona przez 1000 H = bme280.humi() --odczyt wilgotności - wartość jest pomnozona przez 1000 print("temperatura = " ..T/100) print("cisnienie = " ..P/1000) print("wilgotnosc = " ..H/1000) |
1 2 3 4 |
> dofile("art.lua"); temperatura = 24.31 cisnienie = 1002.964 wilgotnosc = 48.863 |
Powyższy kod możemy lekko usprawnić i skrócić:
1 2 3 4 5 6 7 |
scl, sda = 1,2 --SCL podłączony do portu D1, a SDA do D2 i2c.setup(0, sda, scl, i2c.SLOW) --inicjalizacja i2c (id, SDApin, SCLpin, speed) bme280.setup() T, P, H, QNH = bme280.read(alt) print("temperatura = " ..T/100) print("cisnienie = " ..P/1000) print("wilgotnosc = " ..H/1000) |
1 2 3 4 |
> dofile("artyk.lua"); temperatura = 23.94 cisnienie = 1003.066 wilgotnosc = 49.596 |
Ok, odczyt sensora mamy za sobą, w następnym wpisie spróbujemy połączyć się z siecią Wi-Fi!
pozdro,
mVn