Elektroda.pl
Elektroda.pl
X
Elektroda.pl
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bardzo prosta stacja pogodowa oparta o ESP32 i BME280

crbjsfso 29 Cze 2019 17:59 2370 14
  • #1
    crbjsfso
    Poziom 4  
    1. Wstęp

    Projekt bardzo prostej stacji pogodowej opartej o ESP32 DevKit V1 i sensor BME280. Odczyt wartości jest dostępny poprzez interfejs sieciowy w sieci lokalnej, do której jest podłączona. Całość jest zasilana za pomocą zasilacza impulsowego 5V ze względu na powszechność i łatwą dostępność tego typu urządzeń.

    2. ESP32

    Moduł ESP32 DevKit V1 jest platformą programistyczną opartą o ESP-WROOM-32 będącą następcą niesłychanie popularnej serii układów z rodziny ESP8266. Oferuje on obsługę protokołów komunikacyjnych takich jak Wi-Fi, Bluetooth, czy Ethernet. Stosunkowo mocny jak na budżetowe mikrokontrolery dwurdzeniowy procesor, całkiem spora ilość pamięci operacyjnej i duża energooszczędność jednoznacznie przemawiają na korzyść tej platformy. Wszystko to w stosunkowo niskiej cenie i możliwością programowania z poziomu Arduino IDE.

    Specyfikacja
    Procesor i pamięćDwurdzeniowy 32-bitowy procesor Xtensa LX6
    Taktowanie do 240MHz
    448kB pamięci ROM
    520kB pamięci SRAM
    16kB pamięci SRAM w zegarze czasu rzeczywistego (RTC)
    4MB pamięci flash podpiętej po SPI
    Sprzętowa akceleracja szyfrowania (AES, SHA2, ECC, RSA-4096)
    Komunikacja bezprzewodowaObsługa WiFi - 802.11 b/g/n/e/I
    W trybie 802.11 n (2.4 GHz) prędkość do 150 Mbps
    Szyfrowanie: WPA/WPA2/WAPI (WEP/TKIP/AES)
    Obsługa Bluetooth ( Bluetooth v4.2 BR/EDR & BLE)
    Zasilanie i pobór prąduZasilanie od 2.2 do 3.6V (optymalne 3.0 do 3.3V)
    Pobór prądu podczas pracy (typowy): 90mA
    Pobór prądu w trybie deep sleep - 2.5 uA
    Temperatury pracy: -40C - 125C
    Interfejsy i obsługiwane protokołyWbudowany czujnik Halla
    Obsługa dotyku
    32 piny GPIO (PWM)
    3 x UART
    3 x SPI
    2 x I2C (I2S)
    IR
    CAN
    12 kanałowy ADC
    2 kanałowy DAC
    interfejs kart SD

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    2.1. Moduł ESP32 DevKit V1 od forntu

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    2.2. Moduł ESP32 DevKit V1 od tyłu

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    2.3. Wyprowadzenia modułu ESP32 DevKit V1 w wersji 30 pinowej

    3. BME280

    Układ scalony BME280 to produkt firmy Bosch Sensortec i jest on czujnikiem warunków atmosferycznych takich jak ciśnienie, wilgotność i temperatura. To niezwykle kompaktowym elementem i występuje w ekranowanej obudowie SMD o wymiarach 2,5 x 2,5 mm. Sensor ten cechuje się bardzo małym poborem prądu oscylującym w okolicach średniej rzędu 3,6uA i wyposażony jest magistralę komunikacyjną I2C/SPI.

    Specyfikacja
    Napięcie zasilania3.3 V
    Interfejs układuI2C, SPI
    Średnie zużycie energii dla pomiarów co 1s1.8 uA (wilgotność, temperatura)
    2.8 uA (ciśnienie, temperatura)
    3.6 uA (wilgotność, ciśnienie, temperatura)
    Średnie zużycie energii w trybie uśpienia0.1 uA
    TemperaturaZakres pomiarowy: od -40 do 85 °C
    Dokładność: ± 1 °C
    WilgotnośćZakres pomiarowy: od 10 do 80 % RH
    Dokładność: ± 3 %RH*
    CiśnienieZakres pomiarowy: od 300 do 1100 hPa
    Dokładność: ± 1 hPa

    *RH - Wilgotność względna wyrażana w procentach. Jest to stosunek rzeczywistej wilgoci w powietrzu do maksymalnej jej ilości, którą może utrzymać powietrze w danej temperaturze.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    3.1. BME280 od frontu

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    3.2. BME280 od tyłu

    4. Projekt i narzędzia

    Z racji niewielkiej ilości połączeń, a dokładnie czterech, całość została złożona na uniwersalnej płytce drukowanej PCB. Można również przylutować BME280 do ESP32 bezpośrednio przy pomocy przewodów, bez konieczności stosowania PCB. Do komunikacji między podzespołami został wykorzystany protokół I2C, a do zaprogramowania układu ESP32 posłużyło Arduino IDE.

    Do wykonania projektu będzie nam potrzebne:
    - ESP32 DevKit V1 lub klon/odpowiednik;
    - BME280 w wersji 3.3V;
    - Arduino IDE;
    - przewody, na przykład do płytek stykowych lub ze skrętki: 4 sztuki po około 5 cm;
    - lutownica / stacja lutownicza i stop lutowniczy;
    - cążki do cięcia metalu;
    - kabel USB - micro USB;
    - zasilacz/ładowarka impulsowa 5V z wyjściem USB do zasilania stacji;
    - opcjonalnie uniwersalna płytka drukowana PCB o wymiarach przynajmniej 4 x 3,5 cm;
    - opcjonalnie co najmniej 4 gniazda goldpin do wlutowania w PCB, tak aby można było wypiąć dowolny z elementów w każdej chwili;

    5. Schemat połączeń

    Połączenie obu komponentów jest stosunkowo proste, ponieważ należy połączyć dwa przewody do komunikacji poprzez I2C i dwa do zasilania.

    Zgodnie z opisem wyprowadzeń na rysunku 2.3. do I2C przypisane są piny 21 dla SDA (można czasami spotkać się z opisem SDI) i 22 dla SCL (można czasami spotkać się z opisem SCK).

    Rożne wersji modułów opartych na ESP32 mogą różnić się wyprowadzeniami, więc w przypadku zastosowania innego modelu należy upewnić się czy I2C zostało wyprowadzone na 21 i 22 pin.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    5.1. Schemat połączeń ESP32 z BME280

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    5.2. Zmontowany układ na uniwersalnej płytce PCB od frontu

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    5.3. Zmontowany układ na uniwersalnej płytce PCB od strony wykonanych połączeń

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    5.4. Widok układu podczas pracy z podłączonym zasilaniem

    6. Arduino IDE

    Gdy już wszystkie połączenia elektryczne są gotowe, należy przygotować środowisko programistyczne poprzez zainstalowanie odpowiednich bibliotek do Arduino IDE, które umożliwią obsługę obu układów.

    Spora część z was zapewne ma już zainstalowane Arduino IDE, lecz jeśli nie to należy pamiętać, aby pobierać je zawsze z oficjalnej strony dystrybutora. Zminimalizuje to możliwość pobrania przy okazji złośliwego oprogramowania. Oficjalny dystrybutor to:

    Code:
    arduino.cc/en/Main/Software

    Po pobraniu, zainstalowaniu czy też ewentualnej aktualizacji oprogramowania należy z górnego menu wybrać: Plik > Preferencja.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.1. Interfejs Arduino IDE, opcje Plik > Preferencja

    Pojawi się nowe okno z opcjami. W polu „Dodatkowe adresy URL do menedżera płytek:” należy wkleić adres:

    Code:
    https://dl.espressif.com/dl/package_esp32_index.json

    I zatwierdzić klawiszem [OK]. W przypadku, gdy mamy już wpisany jakiś adres, to dodajemy następny po przecinku.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.2. Okno Preferencje z opcjami

    Następnie z menu wybieramy: Narzędzia > Płytka: … > Menedżer płytek…

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.3. Interfejs Arduino IDE, opcje Narzędzia > Płytka: … > Menedżer płytek…

    Pojawi się nowe okno. W polu wyszukiwarki należy wpisać „Adafruit BME280” i zatwierdzić ENTERem. Pojawi się biblioteka, którą należy zainstalować klikając na przycisk [Instaluj].

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.4. Menedżer płytek – zainstalowana biblioteka Adafruit BME280

    Pora na drugą bibliotekę. W polu wyszukiwarki należy wpisać „Adafruit Unified Sensor” i zatwierdzić ENTERem. Pojawi się biblioteka, którą należy zainstalować klikając na przycisk [Instaluj] Po udanej instalacji zamykamy to okno i resetujemy Arduino IDE.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.5. Menedżer płytek – zainstalowana biblioteka Adafruit Unified Sensor

    Po ponownym uruchomieniu Arduino IDE w menu: Narzędzia > Płytka: … powinny być widoczne układy z serii ESP32.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    6.6. Biblioteka układów ESP32

    7. Programowanie

    Gdy już wszystko zostało zrobione, możemy przystąpić do programowania układu. Podłączamy moduł kablem USB do komputera, wybieramy z biblioteki odpowiednią płytkę, w tym przypadku jest to „ESP32 Dev Module” i odpowiedni Port.

    Tworzymy nowy projekt i kopiujemy poniższy kod.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Teraz należy wpisać nazwę i hasło do sieci, z którą ma się połączyć nasza stacja pogodowa. Nazwę sieci należy wpisać w miejscu oznaczonym jako: <tutaj-wpisz-nazwe-swojej-sieci>, a hasło w miejscu oznaczonym jako: <tutaj-wpisz-haslo-swojej-sieci>. Nazwa, jak i hasło muszą być wpisane w cudzysłowach, jak na poniższym przykładzie.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    7.1. Przykładowa nazwa i hasło do sieci z którą będzie łączyć się stacja

    Po wprowadzeniu prawidłowych danych przesyłamy gotowy kod do układu.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    7.2. Programowanie układu zakończone sukcesem

    Po zaprogramowaniu układu włączamy monitor portu szeregowego (Narzędzia > Monitor portu szeregowego) i ustawiamy prędkość przesyłu danych na 115200. Następnie z dolnego urządzenia podłączonego do sieci lokalnej wchodzimy na stronę internetową znajdującą się pod adresem 192.168.0.150, czyli adresem naszej stacji i naszym oczom powinna ukazać się komunikat o wykonanym połączeniu z klientem.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    7.3. Komunikat z monitora portu szeregowego o wykonanym połączeniu z klientem.

    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
    7.4. Widok interfejsu sieciowego stacji pogodowej

    Gdy wszystko działa jak należy można odpiąć urządzenie od komputera i przypiąć w miejscu gdzie chcemy monitorować warunki klimatyczne. Podpinamy przy użyciu zasilacza/ładowarki USB z zasilaniem 5V, a dokonujemy odczytu przez interfejs sieciowy pod adresem 192.168.0.150.

    Adres pod którym dostępny jest interfejs naszej stacji możemy zmienić modyfikując wartości w 52 linii kodu.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • PCBway
  • #2
    TvWidget
    Poziom 33  
    Czy projekt zawiera coś co choć w minimalnym stopniu jest innowacyjne ?
  • PCBway
  • #4
    crbjsfso
    Poziom 4  
    TvWidget napisał:
    Czy projekt zawiera coś co choć w minimalnym stopniu jest innowacyjne ?

    Nie. To dział dla początkujących, a nie "nowości i innowacje", ale mogę się mylić bo jestem nowy, więc w razie czego proszę mnie poprawić.

    Slawek K. napisał:
    Do odczytu temperatury trzeba aż esp32 ?

    Nie, nie trzeba, ale można co zostało zaprezentowane powyżej.
  • #5
    pier
    Poziom 23  
    Nie wiem po co komu aż dwa miejsca po przecinku dokładności, szczególnie wilgotności. Mogłeś się chociaż pokusić o formatowanie wyników pomiarów.
  • #6
    crbjsfso
    Poziom 4  
    pier napisał:
    Nie wiem po co komu aż dwa miejsca po przecinku dokładności, szczególnie wilgotności. Mogłeś się chociaż pokusić o formatowanie wyników pomiarów.


    Osobiście wole dokładność do dwóch miejsc po przecinku, lecz jeśli ktoś woli precyzję do całości to załączam poniżej zmodyfikowany kod.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wygląd interfejsu sieciowego dla powyższego kodu:
    Bardzo prosta stacja pogodowa oparta o ESP32 i BME280
  • #7
    rafels
    Poziom 23  
    Jak na "DIY Początkujący" projekt fajny i schludnie opisany. Na pewno przyniósł dużo frajdy przy realizacji :)
  • #8
    pitsa
    Poziom 11  
    Taki projekt warto spróbować rozwijać o kolejne drobiazgi.
    Możesz na przykład dołożyć do tego kilka DS18B20 w tym jeden w obudowie wodoodpornej i mierzyć temperaturę na zewnątrz.
    Ciekawe byłoby wyliczanie temperatur skrajnych w ostatnich 24h... tygodniu, "gradientów" to znaczy pokazywanie czy temperatura wzrasta czy opada.
    Zrobienie wykresów byłoby pewnie trudne ale trochę własnej statystyki z serii danych byłoby ciekawe i przydatne w poznawaniu możliwości programowania.

    A gdyby jeszcze dało się dołożyć do programu gotową bibliotekę klienta NTP (aby znać godzinę gdy wystąpią maksima temperatur z czujników), to dałoby się wykrywać czujnikiem temperatury ciekawe zdarzenia. Przykładowo czujnik temperatury w lodówce mógłby podawać kiedy ktoś ostatnio do niej zaglądał. ;-)
  • #9
    rb401
    Poziom 34  
    crbjsfso napisał:
    Osobiście wole dokładność do dwóch miejsc po przecinku


    Ja też podzielam Twoje zdanie, bo tu nie tyle chodzi o dokładność samego pomiaru (bo i tak dokładność czujnika bez kalibracji jest gorsza) ale o to że te dodatkowe ułamkowe pozycje dają możliwość szybkiej oceny trendu temperatury. Jeśli czujnik daje taką rozdzielczość to szkoda ją marnować.
    Ale w tej kwestii, to moim zdaniem przydało by się w kodzie html stronki wymuszenie cyklicznego odświeżenia (np. <meta http-equiv="refresh" content="5">).
  • #10
    TvWidget
    Poziom 33  
    rb401 napisał:
    OJa też podzielam Twoje zdanie, bo tu nie tyle chodzi o dokładność samego pomiaru (bo i tak dokładność czujnika bez kalibracji jest gorsza) ale o to że te dodatkowe ułamkowe pozycje dają możliwość szybkiej oceny trendu temperatury. Jeśli czujnik daje taką rozdzielczość to szkoda ją marnować.

    Moduł ESP zapewne się mocno grzeje. Do tego dochodzi moc wydzielana w stabilizatorze liniowym. Czujnik jest umieszczony tuż obok niego. Moim zdaniem wartość jaką zwraca jest dość daleka od rzeczywistej temperatury powietrza
  • #11
    crbjsfso
    Poziom 4  
    TvWidget napisał:
    Moduł ESP zapewne się mocno grzeje. Do tego dochodzi moc wydzielana w stabilizatorze liniowym. Czujnik jest umieszczony tuż obok niego. Moim zdaniem wartość jaką zwraca jest dość daleka od rzeczywistej temperatury powietrza


    Zgadza się i testy to potwierdzają, rozwiązaniem tego problemu jest rezygnacja z PCB i umieszczenie czujnika na przewodach lub kompensacja w kodzie:
    Code:
    client.println(bme.readTemperature() - 4);
    Albo modyfikacja kodu i dodanie uśpienia, czy głębokiego uśpienie, lecz jeszcze tego nie testowałem.
  • #12
    TvWidget
    Poziom 33  
    Programowo nie da się już nic skompensować. Jeśli uśpisz ESP nie będziesz mógł pobrać z niego strony z wynikam pomiarów. Potrzebny będzie zewnętrzny serwer. do ich przechowywania.
    Jednym z rozwiązań problemu jaki zaobserwowałeś jest podzielnie urządzenia na dwie części. Czyli bateryjny bezprzewodowy czujnik wysyłający pomiary przez Bluetooth Low Energy oraz ESP32, który odbiera te dane i je prezentuj w formie strony WWW, wykresu itp.
    Taki podział na bateryjny czujnik i całą resztę stosowany jest powszechnie w stacjach pogodowych.

    Jeśli chce się uzyskać dokładne pomiary trzeba zadbać też aby prąd pobierany przez sam sensor nie ogrzewał go. Nie wiem jednak jak na to zjawisko jest wrażliwy BME280.
  • #13
    fotomh-s
    Poziom 20  
    3.6uA nie wydaje się być na tyle dużą wartością aby w zauważalny sposób zafałszować wyniki. Do tego zawsze można zmniejszyć częstotliwość pomiarów (w praktyce raczej nie ma konieczności mierzenia temperatury co 1s). ESP oczywiście grzeje się znacznie bardziej niż sam czujnik i trzeba go fizycznie od czujnika odsunąć (zastosować kable). Generalnie to same czujniki z założenia nie mogą się zbytnio nagrzewać od przepływającego przez nie prądu bo by to nie miało w ogóle sensu (nikt by takich układów nie stosował).
  • #14
    koala106
    Poziom 39  
  • #15
    krru
    Poziom 32  
    rb401 napisał:
    crbjsfso napisał:
    Osobiście wole dokładność do dwóch miejsc po przecinku


    Ja też podzielam Twoje zdanie, bo tu nie tyle chodzi o dokładność samego pomiaru (bo i tak dokładność czujnika bez kalibracji jest gorsza) ale o to że te dodatkowe ułamkowe pozycje dają możliwość szybkiej oceny trendu temperatury. Jeśli czujnik daje taką rozdzielczość to szkoda ją marnować.
    Ale w tej kwestii, to moim zdaniem przydało by się w kodzie html stronki wymuszenie cyklicznego odświeżenia (np. <meta http-equiv="refresh" content="5">).



    Tylko że nota katalogowa BME280 podaje dokładność pomiaru wilgotności ±3 %. Wyświetlanie jakiś ułamków w ogóle nie ma sensu. Ponieważ w tym czujniku odczytywane wartości trzeba jeszcze sporo poprzeliczać, stąd niektórzy bez sensu wyświetlają ile dusza zapragnie.
    Do oceny trendu, moja stacja (na bme280 i malince) wyświetla wielkości max i min wraz z czasem, gdy te wartości zostały zaobserwowane.

    Dodano po 6 [minuty]:

    koala106 napisał:
    BME 280 średnio się nadaje do temperatur - ciśnienie mierzy ok, ale temperatury przekłamuje.


    Temperaturę powietrza w ogóle cieżko jest zmierzyć zgodnie z normami meteorologów, a wynik bardzo zależy od okoliczności (usytuowanie czujnika, obudowa itp). Natomiast ciśnienie jest dość odporne na warunki pomiaru.