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.
Á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.
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
Az eszközök összekötése breadboard-on:
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
- program: bme_cactus.ino
A szenzor alapfunkcióit mutatja be, a mért értékeket az IDE program soros monitorán láthatod. - 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. - 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!