Meteostanice, verze 3 Arduino

Aktuální naměřené hodnoty počasí

(17.5.2014)

Původní 2 verze jsou zde:
Verze 1 - Printserver Edimax:
edimax
Verze 2 - Wrap: wrap

Verze s WRAPem uměla měřit teplotu a vlhkost. Chtěl jsem ještě doplnit měření aktuálního barometrického tlaku. Postavil jsem tedy zapojení podle tohoto 1-Wire Barometer s čidlem MPX4115. Bohužel toto zapojení nebylo možné zkalibrovat na rozumný a použitelný průbeh. Proto jsem toto řešení zavrhl, a rozhodl se, že postavím novou meteostanici zcela od začátku.


 Základem tohoto nového řešení je

Arduino UNO R3

Tato deska obsahuje:

  • Procesor ATmega328 bžící na frekvenci 16MHz

  • Flash paměť 32KB

  • 14 digitálních I/O pinů

  • 6 Analogových vstupních pinů

  • Napájení 5V (7-12V)

Což je pro takto jednoduché zařízení, které má z něho být postaveno jako dostačující.

Pro měření teploty a vlhkosti jsem vybral čidlo

DHT22

Čidlo měří

  • teplotu v rozsahu -40 ~ 125ºC

  • v rozlišení 0.1ºC

  • s přesností +-0.2ºC

  • relativvlhkost v rozsahu 0 ~ 100%RH

  • v rozlišení 0.1%RH

  • s "přesností" 0.5% RH (viz dále)

Pro měření atmosférického tlaku čidlo

BMP085

Čidlo měří:

  • tlak v rozsahu 300 ~ 1100hPa

  • v rozlišení 0.06hPa (0.03hPa)


Celá meteosatnice pak vyvadá takto:

Čidlo DHT22 je umístěno do plastové trubky o průměru 80mm. V dolní části je zabudovaný kvalitní ventilátor 12V s kuličkovými ložisky. Je napájen napětím cca 7.5V, a žene skrz trubku a okolo čidla okolní vzduch. Je tam proto, aby bylo čidlo co nejméně ovlivňováno teplotou trubky. Čidlo DHT22 je napojeno na I/O pin Arduina. Také jsou měřeny otáčky ventilátoru. Je použita HALL sonda, kterou každý takovýto ventilátor z PC obsahuje. Stačí připojit žlutý drát ventilátoru na I/O pin Arduina, a podepřít ho cca 10k odporem na 5V.


  Elektroniku - Arduino UNO, čidlo BMP085 regulovatelný zdroj pro napájení ventilátoru a Arduina jsem vestavěl do plastového boxu:

Veškeré součástky jsou zapojené opět na univerzálním plošném spoji. Je zde čidlo tlaku, a dále čidlo DS18B20, které měří teplotu uvnitř boxu. Vzhledem k tomu, že se elektronika zahřívá sama o sobě, a ještě když na box svítí sluníčko, tak teplota uvnitř dosahuje i v tomto ještě celkem chladném počasí až 30ºC. Proto jsem do boku boxu zabudoval ventilátor. Ten je napojený přes tranzistor na I/O pin Arduina. Takže pokud Arduino zjistí, že teplota v boxu překročila určitou hodnotu, tak sepne ventilátor, a chladí vnitřek boxu.
Je zde ještě osazený piezzo reproduktorek, který signalizuje že se zastavil ventilátor v trubce. Potom ještě 2ks LED diod. Zelená signalizuje, že se točí ventilátor a červená, která signalizuje že nastal nějaký error.


Takto zapojenou meteostanici jsem testoval několik měsíců souběžně s původní meteostanicí, běžící na Wrapu a s kvalitníma čidlama DS18B20 a HIH4000. Hodnoty teploty a vlhkosti jsem tedy zkalibroval podle těchto starých čidel, protože kvalita DHT22 bohužel nedosahuje zdaleka hodnot uváděných v datasheetu (viz dále). Hodnoty z Arduina jsem načítal do serveru přes USB port programem v Pythonu. Když jsem zjistil, že je toto zařízení jako meteostanice celkem použitelné, doplnil jsem je o další elektroniku:

Arduino Ethernet Shield W5100


Ethernet shield mi bohužel trochu narušil mechanickou koncepci celého zařízení. Box je vyroben tak, aby šel kdykoliv "odpojit a odnést" pro případné úpravy do dílny. Bohužel jsem nesehnal vodotěsnou průchodku, kterou by prolezl ethernet kabel i s RJ45 konektorem, takže jsem ji musle vyrobit. Použil jsem část tuby od multivitaminu. Trubka je do boxu zalepená tavným lepidlem, a skrz zátku prochází ethernet kabel, který ja tam také utěsněný tavným lepidlem. Takže když potřebuji zařízení odnést, vytáhnu zátku, a konektor protáhnu skrz trubku.



Software

Arduino:

  • Načte hodnoty všech čidel

  • Provede korekce teploty a vlhkosti

  • Přepočítá atmosférický tlak na hodnotu tlaku na hladinu moře. Hodnotu tlaku jsem porovnával s hodnotami, které uvádí Český hydrometeorologický ústav, a kupodivu hodnoty odpovídají celkem přesně.

  • Zkontroluje jaká je teplota uvnitř boxu, a podle toho zapne, nebo vypne ventilátor chlazení boxu.

  • Zkontroluje, zda se točí ventilátor v trubce. Pokud ne, začne pískat do reproduktoru.

  • Odešle po síti naměřená data do serveru. Je použita metoda Client (www_client_test.ino), kdy Arduino data do serveru ODESÍLÁ. Metoda, při které je Arduino nastaveno jako "server", tzn. že na něm beží webové rozhraní, a data si z něho počítač stahuje se mi moc neosvědčila.

Server:

(Atom 1.6GHz, 2GB RAM, Linux Mint Maya)

  • Přes jednoduchý prográmek v getTemperature.php přijme data z Arduina, a uloží je do souboru.

  • Zkontroluje, jestli nejsou načtená data chybná, jestli hodnoty odpovídají nějakému rozsahu.

  • Pomocí programu RRDtool načte data ze souboru, a vytvoří z nich databázi a grafy pro WEB.

  • Zkontroluje, jestli se točí ventilátor v rouře, a v případě poruchy ohlásí emailem závadu.

Smyčka v Arduinu je nastavena tak, aby se data na server odesílala každých 43s. Hodnoty do RRDtool databáze se načítají každou celou minutu, takže data odeslaná z Arduina jsou vždy maximálně minutu stará.

To je asi všechno.


Kvalita čidel

V meteostanici jsou použita 2 čidla.

BMP085
Tomuto čidlu se nedá celkem nic vytknout. Přesnost i rychlost pravděpodobně odpovídá datasheetu.

DHT22 a DHT11
Bohužel, kvalita těchto čidel je velice špatná. Nakoupili jsme s dalšími lidmi, kteří staví podobné meteostanice několik těchto čidel.
Čidlo DHT11 je pro tyto účely nevhodné, protože má rozsah pro měření teploty jenom v kladných hodnotách (0 ~ 50ºC), rozsah vlhkosti 20-90%RH a přesnost +-5%RH
Použité čidlo DHT22 měří teplotu sice o 0.5ºC vyšší, ale naštěstí v celém rozsahu stejně. Takže stačilo odečíst od naměřené hodnoty tuto chybu.

Bohužel, daleko větší problém je měření vlhkosti. Čidlo použité v meteostanici ukazuje celkem dobré hodnoty, v mezích tolerance. Bohužel je to jediné čidlo, které se do tolerance jakž takž vešlo.
Ostatní zakoupená čidla ukazují při 75%RH hodnoty od 60 do 85%RH, a odchylka nen
í v celém rozsahu stejná. Takže není možné použít nějakou jednoduchou korekci odečtením, nebo přičtením nějaké konstanty.

Testy čidla vlhkosti.
Vlhkost jsem jednak porovnával s původním čidlem HIH4000, které by mělo být dost přesné. Sice toto čidlo nemělo kalibrační protokol, ale i tak ukazuje při testu s kuchyňskou solí hodnotu 75%RH. DHT22 ukazovalo při porovnání s HIH4000 rozdíl asi +3%RH.
Čidla vlhkosti se dají otestovat metodou nasyceného roztoku kuchyňské soli:
Metoda kalibrace nasyceným roztokem soli funguje na tomto principu:
Vzduch v rovnováze s roztokem soli má menší vlhkost než vzduch nad čistou vodou. Jinak řečeno je třeba nasyceny roztok s přebytkem soli tak, aby tento mohl absorbovat vodu ze vzduchu nad roztokem a platila tabulka. V tabulce jsou nejpoužívanější kalibrační soli, jsou voleny tak aby bylo možné vlhkoměr kalibrovat vícebodově. Jinak řečeno využívá se hygroskopických vlastností soli, tedy schopnost pohlcovat vzdušnou vlhkost. Vzhledem k tomu, že kuchyňská sůl je asi nejdostupnější látkou z tabulky, použili jsme ji pro testy čidel DHT22. Kalibrace se provádí tak, že do plasové dózy s víčkem se nasype sůl, a navlhčí vodou. Je třeba použít cca 10dkg soli, a sůl musí být hodně mokrá, ale ne tak, aby byla hladina vody nad solí. Do dózy se nad hladinu umístí čidlo, dráty se vytáhnou ven a připojí k Arduinu. Dóza se vzduchotěsně uzavře. Hodnoty se odečítají minimálně po 8hodinách, nejlépe až po 24hodinách.
Teplota a odpovídající vlhkost 5ºC 10ºC 15ºC 20ºC 25ºC
chlorid lithný 11.3 11.3 11.3 11.3 11.3
chlorid hořečnatý 33.6 33.5 33.3 33.1 32.8
uhličitan draselný 43.1 43.1 43.1 43.2 43.2
bromid sodný 63.5 62.2 60.7 59.1 57.6
chlorid sodný (kuchyňská sůl) 75.7 75.7 75.6 75.7 75.3
chlorid draselný 87.8 86.8 85.9 85.1 84.3
síran draselný 98.5 98.2 97.9 97.6 97.3

Hledal jsem na internetu, jestli máme problémy s kvalitou těchto čidel jenom my, ale podle různých diskuzí jsem zjistil, že je to obecný problém. Kvalita čidel se velmi liší kus od kusu. Takže při nákupu těchto čidel je to bohužel o štěstí.


Toto čidlo se docela povedlo

Kuchyňské soli je opravdu potřeba větší množství, a musí být dostatečně mokrá
Hodnota se ustálí po cca 8mi hodinách



Pitva čidla DHT22
Po špatných zkušenostech s těmito čidly jsem se rozhodl, že jedno čidlo, které mělo odchylku +10%RH rozeberu, a zkusím ho upravit.

Jak je vidět, z jedné strany je termistor, který měří teplotu, a vedle kapacitní čidlo vlhkosti.
Z druhé strany je několik odporů a kondenzátorů, stabilizátor napětí, krystal, a MCU STM8S103F3P6. Jedná se o 16 MHz STM8S 8-bit MCU, up to 8 Kbytes Flash, data EEPROM,10-bit ADC, 3 timers, UART, SPI, I²C mikroprocesor. Tento MCU měří hodnotu termistoru a čidla vlhkosti, a převádí ho na formát dat, která dokáže Arduino načíst. Bohužel jsou v něm uložené i nějaké kalibrační hodnoty pro použitá čidla. Čidlo vlhkosti je ale zřejmě mimo toleranci :-( Zkoušel jsem čidlo pro snímání vlhkosti vyměnit, ale je použit nějaký jiný snímač, než který se běžně používá ve vlhkoměrech, takže čidlo ukazovalo potom ještě větší nesmysly (99.9%).

Kupodivu v čidle DHT11, které je rozebíratelné je označení MCU odbroušené, ale čidlo vlhkosti je standardní. Takže po jeho výměně DHT11 dále ukazoval normální hodnoty.


Ještě bych chtěl upozornit na jeden nepovedený modul k Arduinu.

Jedná se o Hodiny reálného času (RTC) DS1307. Koupil jsem první kus, a zjistil, že se rozejde za 14 dní asi o půl minuty. Koupil jsem tedy druhý kus, a ten se rozcházel naprosto stejně. Zkusil jsem tedy vyměnit krystal za krystal z digitálek, které šly relativně přesně. Bohužel, nic se nezměnilo, a modul se dál rozcházel steným způsobem. Zkoušel jsem tedy ke krystalu dávat kondenzátory. Při použití různých kapacit a různých zapojeních kondenzátorů (paralelně ke krystalu, do séria nebo k zemi) se mi podařilo dosáhnout pouze dvou stavů. Hodiny buď nešly vůbec, nebo se stejnou nepřesností. Takže jsem je zahodil, a koupil RTC modul DS3231. Ten je sice 2x tak drahý (asi 2.2$), ale jde naprosto přesně! Má i vnitřní tepelnou kompenzaci, takže mu nevadí ani velké výkyvy teploty.


 



Na hlavní stránku