Dnes niečo z praktického súdka. Každý správny Arduinista začne prvým zložitejším projektom - meteostanicou. Meteostanica by mala vo svojej minimálnej funkčnosti snímať aspoň 3 veličiny:
- Teplotu
- Atmosférický tlak
- Vlhkosť vzduchu
Obľúbenými vylepšeniami môže byť aj záznam ďalších veličín:
- Intenzita osvetlenia
- čas východu a západu Slnka
- kvalita ovzdušia
- rýchlosť vetra
- množstvo zrážok
Záznam údajov s využitím štandardných barometrov znamená vo výsledku meranie absolútneho atmosférického tlaku, to znamená tlak v aktuálnej nadmorskej výške. Tu nastáva problém, keďže z nameraných údajov nie je zrejmé, či sa jedná o vysoký, alebo naopak nízky atmosférický tlak. Riešenie spočíva v možnosti prepočítať absolútny atmosférický tlak na relatívny, teda na úrovni mora.

Najpoužívanejšie barometre od Boschu - cenovo dostupné senzory BME280 (záznam teploty, vlhkosti, atmosférického tlaku, nadmorskej výšky), BMP280 (záznam teploty, atmosférického tlaku, nadmorskej výšky) dokážu túto konverziu vykonať vďaka nameraným údajom.
Najčastejšie sa využívajú 3 vzorce prepočtu pre BM(X) senzory:
- relativny_t = abs_t / pow(1 - ((0.0065 * nadm_vyska) / (teplota + (0.0065 * nadm_vyska) + 273.15)), 5.257)
- relativny_t = abs_t / pow(1.0 - nadm_vyska/ 44330.0, 5.255)
- relativny_t = abs_t / pow(1.0 - 0.0065 * nadm_vyska/ (teplota + 273.15), 5.255)
- Vysvetlivky:
- relativny_t = relatívny tlak (na hladine mora)
- abs_t = absolútny tlak (nameraný)
- nadm_vyska = nadmorská výška
- teplota = zaznamenaná teplota
Druhý vzorec, určený pre interiér nepoužíva pre výsledný tlak nameranú teplotu, nakoľko tá je vnútorná a nie vonkajšia. Vo výsledku by bolo meranie nepresné a neodpovedalo by skutočnosti (vo výsledku sú vzorce totožné, druhý vzorec je implementácia teploty 15°C).
Programovaná implementácia pre Arduino (príklad pre BMP280):
#include "Adafruit_BMP280.h"
#include
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
Serial.begin(115200);
}
void loop() {
float teplota = bmp.readTemperature();
float tlak = bmp.readPressure() / 100;
float nadmorska_vyska = bmp.readAltitude(1013.25);
float tlak_hladina_mora = tlak / pow(1 - ((0.0065 * nadmorska_vyska) / (teplota + (0.0065 * nadmorska_vyska) + 273.15)), 5.257);
float tlak_hladina_mora2 = tlak / pow(1.0 - nadmorska_vyska / 44330.0, 5.255);
float tlak_hladina_mora3 = tlak / pow(1.0 - 0.0065 * nadmorska_vyska / (teplota + 273.15), 5.255);
Serial.print("Teplota = ");
Serial.print(teplota);
Serial.println(" *C");
Serial.print("Absolutny tlak = ");
Serial.print(tlak);
Serial.println(" hPa");
//RELATIVNY TLAK --> prepocitany na hladinu mora bosch vzorcom
Serial.print("Relativny tlak (origo Bosch vzorec) = ");
Serial.print(tlak_hladina_mora);
Serial.println(" hPa");
Serial.print("Relativny tlak (upraveny Bosch vzorec 2 - najviac odpoveda skutocnosti z merani) = ");
Serial.print(tlak_hladina_mora2);
Serial.println(" hPa");
Serial.print("Relativny tlak (upraveny Bosch vzorec 3) = ");
Serial.print(tlak_hladina_mora3);
Serial.println(" hPa");
Serial.print("Nadmorska vyska = ");
Serial.print(nadmorska_vyska); /* Adjusted to local forecast! */
Serial.println(" m.n.m");
Serial.println();
delay(10000);
}
Výstup programu do Serial monitoru bude vyzerať cca následovne:

Nameraná hodnota v druhom vzorci (meral som v interiéri) najviac zodpovedala skutočnosti. Blízka meteostanica hlásila 1013,01hPa. Odchýlka v ostatných vzorcoch je spôsobená využitím nameranej teploty v interiéri, ktorá ovlyvní výslednú konverziu.
Zapojenie:
Arduino (AtMega328P compatible) |
BME/BMP |
Vcc |
Vcc |
GND |
GND |
A4 (Hardware SDA) |
SDA |
A5 (Hardware SCL) |
SCL |
Pozor! Niektoré BME a BMP senzory sú iba na 3.3V, čo vyžaduje konverziu aj SDA/SCL pinov na 3.3V napäťovým deličom pri použití 5V Arduina.
Tester pre BMP280 je dostupný na Githube v mojom repozitári: https://github.com/martinius96/BMP-280-tester
Tester pre BME280 je dostupný na Githube v mojom repozitári: https://github.com/martinius96/BME-280-tester
Riešenie je možné použiť aj na nižšie verzie senzorov 085, 180...
V prípade záujmu môžete navštíviť aj môj web s mojom implementáciou meteostanice: https://arduino.php5.sk/meteostanica-arduino.php