Ebben a leírásban azt fogom bemutatni, hogy hogyan építhetsz házi meteorológiai állomást, ami az alkalmazott szenzornak köszönhetően nem csak a pillanatnyi hőmérséklet illetve páratartalom értéket jelzi a számodra, hanem az integrált barometrikus nyomásmérőnek köszönhetően meg is „jósolja”, hogy milyen időre számíthatsz az elkövetkezendő napokban.

BME280, Arduino Uno, LCD

 

Áttekintés

A felhasznált Bosch Sensortec BME280 egy integrált környezeti érzékelő, amelyet a mobil piacra terveztek. A szenzor tervezésénél törekedtek az alacsony energiafogyasztásra, a magas linearitásra és a nagy pontosságra a nyomás, a páratartalom és a hőmérséklet mérésének tekintetében.

A BME280 sokoldalú szenzor a kimeneteken is, hiszen támogatja mind az SPI mind az I2C interfészt, így tetszőleges módon kommunikálhatsz a kiválasztott mikrokontrollerrel. (példánkban egy Arduino Uno-t választottunk)

Az érzékelő kis méretéből adódóan a felhasználás legegyszerűbb módja ha a szenzor un. breakout board-os verzióját használod. A bemutatandó példában az Adafruit cég szenzor paneljét alkalmaztuk és az összekapcsoláshoz az I2C kommunikációt választottuk.

A BME280 érzékelő

Adafruit BME280 panel

 

Mire lesz szükség:

  • Arduino Uno
  • Adafruit BME280 szenzor
  • Breadboard éscsatlakozó vezetékek
  • USB kábel az Arduino Uno programozásához
  • Mintaprogramok
  • BME280 I2C library a szenzor kezeléséhez

A BME280 érzékelő bekötése

Az érzékelőt az SPI vagy az I2C busz segítségével csatlakoztathatod az ArduinoUno-hoz . Az SPI busz négy adatvezetéket és két tápvezetéket, az I2C busz csak két adatvezetéket és két tápvezetéket igényel. Tápfeszültségnek 5V-ot ill. 3,3V-ot használhatsz, a szenzor paneljén elhelyezett feszültség-szabályozó beállítja a megfelelő feszültség értéket.

Az Adafruit BME280 érzékelő bekötése
(I2C busz és alapértelmezett cím (0x77))

Ha az I2C buszt használod a kommunikációhoz, az érzékelő két címet kaphat. Az alapértelmezett érték 0x77. A címet az SDO csatlakozóra kapcsolt feszültség határozza meg. Az Adafruit panelon található felhúzó ellenállás az SDO láb logikai szintjét magasra húzza, ezzel a címet az 0x77-re állítja. Ez a panel alapértelmezett címe. A másik lehetőség, ha az SDO-t a földpotenciálra (GND) kötöd, ekkor a logikai alacsony szint a címet 0x76-ra állítja.

Az I2C busz használatakor csak a következőket kell csatlakoztatnod:

  • A5 – SCK
  • A4 – SDI
  • 5V – VIN
  • GND – GND

Huzalozási terv

 

Az eszközök összekötése breadboard-on:

Összekötés breadboardon

Mintaprogramok

A mintaprogramok működtetéséhez szükséged lesz a szenzor kiolvasását támogató library-re. A példákban a cactus.io BME280_I2C library-t alkalmaztuk, ami a bme.readSensor() paranccsal olvassa ki a szenzor aktuális adatait, majd a megfelelő függvényekkel kezeli le a nyomás, hőmérséklet illetve páratartalom értékeket.
A szenzor a hőmérsékletet alapértelmezetten Celsius fokban szolgáltatja. A függvényt hívhatjuk a getTemperature_C paranccsal, ekkor Celsiusban, vagy a getTemperature_F paranccsal, ekkor Fahrenheitben kapjuk a hőmérséklet aktuális értékét.

Az érzékelő a barometrikus nyomást alapértelmezetten Pascal-ban szolgáltatja. 100 Pascal = 1 hPa = 1 millibar. A függvényt hívhatjuk a getPressure_P paranccsal, ekkor Pascal-ban, vagy a getPressure_MB paranccsal, ekkor a mért értéket millibarokban kapjuk vissza.

A páratartalom értéket a getHumidity paranccsal tudjuk lekérdezni.

Egy kiemelendő függvénye a library-nek a kalibrálás, illetve az un. offset beállítás. A teszt mérések azt mutatták, hogy a panelre szerelt szenzor érzékeli a feszültség stabilizátorok hőjét, így a mért értékek egy állandó „eltolással” rendelkeznek. A setTempCal() függvény lehetőséget ad a mért érték korrigálására, pl. a setTempCal(-2) parancs két fokkal csökkenti a kijelzett értéket, így szolgáltatva valós eredményt.

Az alapértelmezett kalibrációs eltolás 0. Tehát csak akkor kell ezt a funkciót használni, ha 0-tól eltérő kalibrálási értéket szükséges alkalmazni.

Az alkalmazott library

 

A cactus_io_BME280_I2C könyvtár a következő függvényeket tartalmazza:

 

BME280_I2C () A 0x77 alapértelmezett cím használatával létrehoz egy objektumot
BME280_I2C (int cím) Objektum létrehozása alternatív címmel. Például a BME280_I2C (0x76)
begin () Az objektum létrehozása után az érzékelő inicializálása
setTempCal (float) Lehetővé teszi a hőmérséklet kalibrálás eltolásának beállítását (ha szükséges)
readSensor () Az érzékelőből származó adatok olvasása
getTemperature_C () A hőmérséklet értéket Celsius fokban adja vissza (float)
getTemperature_F () A hőmérséklet értéket fahrenheit fokban adja vissza (float)
getHumidity () A százalékos páratartalmat adja vissza (float)
getPressure_MB () A nyomás értéket millibarokban adja vissza (float)
getPressure_HP () A nyomás értéket hektopascalban adja vissza (float)

 

Mintaprogramok, Cactus.io library

  1. program: bme_cactus.ino
    A szenzor alapfunkcióit mutatja be, a mért értékeket az IDE program soros monitorán láthatod.
  2. program: bme_cactus_lcd.ino
    Az alapprogram kibővítése úgy, hogy a mért értékek egy négysoros LCD kijelzőn jelennek meg. A kijelző meghajtását az alap LiquidCrystal library végzi.
  3. A szenzor működtetéséhez szükséges library: cactus_io_BME280_I2C.zip
    Az Arduino IDE felületén a következőképpen tölthető be: Vázlat/könyvtár tartalmazása/.ZIP könyvtár hozzáadása

A leírás alapjául szolgáló eredeti, angol nyelvű cikk elérhetősége

A cikkben használt BME280 érzékelő megvásárolható a MálnaPC Webshopjában!