Az időjárás állomásomban a BME280 hőmérséklet, páratartalom és légnyomásmérőt használtam. Jelenlegi ára (2023) 1400Ft körüli. Kétféle kivitelben kapható, az egyik modulon csak az I2C, míg a másikon az I2C és az SPI port is ki lett vezetve. Alapból az érzékelő egy 2.5×2.5mm-es alig látható légypiszok.
Lényegesebb technikai adatok:
Hőmérséklet mérési tartomány -40C° – +85C°, pontosság 0-20C°-ig +/-1.25C°
- Légnyomás mérési tartomány: 300-1100hPa, pontosság hőmérséklet függő +/-1.5hPa körüli (részletesebben lásd az adatlapot)
- Páratartalom mérési tartomány: 0-100%-ig, pontosság +/-3%, de +/-1% körüli hiszterézissel és nemlinearitással is rendelkezik
A chip fogyasztása 2-3μA, sleep módban 0.1μA.
Kezelő könyvtárakból rengeteg található. Én az Adafruit könyvtárat töltöttem le és használtam. A BME280 kereső szó megadásakor rögtön ez jött fel elsőnek:
Találhatók a könyvtárhoz így a használat nem jelenthet gondot. Írásom nem erről szól, hanem a modullal kapcsolatos problémáimról, és a lekérdezésének gyakoriságából adódó pontatlanságról, illetve annak elkerüléséről.
A modult egy alumíniumból hajtogatott hengerbe szereltem be, a henger végeit sűrűszövésű teaszűrővel zártam le, hogy a bogarak nem másszanak be.
Kb. két évig jól is működött. A problémák 2022-ben váltak láthatóvá. Sorban dőltek meg a melegrekordok ez igaz, de a kijelzett 44 fok hőmérséklet nem tűnt valósnak. Ekkor még nem gyanakodtam, gondolván, hogy az eresz alatt melegebb lehet, mint máshol. Aztán télen már kezdett feltűnni, hogy a mi udvarunkban soha nincs fagy!? Bár nem volt a télen hideg, de azért jelezte a meteorológiai, hogy fagyott egyik másik éjjel. Tavasszal a kiskert tulajdonosok arra panaszkodtak, hogy fagy volt, és megsínylették a frissen kiültetett palánták. Nálunk is elfagyott a veteményes, de 3 fok alá nem ment a hőmérséklet soha a kijelző szerint. Itt fogtam szagot, hogy valami vaj van. Tettem mellé egy hagyományos higanyos hőmérőt és figyeltem. Elképedtem, amikor kiderült, hogy 7-8 fokkal többet mutat a kijelző, mint a hagyományos hőmérő. Azonnal rendeltem egy másik modult, és ideiglenesen levontam a mért hőmérsékeltből 8 fokot, hogy a valós értéket lássam a kijelzőmön. Közben persze gondolkodni kezdtem, hogy mi lehet a baj. Kitisztítottam a hengert, hátha beköltözött egy pókcsalád és az melengeti. De nem! Aztán beállítottam egy ventillátort, és ráirányítottam a szenzorra a keletkezett szellőt. Ez már jelentősen lejjebb vitte a hőmérsékletet. Végül a megfejtésben a szerencse segített. Részesei voltunk a 2023-as év augusztusi nagy áramszünetének. Több mint 40 órát nem volt áram. Hűtők leolvadtak, hidegvízben fürödtünk és gyertyával világítottunk. Amikor délután hatkor visszajött a feszültség, meglepve láttuk, hogy a valós 27 fokos hőmérséklet helyett 19 fokot jelzett az időjárás állomásom. Eltelt egy-két óra, és ahelyett, hogy a délutáni óráknak megfelelően csökkent volna a hőmérséklet, folyamatosan nőni kezdett kijelzett érték. Este 8-ra érte el a maximumot, a 25 fokot (ne feledkezzünk el a -8 fokos beépített korrekcióról). Tehát a panel melegszik, csak ez lehet a megoldás. Elő is kaptam a modul kapcsolási rajzát a NET-ről:
Látható, hogy a szenzoron kívül egy 5V->3.3V tápegység is található a panelen. Roppant szerencsétlen elrendezés, hogy ez a tápegység a panel másik oldalán a szenzorhoz nem túl távol található:
Logikus következtetés, hogy ez a tápegység megbolondult, hőt termel és átmelegíti a panelt. Bár az sem kizárt, hogy maga a szenzor zabálja az áramot, és melegszik, de előbbi a valószínűbb! Nem tudom, hogy így van-e. Próbáltam mérni az áramfelvételt. A BMP280 chip áramfelvétele nem derült ki számomra világosan az adatlapból. 2-3 μA áramfelvételt ad meg minden egyes paraméter mérésére (hőmérséklet, légnyomás, páratartalom) 1 Hz-s mintavétel esetére. Ha ezt összesítve kell értelmezni, akkor is maximum 10 μA az áramfelvétel. Ugyanakkor a GY-BMEP280 modulra is lehetett adatokat találni, ahol a teljes áramfelvétel maximumának 1.2 mA lett megadva. Nyilván az 5V->3.3V tápegység fogyasztja el a az áram nagyrészét. Nem derült ki a rajzokból, hogy ennek a tápegységnek mi a konkrét típusa, de találtam a neten 10μA-től 5mA-ig nyugalmi áramfelvételű típusokat. Miután kicseréltem a hibás modult az újra, végeztem néhány mérést, hogy igazoljam a feltevésemet. 0.5 másodperces kiolvasási gyakoriság esetén az áramfelvétele 480μA volt. Azonban 10 percen belül ez felugrott 1 mA környékére, két óra múlva pedig 2.2mA-re. Ez a táp szerintem meghibásodott! Gondolkodtam, hogy mi lehet az oka! Megfigyeltem, hogy a mérőállomásomba az alumínium hengerbe felülről lógattam be a szenzort. Tételezzük fel, hogy a vezetéken pára csapódik le. Az pont a modulra folyik rá. Esetleg ez okozhat meghibásodást. Ebből okulva most pont fordítva raktam fel, a modul! A bevezető vezetékdarab végén felfelé „ágaskodik”, és a pára a vezetékre folyik vissza. Hogy jó-e? Az idő eldönti!
Kutakodásaim során figyeltem fel arra, hogy a modul I2C buszcímét is át lehet állítani a BME280 chip mellett található három forrpont, ha a középsőt a baloldalival kötjük össze, akkor a cím 0x76 ez az alapértelmezett), míg ha a jobboldalival, akkor 0x77. Vagyis két modult is tehetünk egy buszra.
Amíg postán megérkezett az újonnan rendelt BME280 modulom, sokat gondolkodtam az elmúlt évek eseményein. Ugyanis időjárás állomásomat többszöt átépítettem, és kb egy évvel ez előtt kiegésszítettem szélsebesség mérővel. A szélsebesség mérő egy külön ATMega8 vezérlőre került, ami I2C buszon komunikált a fő egységgel. Nem sokkal előtte egy „szerviz” LCD kijelzőt is beépítettem, amit fejlesztési okokból intenzíven használtam az I2C buszon keresztül. Azon az I2C buszon történt mindez, amin előtte percenként egy alkalommal lekérdeztem a BME280 adatait. Most meg immár másodepercenként többször is kommunikálnak az eszközök! Lehet ennek valami köze a modul fogyasztásához, és ezen keresztül a pontosságához?
A kérdés tehát az, hogy a modul áramfelvétele függhet-e az I2C port használatától. Feltételezésem szerint nő az áramfelvétel az I2C busz intenzív használatakor, és ez megemeli a modul NYÁK lemezének a hőmérsékletét. Kell-e ezzel foglalkoznunk?! Utólag már tudom, hogy kell!!!
Első kísérleti programomban egy loop() ciklus elején minden alkalommal kiolvastam a hőmérsékletet. Azonban az eredményt praktikus okokból nem küldtem azonnal a soros portra, mert ez nagyon lelassította volna a lekérdezések számát, így csak 10 másodpercenként írtam ki az eredményt. A kiolvasott hőmérséklet mögé kiírtam a ciklusok, azaz a mérési eredmények BME280-ból történő kiolvasásának számát, hogy lássuk mekkora terhelés érte az I2C buszon a chip-et. A listából amit közzé teszek kiszedtem részeket, hogy ne legyen annyira hosszú. A kiírás időpontjából azonban látható, hogy néhány percig végeztem a program futtatását:
Indul…
06:12:29 -> 25.89 1
06:12:39 -> 25.97 11962
06:12:49 -> 26.03 11970
06:13:09 -> 26.13 11969
06:13:29 -> 26.19 11965
06:13:39 -> 26.23 11972
06:13:49 -> 26.25 11977
06:14:09 -> 26.30 11969
06:15:29 -> 26.40 11959
06:19:09 -> 26.50 11976
06:19:49 -> 26.50 11980
06:19:59 -> 26.51 11973
06:20:09 -> 26.50 11969
Azt hiszem jól látható, hogy az induló 25.9 fok hőmérsékletről 7 percen belül felemelkedett a hőmérséklet 26.5 fokra és gyakorlatilag itt állandósult. Kimondhatjuk, és ezt több futtatással is megerősítettem, hogy az I2C busz intenzív használatára a chip akár fél fokos hőmérséklet emelkedéssel reagál. Ne legyen kétség senkiben, nem a szoba hőmérséklete emelkedett meg. Közben egy helyben ültem és még levegőt sem vettem. A próbapanelemet, amin megépítettem a hőmérő kapcsolást, jó messzire toltam laptopomtól, hogy még a ventilátorával kavart meleg levegő se zavarja meg. Öt futtatást végeztem köztük pár perces „áramtalanítással”, hogy a chip visszahűljön.
Jött a második kísérlet, miszerint nem a BME280 chip-et kérdezgetem le, hanem az I2C buszra feltettem vele párhuzamosan egy DS3231 RTC óra chip-et. Ezt kérdezgettem a loop() elején, és 10 másodpercenként csináltam egy hőmérséklet kiolvasást és ennek kiírását a soros portra:
07:04:00 -> Indul…
07:04:01 -> 26.76 1
07:04:11 -> 26.84 6573
07:04:31 -> 26.96 6573
07:04:51 -> 27.03 6573
07:05:21 -> 27.10 6573
07:05:41 -> 27.13 6573
07:06:21 -> 27.18 6573
07:06:51 -> 27.20 6572
07:07:31 -> 27.22 6573
07:07:41 -> 27.23 6572
07:08:01 -> 27.25 6572
07:08:11 -> 27.25 6573
Itt is kiszedtem pár mérési eredményt, hogy ne legyen annyira hosszú a lista. Megfigyelhető, hogy itt egy loop() ciklusokból itt már csak kb. 6500 zajlott le másodpercenként, mert a DS3231 chip több adatot küld az idő lekérdezésekor, ami tovább tart. Azonban az I2C busz terhelése ugyanakkora. Nagyából ugyanazt az eredményt kaptuk, azaz fél fokkal emelkedett a hőmérséklet a busz intenzív terhelésének hatására. Ennek oka az lehet, hogy a BME280 chip ugyanazokat a buszon zajló tevékenységet érzékeli, csak éppen nem válaszol rá. Azonban az ehhez szükséges áramköreit nyilván aktívan használja, figyeli a busz órajelét, veszi az adatokat, értékeli a kapott címet stb.
Következő kísérletben gyorsan cselekedtem! Kikommenteztem a programból a DS3231 lekérdezését, így az I2C buszhoz csak 10 másodpercenként nyúlok hozzá a BME280 lekérdezésével. A program újrafordítása és rátöltése igénybe vett kb. fél percet, de az eredmény még így is meggyőző:
07:08:44 -> Indul…
07:08:44 -> 27.18 1
07:08:54 -> 27.15 12410
07:09:04 -> 27.10 12644
07:09:24 -> 27.01 12648
07:09:34 -> 26.98 12647
07:09:54 -> 26.92 12646
07:10:04 -> 26.90 12248
07:11:24 -> 26.80 12248
07:16:45 -> 26.70 12248
07:19:15 -> 26.71 12247
07:21:55 -> 26.72 12646
07:25:05 -> 26.74 12249
Mint az jól látható a chip elkezdett hűlni. 5-6 perc alatt állandósul is egy 0.4-0.5 fokkal kisebb hőmérséklet. Tehát valóban az I2C intenzív használata fűtötte fel a chip-et, mert amikor az a terhelés megszűnt, visszahűlt egy alacsonyabb hőmérsékletre. A mérést tovább is folytattam, és láthatóan emelkedik néhány század fokkal a hőmérséklet! Ennek oka, hogy közben elkezdett besütni a nap a konyhaasztalra, ahol a kísérleteket végeztem! Nem sütött rá közvetlenül a chip-re, de azért elkezdett emelkedni a környezeti hőmérséklet.
A következő kísérletben (ez már egy következő napon zajlott) újabb paraméteren változtattam! Visszaraktam a programba a DS3231 folyamatos kérdezgetését, és a BME280 modult nikecell szigetetelő lemezek közé raktam, ezzel lerontottam a környezetének „hűtő” hatását:
06:15:55 25.68 1 25.7
06:16:05 25.77 6571
06:16:15 -> 25.87 6570
06:16:25 -> 25.94 6570
06:16:35 -> 26.01 6571
06:16:45 -> 26.06 6569
06:16:55 -> 26.11 6570
06:17:05 -> 26.15 6570
06:17:15 -> 26.19 6569
06:17:25 -> 26.22 6571 26,2
06:17:35 -> 26.25 6570
06:17:45 -> 26.28 6571
06:17:55 -> 26.30 6570 26.3 2 perc 0,6 fok
06:18:05 -> 26.33 6570
06:18:15 -> 26.34 6570
Pirossal jelöltem a fontos sorokat a listába. Eddig 4-5 perc kellett a hőmérséklet állandósulásához, ami 0.5fok-kal magasabb értéken állandósult. Immár két perc is elég volt, és 0.6 fokkal magasabban állandósult a hőmérséklet. Nem meglepő, hiszen kisebb sebességgel áramlik ki a modulból a keletkezett hő. Ezt a kísérletet is többször megismételtem, nem egy véletlen eredmény!
Következő kísérletben eltávolítottam a szigetelő lemezt, és alaposan lecsökkentettem a loop()-ban a DS3231 lekérdezések számát. Immár csak 1000 lekérdezést csináltam másodpercenként. A BME280 adatait továbbra is csak 10 másodpercenként olvastam ki:
07:23:32.071 -> Indul…
07:23:32.165 -> 26.52 1
07:23:42.182 -> 26.53 906
07:24:02.229 -> 26.57 907
07:24:22.232 -> 26.58 906
07:24:32.256 -> 26.57 907
07:24:52.264 -> 26.56 906
07:25:12.301 -> 26.57 906
Meggyőző az eredmény! Nem történik lényegi hőmérséklet emelkedés. Jóval hosszabb ideig regisztráltam, de itt már zavaró, hogy közben a szoba hőmérséklete is emelkedett. Minden esetre az látható, hogy ez a terhelés már nem zavarja számottevően a hőmérséklet mérésünk eredményét. Megcsináltam a kísérletet 100 kiolvasással is, de nem láttam lényegi eltérést!
Tanulság! Ha tudunk olyan modult választani, amin nincs 5V->3.3V DC tápegység, az vélhetőleg nem fogja teljesítmény veszteségével melegítani a panelt. Úgy emlékszem, hogy van 3.3V-os modul is a termékpalettán. Másik lehetőségünk, hogy a modult olyan I2C buszon használjuk, amin nincs forgalom. Ha vannak szbad kivezetések, erre megfelelő lehet egy szoftveres I2C busz is. Illetve a másik modul típuson van SPI port kivezetés is, használjuk azt.