Fyzikální kabinet FyzKAB
Články Moduly ESP32 a ESP32-CAM ESP32 – čidla a periférie Jak propojit ESP32 s BMP180 senzorem

Jak propojit ESP32 s BMP180 senzorem

V tomto článku se naučíme, jak propojit teplotní a tlakové čidlo BMP180 s vývojovou deskou ESP32 DevKit. Pokud chcete vytvořit jednoduchý systém monitorování tlaku a teploty pomocí vývojové desky s modulem ESP32, pak je BMP180 asi tou nejlevnějších možností (i když rozhodně existují lepší senzory, například BME280). Ukážeme si, jak připojit čidlo BMP180 k modulu ESP32, jak přidat do Arduino IDE potřebnou ovládací knihovnu a na závěr i jak lze načítat údaje o atmosférickém tlaku, teplotě, tlaku na hladině moře a nadmořské výšce.

Původně měl být tento článek „oddychovou“ záležitostí po článku pojednávajícím o připojení LCD přes sběrnici I2C k modulu ESP32, kde jsme narazili na problém s chybnými zapojeními, která jsou prezentována na internetu. Bohužel se ukázalo, že i v případě čidla BMP180 to nebude takové procházka růžovým sadem, jak se nám zprvu zdálo. 😉

Senzor BMP180

BMP180 je digitální barometrický snímač tlaku od společnosti Bosch. Jedná se o zařízení s velmi nízkým příkonem založené na piezo odporovém čidle MEMS. Dokáže měřit atmosférický tlak v rozmezí 300 hPa až 1100 hPa. Kromě měření tlaku může senzor BMP180 také měřit teplotu v rozsahu –40 °C až +85 °C. Protože BMP180 měří atmosférický tlak, lze jej použít i pro odečítání nadmořské výšky (protože údaje tlaku a nadmořské výšky spolu souvisí). Snímač BMP180 komunikuje s mikrokontrolérem prostřednictvím sběrnice I2C. (Tu jsme si podrobněji popsali v jednom z dřívějších článků)

BMP180 4piny   BMP180 5pinu
Obrázek 1 – dvě základní verze tlakového a teplotního čidla BMP180 (4pinová a 5pinová verze)

Všechny barometrické čipy Bosch BMP180 jsou z výroby kalibrovány, takže jsou připraveny k použití. Senzor BMP180 je použit v mnoha modulech různých výrobců, takže můžeme narazit na některé trochu odlišné moduly. Většina z nich se však odvíjí od dvou základních typů, které tu popíšeme.

Připojení BMP180 k ESP32

Jak bylo zmíněno, snímač BMP180 používá ke komunikaci s mikrokontrolérem sběrnici I2C – adresa čidla BMP180 je 0x77, na desce čidla ji nelze přenastavit (napevno je i nastavena v ovládací knihovně). Pokud si pamatujeme pinout modulu ESP32, výchozími piny pro I2C jsou GPIO 21 (SDA) a GPIO 22 (SCL), takže je pro připojení využijeme. Zde asi není co řešit.

Problém u destiček s čipem BMP180 nastává v případě napájení – nejde však o samotné napájení, jako o informace, které se o čidlech s BMP180 uvádějí. Téměř všude je uvedeno, že modul BMP180 pracuje mezi napětími 1,8–3,6 V a že jej nelze použít na napětí 5 V. Maximální napětí 3,6 V je nejen opakováno u většiny návodů na zapojení čidla, ale je uváděno i u prodejců těchto čidel. Bohužel, to je omyl, který vznikl z toho, že tyto údaje platí pro samotný čip Bosch BMP180, ale nikoliv pro celou desku čidla teploty a tlaku! Co nás vede k tomuto závěru? Je to fakt, že deska čidla je oproti „holému“ čipu navíc osazena napěťovým regulátorem. Bohužel tento napěťový omyl se stále kopíruje a tak se dalšími články šíří mezi další „bastlíře“, kteří pak díky tomu modul čidla zapojují na napětí 3,3 V, což (i přes funkčnost tohoto zapojení) není zcela správně.

Abyste nám toto tvrzení o možnosti vyššího napájecího napětí věřili, pojďme se podívat na fakta, respektive na schéma celého čidla. Nejdříve se podívejme na obrázek č. 1, kde jsou fotografie dvou základních variant čidla s čipem BMP180 – kromě čipu Bosch BMP180 (kovové pouzdro) vidíme na destičce i další součástky. Za naši pozornost stojí ta černá se třemi vývody, na schéma zkusíme tuto součástku identifikovat. Schéma je znázorněno na obrázku č. 2

BMP180 - schema
Obrázek č. 2 – elektronické schéma čidla BMP180

Zmíněná součástka s třemi vývody (jediná se třemi vývody v celém schéma) je napěťový regulátor 662K, který vytváří ze vstupního napětí zapojeného na pin Vcc provozní napětí 3,3 V. Toto napětí je potřeba pro funkci celého čidla. Podle datového listu regulátoru 662K je maximální vstupní napětí tohoto regulátoru 6 V (někdy i uváděno 7 V, ale to je asi už opravdu extrém). Takže, zde vidíme první spor – maximální vstupní napětí na pinu Vcc destičky čidla tedy rozhodně nemůže být avizovaných 3,6 V, ale naopak maximální vstupní napětí regulátoru (6 V). Dále z datového listu plyne, že napětí vstupní regulátoru by mělo být „o něco“ vyšší než napětí výstupní (výstup je v tomto případě 3,3 V), takže i tvrzení o minimálním napětí 1,8 V nemůže být pravda.

Náš závěr je tedy jasný: Destičky osazené regulátorem 662K lze napájet napětím od 3,3 V do 6 V. ALE: Díky zabudovanému regulátoru při vyšším napájení (např. 5 V) stále modul BMP180 vnitřně pracuje na napěťové úrovni 3,3 V a takové jsou i výstupní úrovně signálů SDA a SCL. Tento závěr také vidíme ze schématu, kde jsou linky SCL a SDA pomocí pull-up rezistorů R1 a R2 připojeny k napětí 3,3 V. Budeme si tedy pamatovat, že desku čidla BMP180 lze napájet napětími 3,3 V–6 V, ale vždy pracuje na úrovni 3,3 V. (a to bez ohledu na napájecí napětí)

Víme-li nyní, že tlakové čidlo BMP180 komunikuje na napěťové úrovni 3,3 V, nemusíme při komunikaci mezi tímto senzorem a vývojovou deskou ESP32 řešit problém různých napěťových úrovní (sběrnice I2C bude komunikovat na obou stranách na úrovni 3,3 V). Vývojovou desku ESP32 tedy přímo propojíme piny GPIO 21 a GPIO 22 se senzorem BMP180 podle následujícího diagramu. Moduly s čidlem BMP180 jsou k dispozici ve dvou verzích – ve verzi se 4 piny (piny: VIN, GND, SCL a SDA) a ve verzi s 5 piny (piny: Vcc, GND, SCL, SDA, 3.3V). Na obrázku 3 vidíte propojení desky s ESP32 s oběma variantami čidla BMP180.

ESP32-BMP80 3,3V   ESP32-BMP80 5V.png
Obrázek č. 3 – Propojení vývojové desky ESP32 a čidla BMP180 s 3,3 V a 5 V napájením

Použití pětipinové verze má tu výhodu, že je na ní dostupný pin napájení 3,3 V. To se nám hodí pro použití s modulem ESP32, který s úrovněmi 3,3 V pracuje. Můžeme destičku čidla napájet přímo přes pin 3V3, tím úplně obejdeme napěťový regulátor 622K na destičce čidla (viz obr. 3 – levé zapojení).

V případě čtyřpinové verze není možné napájet čidlo přímo napětím 3,3 V, ale musíme použít pin Vcc (tedy zabudovaný regulátor). V některých návodech se pin Vcc připojuje na napětí 3,3 V, což ale není správné! Tak trochu to znamená, že se vlastně snažíme z napětí 3,3 V regulátorem „vyrábět“ napětí 3,3 V. Díky tomu, že obvod 662K pro svou činnost musí mít vstupní napětí vyšší než výstupní, na výstupu regulátoru bude asi 3,0–3,2 V. To se naštěstí na provozu čidla neprojeví, takže: ANO, ONO TO FUNGUJE, ale korektní zapojení to moc není. Rozhodně je lepší pro provoz regulátoru využít pro napájecí pin Vcc napětí vyšší, například napětí 5 V (které získáme na pinu Vin desky ESP32). A to i přesto, že různé návody v tom případě vyhrožují spálením čidla BMP180! Zkrátka: Je-li na destičce regulátor 662K, je tam právě proto, aby šel senzor napájet napětím 5 V. Budeme-li tedy používat čtyřpinovou verzi čidla, musíme ji napájet prostřednictvím pětivoltového pinu Vin modulu ESP32 (viz obr. 3 – pravé zapojení).

Příprava Arduino IDE (přidání potřebné knihovny)

Jak stáhnout do prostředí Arduino IDE potřebnou knihovnu jsme si již několikrát ukazovali, tak si zde tyto kroky nyní ukážeme jen zrychleně.

V menu prostředí Arduino IDE přejděte do Nástroje -> Spravovat knihovny…

spravovat knihovny

Do vyhledávacího pole manažéru knihoven zadejte: bmp180 a nainstalujte knihovnu Adafruit BMP085 Library od vývojáře Adafruit.

knihovn BMP05

Po správné instalaci nezbytné knihovny se již můžeme vrhnout do tvorby programu.

Načítání teploty a tlaku

Kód (načtení hodnoty tlaku a teploty)

Pro zobrazení výsledku je v tomto kódu použit Serial Monitor (tlak zobrazujeme v hPa, teplotu v °C). Princip kódu je vysvětlen v komentářích programu.

/* nacitani cidla BMP180 */

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;   // vytvoreni objektu BMP pro praci s cidlem

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup(){
  Serial.begin(115200);   // prenosova rychlost serioveho vystupu
  if (!bmp.begin()) {   // inicializace senzoru
    Serial.println("BMP180 sensor nenalezen!!!");   // senzor neni
    while (1) {
      // nekoncici smycka zastavi dalsi vykonavani
    }
  }
}

// funkce LOOP bezi stale dokola.
void loop() {
  Serial.print("Atm. tlak = ");   // vypis hlasky na Serial Monitor
  Serial.print(bmp.readPressure() /100,0);   // nacteni tlaku, prevod na hPa a zaokrouhleni
  Serial.print(" hPa");   // vypis hlasky na Serial Monitor
  Serial.print(", Teplota = ");   // vypis hlasky na Serial Monitor
  Serial.print(bmp.readTemperature(),0);   // nacteni teploty
  Serial.println(" °C");   // vypis symbolu pro stupen
  delay(5000);   // poctak 5s, pak se vse opakuje
}

Následující obrázek ukazuje snímek obrazovky sériového monitoru, který nepřetržitě tiskne hodnoty tlaku a teploty každých 5 sekund.

serial monitor
Obrázek č. 4 – Výstup naměřených hodnot teploty a tlaku na Serial Monitoru

Zobrazení údajů tlaku a teploty ze senzoru BMP180 na sériovém monitoru je užitečné jako ukázka funkčnosti senzoru BMP180 nebo pro testování samotného kódu. Chceme-li vytvořit praktickou aplikaci, musíte k zobrazení naměřených hodnot tlaku a teploty použít nějaký zobrazovací modul – například displej. O připojení LCD displeje k modulu ESP32 jsme se zde již zmiňovali.

Tlak na hladině moře a určení nadmořské výšky:

Knihovna Adafruit-BMP085-Library umožňuje převod naměřeného atmosférického tlaku na atmosférický tlak na hladině moře. Na to je však potřeba znát nadmořskou výšku místa, kde byl atmosférický tlak naměřen. K tomuto výpočtu má objekt BMP metodu readSealevelPressure(altitude_meters) jejímž parametrem je nadmořská výška čidla.

Pokud bychom chtěli předchozí kód rozšířit i o výpis atmosférického tlaku na hladině moře (nadm. výška čidla je 410 m n. m.), přidáme do procedury Loop následující řádky:

Serial.print("Atm. tlak na hl. more = ");   // vypis hlasky na Serial Monitor
Serial.print(bmp.readSealevelPressure(410) /100,0);   // vypis tlaku na hl. more (hPa, zaokr.)
Serial.print(" hPa");   // vypis hlasky na Serial Monitor

Další funkcí je naopak určení nadmořské výšky z aktuální hodnoty atmosférického tlaku. Pro tento výpočet potřebuje funkce znát hodnotu tlaku na úrovni hladiny moře (v místě Vaší polohy). Pro toto určení nadmořské výšky se v knihovně Adafruit-BMP085-Library používá funkce readAltitude(sealevelPressure), kde vstupní parametr sealevelPressure je hodnota atmosférického tlaku na hladině moře (pokud to není zadáno, je tato hodnota 101325). „Obecná“ hodnota 1013,25 hPa však není ideální, jde o průměrnou hodnotu atmosférického tlaku, která se bude v jednotlivých dnech lišit. Přesnou hodnotu aktuálního atmosférického tlaku přepočteného na hladinu moře obvykle zjistíme buď na webových stránkách o počasí, nebo v informačních centrech kteréhokoliv většího letiště.

Předchozí kód by se pro výpis nadmořské výšky upravil následujícím způsobem (opět přidáme do procedury Loop):

Serial.print("Nadm. vyska = ");   // vypis hlasky na Serial Monitor
Serial.print(bmp.readAltitude(101325);   // vypis nadm. vysky z akt. tlaku a 101325 Pa
Serial.print(" m n. m.");   // vypis hlasky na Serial Monitor

Je třeba si ale uvědomit, že můžeme používat buď určení atmosférického tlaku na hladině moře, nebo aktuální nadmořskou výšku. Je to dáno nejen z principu funkcí, ale především ze samotného fyzikálního principu – buď známe nadmořskou výšku a určujeme tlak na hladině moře, nebo naopak. Vždy jeden z těchto údajů musí být znám (zadán napevno) a druhý se dopočítává.

Závěr

Uvedli jsme si zde několik základních informací o senzoru BMP180. Na schématu čidla jsme si též ukázali, že informace kolující kolem napájení destiček čidla, které jsou osazeny regulátorem, jsou zcela mylné. Ukázali jsme si i jednoduchý příklad, ve kterém modul ESP32 slouží jako čidlo pro načítání atmosférického tlaku a teploty. Určitě zajímavou výzvou je rozšíření této aplikace o vylepšení zobrazení získaných dat. Jednou možností může být výstup na displej, nebo například odesílání naměřených dat přes Wi-Fi – i to modul ESP32 lehce zvládne.

Vytvoření bezdrátového Wi-Fi čidla bychom se rádi věnovali v některém z další článků.

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!