blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
2
SLEDOVAŤ BLOG
Programátor
deadawp



Senzor Bosch BME280 v prostredí ESP-IDF
pridal deadawp 8.7. 2021 o 0:18 (naposledy upravené 8.7. 2021 o 13:40)



Niektoré texty a pasáže použité z mojej diplomovej práce: 
Bezpečná aktualizácia firmvéru v senzorovej sieti na báze ESP32 (Košice, 2021)

Pri realizácii diplomovej práce som pracoval s mikrokontrolérom ESP32 v prostredí ESP-IDF vo verzii 4.2. Pre demonštračnú aplikáciu senzorového uzla bolo potrebné použiť senzor schopný zaznamenávať teplotu vzduchu a aspoň jednu - inú veličinu, ktoré boli vo výsledku prenášané na vzdialené webové rozhranie, ktoré umožňovalo ich vizualizáciu v čase používateľovi.

Voľba padla na senzor Bosch BME280, ktorý bol poruke a umožňoval záznam trojkombinácie - teplota, tlak (absolútny pre aktuálnu nadmorskú výšku), vlhkosť vzduchu. Senzor komunikuje s mikrokontrolérom po I2C zbernici. Využil som verziu senzora Bosch BME280 s operačnou logikou 3,3V pre plnú kompatibilitu s operačnou logikou mikrokontroléra ESP32 bez nutnosti používať napäťový delič, ako v prípade BME280 s 5V operačnou logikou, pre ktorú vývody ESP32 nie sú podľa dokumentácie tolerantné. Pre ovládanie a komunikáciu ESP32 so senzorom Bosch BME280 som využil implementáciu ovládača (Drivera) v jazyku C od Bosch Sensortec, ktorá vyžadovala niekoľko úprav do špecifík prostredia ESP-IDF, aby sa program skompiloval a bolo ho možné nahrať do ESP32.

Na základe známeho Bosch vzorca z dokumentácie BME a BMP (senzor tlaku a teploty vzduchu) senzorov je možné prepočítať absolútny tlak vzduchu na relatívny (na hladinu mora), pričom musíme do vzorca dosadiť aktuálnu nadmorskú výšku, prípadne ju môžeme vypočítať odhadom s priemernou hodnotou tlaku vzduchu na hladine mora (t.j. 1013,25 hPa), prípadne pre presnejší odhad nadmorskej výšky použijeme absolútny tlak vzduchu lokálnej meteorologickej stanice.

V mojom prípade bola odhadnutá nadmorská výška oproti skutočnej (Šuňava, okres Poprad – 854 m.n.m) nižšia o približne 20 metrov, keďže som senzor prevádzkoval v interiéri z dôvodu logiky webovej aplikácie pre riadenie výstupu na základe interiérovej teploty na spôsob izbového termostatu. Nevyužil som kompenzovaný – referenčný tlak vzduchu z lokálnej meteostanice s certifikovanými meracími prístrojmi pre aktuálnu nadmorskú výšku, ale využil som „strednú“ hodnotu 1013,25 hPa, čo je atmosférický tlak na hladine mora.

Fragment zdrojového kódu v jazyku C – vzorec pre prepočet absolútneho tlaku vzduchu na relatívny:
altitude = 44330 * (1.0 - pow(bme280_compensate_pressure_double(v_uncomp_pressure_s32)/100 / 1013.25, 0.1903));

Fragment zdrojového kódu v jazyku C – vzorec pre prepočet absolútneho tlaku vzduchu na relatívny:
pressure_sea = (bme280_compensate_pressure_double(v_uncomp_pressure_s32)/100) / pow(1 - ((0.0065 * altitude) / (bme280_compensate_temperature_double(v_uncomp_temperature_s32) + (0.0065 * altitude) + 273.15)), 5.257);

Vzorec pre prepočet absolútneho tlaku vzduchu na relatívny využíva aj teplotu vzduchu. Keďže bol senzor prevádzkovaný v interiéri, teplota bola voči vonkajšej vyššia aj o niekoľko desiatok stupňov vzhľadom na zimné a jarné mesiace, čo do prepočtu vnieslo istú nepresnosť, rádovo ± 1 hPa. V programovej implementácii ovládača od Bosch Sensortec bolo potrebné vykonať úpravu existujúcej programovej implementácie pre platformu ESP32 vo frameworku ESP-IDF.

Samotný ovládač od Bosch Sensortec obsahuje inicializáciu komunikácie medzi mikrokontrolérom ESP32 a senzorom Bosch BME280 na I2C zbernici, umožňuje nastaviť dátové GPIO vývody pre signály SCL (Synchronizačné hodiny – hodinový signál) a SDA (Synchronizované dáta), ktoré komunikácia vyžaduje, definuje rýchlosť zbernice – hodinový signál v Hz.

Ovládač od Bosch Sensortec implementuje dva prevádzkové režimy senzora Bosch BME280, ktoré je možné použiť v programovej implementácii:

  • normálny,
  • vynútený (nazýva sa aj FORCED).

Normálny prevádzkový režim umožňuje využiť vyššie vzorkovanie nameraných údajov pre dosiahnutie presných meraní spoločne s nastavením koeficienta IIR (filter s nekonečnou impulznou odozvou) filtra, ktorý kompenzuje krátkodobé výkyvy tlaku vzduchu a teploty. Vzorkovanie je možné nastaviť v rozsahu 1 až 16-krát. Koeficient IIR filtra je možné nastaviť v rozsahu 0 až 16. Medzi jednotlivými vzorkami je možné nastavovať pauzu – tzv. StandBy čas, ktorý definuje pauzu medzi meraniami.

Hodnota sa nastavuje makrami, ktoré sú preddefinované v ovládači v rozsahu 1 až 4000 ms (možno nastaviť aj hodnoty 63, 125, 250, 500, 1000, 2000). Energeticky úspornejší je prevádzkový režim FORCED (tzv. vynútený). Nevyužíva koeficient pre IIR filter, nekompenzuje žiadnym spôsobom krátkodobé výkyvy tlaku a teploty vzduchu. Využíva vzorkovanie 1 krát pre každú meranú hodnotu, teda prvá nameraná hodnota je výsledkom danej meteorologickej veličiny.

Pri výpise a porovnaní oboch režimov je normálny prevádzkový mód stabilný a ponúka konzistentné merania pri kontrole výpisu na tri desatinné miesta (na tisíciny). Screenshot UART monitora nižšie poukazuje na konzistentnosť nameraných dát v režime NORMAL s frekvenciou záznamov každých 25 ms, teda 40 záznamov za sekundu. Teplota využíva 16-násobné vzorkovanie, tlak vzduchu (absolútny) a vlhkosť vzduchu 2-násobné vzorkovanie.

FORCED režim nebol tak stabilný a neponúkal konzistentné merania, ako je možné vidieť na obrázku nižšie - screenshot UART monitora. Namerané údaje sa v čase menili skokovito pri každom meracom cykle nad i pod strednú hodnotu (známu z merania normálnym prevádzkovým módom). Ku skokovitému priebehu nameraných veličín prispel aj fakt, že v tomto režime nie sú krátkodobé výkyvy kompenzované IIR filtrom a taktiež sa nevykonáva viacero priemerovaných meraní.

Do zdrojového kódu finálnej aplikácie senzorového uzla boli doplnené direktívny pre podmienené kompilovanie programu na základe nastavených makier. Na základe operačného režimu BME280 sa zvolí task (úloha), ktorá sa priradí jadru procesora Xtensa. Úloha obsahuje komunikáciu v danom režime + samotnú inicializáciu. Makrá sú definované cez mnou vytvorené menu v súbore Kconfig.projbuild. Makrá môžu nadobúdať dátové typy (int, string, bool). Menu je možné konfigurovať cez Menuconfig z konzolovej aplikácie prostredia ESP-IDF.

Nastavené makrá sú uložené (pri zmene prepísané) v súbore sdkconfig. K súboru dokáže pristúpiť aj hlavný program, kde je možné makrá pre podmienú kompiláciu použiť, vyžaduje sa však definovanie makra COMBINED_INIT_CODE, aby aplikácia mohla k makrám pristúpiť. V mojom prípade som definoval makro CONFIG_BME280_OPMODE a mohol som podmiene zvoliť kompiláciu programu na základe operačného režimu.

Hodnota 0x01 (hexadecimálna) je pre FORCED operačný režim, alebo 0x03 pre NORMAL operačný režim. Režim spánku je definovaný hodnotou 0x02, nakoľko som však tento režim nevyužil, nebol použitý ani pre výber operačného režimu, je však v Bosch Driveri dostupný. Cez menu sú konfigurovateľné aj iné makrá, napríklad definovanie vývodov pre I2C zbernicu (SDA, SCL), ktoré sú defaultne nastavené na hardvérové vývody I2C zbernice pre mikrokontróler ESP32. Ďalšími konfigurovateľnými údajmi bola: komunikačná I2C adresa senzora Bosch BME280. 

Na základe logickej úrovne vývodu SD0 je jeho komunikačná adresa 0x76 (PULLDOWN), alebo 0X77 (PULLUP). Konfigurácia je rozdelené do dvoch submenu pod hlavným menu (Example BME280 Configuration). Používateľ konfiguruje I2C Master, t.j. vývody a rýchlosť komunikačnej I2C zbernice zvolením hodinového signálu v Hz (štandardne 100 kHz). Podmenu BME280 Sensor umožňuje nastaviť režim, adresu.

Na Githube je dostupný repozitár s celou programovou implementáciou senzorového uzla na ESP32 v prostredí ESP-IDF v4.2. Implementácia obsahuje naviac aj prenos dát na vzdialené webové rozhranie POST metódou s využitím bezpečného prenosového kanála cez HTTPS protokol. Celkovo je spustených 5 úloh s využitím operačného systému reálneho času FreeRTOS.

Celá programová implementácia využíva aj digitálny podpis pre overenie integrity stiahnutého firmvéru zo vzdialeného webového rozrhrania a taktiež má implementované hardvérové funkcionality Secure Boot V1 a Flash Encryption. Použité asymetrické kľúče pre ECDSA podpisovú schému firmvéru, šifrovací kľúč pre Secure Boot a AES symetrický kľúč pre Flash Encryption sú tiež v repozitári dostupné.

Implementácia: https://github.com/martinius96/ESP-IDF-OTA
Bosch Sensortec Driver: https://github.com/BoschSensortec/BME280_driver
Bosch Sensortec Driver dokumentácia: 
https://downloads.ti.com/simplelink/esd/simplelink_cc13x2_sdk/2.20.00.71/exports/docs/thread/doxyge
Bosch BME280 dokumentácia: 
https://readthedocs.org/projects/bme280/downloads/pdf/latest/



Prístupov 8423
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDUJETE
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Update grafov, ukážkových kódov - Hladin...
[ 16.11.2024] (príspevkov 0)
XIAO ESP32-C6 od Seeed Studio
[ 10.11.2024] (príspevkov 0)
ESP-IDF v4.4.2 prechod na v5.2
[ 5.11.2024] (príspevkov 0)
Krabička pre RFID DOMINATOR 2.0
[ 18.10.2024] (príspevkov 0)
Známe neduhy - Ecotec 1.6E Opel/GM Chevr...
[ 8.10.2024] (príspevkov 0)
Cold-start BQ25570 vs BQ25504 od Texas I...
[ 2.8.2024] (príspevkov 0)
EG21-G - MQTT pripojenie na Thingsboard
[ 5.6.2024] (príspevkov 0)
Quectel EG21-G - HTTP request
[ 17.5.2024] (príspevkov 0)
Tip na darček k jubileu 60
[ 29.4.2024] (príspevkov 0)