Close

Meteostanice ovládaná Arduinem

Arduino meteostanice

Dalším příspěvkem do rubriky Vaše projekty je projekt meteostanice, kterou do naší soutěže přihlásil Michal Zelenka. Za zpracování článku mu tímto děkujeme.


Byl jsem požádán, abych sepsal něco málo o mém projektu Meteostanice, případně zveřejnil zapojení a kód. Sice nejsem žádný spisovatel, ale souhlasil jsem.

Začátky

Doma mi dlouho ležel ladem programátor USBasp, který jsem stavěl už kdysi dávno a tak jsem se odhodlal, že si zkusím postavit něco svého s mikroprocesorem Atmega. První největší problém byl, že jsem o mikroprocesorech věděl jen to, že bez nahraného programu jsou k ničemu. Programování jsem se naposled trochu věnoval na základce, a to PASCALu a předtím BASICu. První hledání po internetu mě přesvědčilo, že s BASICem se daleko nedostanu, rozblikat LEDku se povedlo, ale s ostatním už by byl problém. Takže slepá cesta a důvod vydat se směrem k jazyku C.

Moje první začátky s programováním popisovat nebudu, první pokusy rozblikat LEDku nebo roztočit motor zná asi každý. Tak začnu rovnou prvním rozumným nápadem, který mi ležel v hlavě už dlouho…udělat vlastní domácí meteostanici, s logováním dat. A tady začal můj příběh o stavbě meteostanice, kde se vyskytlo a stále pořád vyskytuje spousta problému. Zkusím to teď trochu popsat…snad se mi to povede.

Původně všechno začalo na mikroprocesoru Atmega8, běžným LCD displayem HD44780 2×16 znaků a teplotním čidlem DS18B20. Pátrání po internetu jak to všechno rozběhat zabralo nějaký čas, ale nakonec se povedlo.

První radost, kdy se na displayi ukázala teplota 🙂

Moje začátky s programováním

Moje začátky s programováním

Jenže hned po tom mi začalo docházet, že dvouřádkový display nestačí, jedno teplotní čidlo taky ne a tak proběhla výměna za 4×20 znaků. Následovalo objevení čidla DHT22, které umí i vlhkost vzduchu. Netrpělivé čekání na balíček a opět hledání jak vlastně zajistit, že mi DHT22 řekne teplotu a vlhkost. Chvilku jsem vydržel s kombinací DS18B20 a DHT22 kde jedno čidlo bylo natažené stíněnou dvoulinkou ven za okno jako venkovní teplota/vlhkost a druhé jako vnitřní teploměr, ale brzy to začalo být zase málo. Záhy dorazil další balíček, kde už byl i modul pro zápis dat na SD kartu, modul reálného času DS3231 a hlavně lepší display z Nokie 5110 přizpůsobený pro Arduino.

V této době jsem se ještě Arduinu vyhýbal. Arduino se mi líbilo spíš jen jako pro vývoj než pro použití ve finálním „produktu“ kvůli jeho velikosti a ceně, proto jsem zůstával u obyčejné Atmegy8… chyba, teď už to vím 🙂

Na nepájivém poli bylo stále dost místa, tak jsem mohl dál koukat, jak mi jeden display hezky ukazuje údaje a na druhé půlce pole si hrát s druhým displayem a RTC modulem.

Pokusy se dvěma displeji

Pokusy se dvěma displeji

Konečně nastala doba vyzkoušet i zápis dat na SD kartu. Chvilku mi to vydrželo, jenže mi tak nějak začal vadit ten ošklivý kabel natažený skrz okno ven. Něco málo hledání a nalezení maličkých a hlavně levných modulů pro komunikaci přes 433MHz. Tady už jsem narazil na problém, že většina návodů pro ty moduly 433MHz byla přímo pro Arduino, takže následovalo přeorientování na vlastní jednoduché Arduino, jen s procesorem Atmega328.

Arduino

První pokusy s 433Mhz a SD kartou

První pokusy s 433Mhz a SD kartou

Fungovalo to nějaký čas skvěle, jenže pořád vyndávat kartu a v počítači kopírovat data nebylo moc pohodlné, tak volba padla na posílání dat na internet a Thingspeak. První verze s internetem obsahovala ethernetový modul s ENC28J60, jenže ten se mi hrozně přehříval (i když podle výrobce prý OK). Malý chladič moc nepomáhal, takže zklamání… ethernet jsem zatím odstranil a odstranil jsem i přenos dat přes 433MHz.

Protože v nepájivém poli začínal být pěkný chaos při tom všem přidávání a odebírání součástek, tak jsem se rozhodl koupit svoje první Arduino. Rozhodl jsem se, že mi stačí Arduino UNO. Hned jsem přikoupil i senzor atmosférického tlaku BMP180 a taky pěkný barevný display. Display je konstruován jen na napětí 3.3V což jsem se dozvěděl až po několika marných pokusech o rozchození. Po několika hodinách jsem konstatoval jeho odchod do křemíkového nebe, ale na poslední chvíli jsem narazil na informaci že display je pouze na 3.3V a připojení na 5V ho zničí… poslední pokus zapojení přes odporový dělič a následoval jásot… LCD ŽIJE!! Rychlé přepsání kódu a meteostanice byla barevná. Bohužel po chvilce se na displayi začaly objevovat podivné chyby ve vykreslování. Byl jsem nucen tedy vyzkoušet několik dostupných knihoven pro obsluhu displaye. Každá měla pro mě určité výhody ale i nevýhody. Nakonec jsem narazil na knihovnu, u které jsem zůstal. Fonty měla sice kostičkované, ale bez chyb ve vykreslování.

Arduino a barevný displej

Arduino a barevný displej

Po čase jsem začal experimentovat s různou velikostí a stylem fontů ale chyby se opět začaly objevovat. Tady mi konečně došlo, že ty chyby jsou způsobené rozdílnou šířkou jednotlivých znaků. Protože u knihovny je přibalený i editor fontů, sjednotil jsem šířky číslic a vše bylo už v pořádku. Knihovna je dostupná na GitHubu.

Konečně meteostanice dostala nějakou rozumnou podobu, tak nastal čas přidat wifi a zápis dat na Thingspeak. ale nastal velký problém… a to s nedostatkem paměti Arduina. Možnost byla buď display nebo wifi…wifi vyhrála. Pár dní to běželo, ale postupem času mi to začalo zase vadit. Byl jsem donucen pořídit Arduino Mega které má paměti víc než dost (zatím si to stále myslím 😀 ).

Než Arduino Mega dorazilo tak jsem přemýšlel nad venkovním vysílačem teploty a vlhkosti. Tady mi naštěstí cestu zkřížila informace, že by se mohlo použít nějaké už hotové čidlo od komerčních meteostanic. V tu chvíli bylo rozhodnutí jasné… než dávat dohromady něco, kde nejspíš baterky dlouho nevydrží, použiju už něco hotového. Možná někdo bude říkat, že se to postavit bez problémů dá… věřím tomu, ale rozhodl jsem se tím dále nezabývat… aspoň zatím.

Doma mám už nějaký čas meteostanici Sencor s externím čidlem SWS-TS tak volba byla jasná. Jenže opět další problém, každá meteostanice každého výrobce používá jiný systém posílání dat pro meteostanici. Naštěstí internet je mocný nástroj se spoustou šikovných lidí a hlavně ochotných se podělit o svou práci, případně poradit. Na tomto webu jsem objevil celkem jednoduchý návod, jak odposlechnout za pomocí zvukové karty a jak dekódovat signál z čidla. Je tam k nalezení i kód pro Arduino, který by měl fungovat, ale u mého čidla nefungoval.

Hledání pokračovalo a našel jsem jedno téma v diskuzi, kde se tím někdo taky zabýval. Po menších úpravách s nastavením časování impulzů konečně Arduino přijalo teplotu z čidla 🙂

Ale…

První testy ukázaly zásadní problém… a to, že modul přijímače 433MHz je mizerný a bez dvoumetrové antény dosah není větší než 2-3 metry. Zkoušet pohnout cívkou, jak je na internetu někde zmiňováno, nemělo žádný efekt… vlastně mělo, přestalo to přijímat úplně 😀 Na Ebayi jsem objevil pár jiných a snad lepších přijímačů a hned jich několik objednal.

Různé bezdrátové moduly

Různé bezdrátové moduly

Ty úplně vlevo jsou podle mých testů úplně nejhorší varianta a doporučuji se jim vyhnout. Jak postupně docházely balíčky, tak jsem zkoušel jedno po druhém a v současné době se mi jeví jako nejlepší varianta RXB6 připojený na 3.3V (dokáže zaznamenat i vysílač souseda co bydlí o dvě patra níž než já 🙂 ). Na 5V se trochu zvýší dosah, ale zvýší se i šum a příjem je nespolehlivý. Bohužel se mi zatím nepovedlo vlastní řešení příjmu dat z meteostanice, tak stále používám kód zveřejněný v odkazu výše. Doufám, že se autor nebude zlobit 🙂

Díky dostatku paměti v novém Arduinu Mega jsem mohl spojit vše dohromady. Příjem externích čidel, WiFi pomocí ESP8266 a display. Aby display nesvítil zbytečně když nepotřebuji, bylo zde zapojeno podsvícení jen na podržení tlačítka…

První zapojení kompletní meteostanice

První zapojení kompletní meteostanice

…což není moc elegantní. Podsvícení jsem přepojil na výstup Arduina s tím, že na stisk tlačítka se na 10 vteřin display rozsvítí a na dvojité stisknutí zůstane svítit trvale. Chvilku se mi to tak líbilo, akorát dvojitý stisk nebyl spolehlivý. Někdy zareagoval na poprvé, a někdy si ze mě dělal akorát tak srandu… ani vzteklé výhrůžky a šílené mačkání tlačítka nezabralo. Kamarád mi poradil proximity senzor. Chvilka googlení odhalila senzor APDS-9930, který funguje i jako senzor osvětlení což by se dalo využít. Přepsání kódu nezabralo moc času a tak jsem hned zkusil i regulaci podsvícení v závislosti na okolním osvětlení. Teď stačí mávnout rukou nad čidlem a display se rozsvítí, když přidržím ruku chvilku nad čidlem tak display zůstane svítit trvale. Knihovnu pro senzor naleznete zde. Existuje i APDS-9960 který umí i navíc rozpoznat směr mávnutí ruky nad čidlem, ale to jsem se dozvěděl pozdě 🙁

Ještě jsem taky dlouho přemýšlel, jak vyřešit nastavení času. Napadalo mě řešení buď dvě tlačítka pro nastavení, anebo využít přijímač DCF. Nakonec mi to docvaklo… přece to bude připojený k internetu, takže volba padla na synchronizaci přes NTP. Kvůli tomu jsem využil upravený firmware pro ESP8266, který má v sobě implementované AT příkazy pro NTP. Dá se to vyřešit i s původním firmwarem, ale tohle řešení je jednodušší. Firmware je dostupný zde.

Jako poslední jsem nedávno objevil čidlo BMP280, které umí teplotu, vlhkost a i atmosférický tlak, takže jsem s ním nahradil dosud používaný BMP180 a DHT22.

Zatím finální verze meteostanice

Zatím finální verze meteostanice

Během stavby a programování bylo problémů víc než dost… a určitě ještě bude. Nekonečné trápení s chybějící závorkou nebo středníkem a záměna = za ==  mě stály spousty nervů a vlasů. Tady si vždycky nadávám a vzpomínám na PASCAL, kde mi to přišlo logičtější. Vůbec bych se nedivil, že jednou kvůli podobné chybě spadne někde letadlo 😀

Další z problémů jsem měl s příjmem z externích čidel, občas se to prostě přestalo přijímat. Díky kamarádovi se podařilo přijít na to, že je zde hloupá chyba s přetečením proměnných 😀
Taky jsem nechápal proč, když nastavím přes PWM u podsvícení LCD nulu tak pořád lehce svítil. Osciloskop odhalil, že nula u PWM není úplná nula a pořád tam lítal maličký impulz. Do dneška nevím, jestli je to chyba nebo vlastnost Arduina.

Meteostanice má spousty chyb, o některých vím, jen nebyl zatím čas je řešit. Současný největší problém je s wifi, kdy po nějaké době přestane fungovat. Řešení bude testování odpovědi ESP8266 a  HW reset ESPčka. V kódu je spousta nesmyslů nebo zbytečností, které by se daly řešit jinak… na to dojde časem v dalších verzích.

O nějaké elegantnosti v kódu taky mluvit nebudu, postupem času jak se to pořád nabaluje, umazává, přepisuje, se to uhlídat moc nedá. A navíc v programování jsem amatér 😀

Použité součástky

  • Arduino Mega
  • ESP8266
  • APDS-9930 + level shifter!!
  • BMP280(BME280)
  • DS3231
  • LCD display ILI9341 – je na 3.3V – třeba připojit přes odporový dělič nebo použít display na 5V
  • RX modul 433MHz RXB6

Funkce

  • Vnitřní teplota a vlhkost, + výpočet rosného bodu a teplotního indexu.
  • Podporuje tři externí čidla od výrobce Sencor (testováno s SWS-TS a SWS-THS) ze kterých umí zpracovat údaje o teplotě, vlhkosti, číslo kanálu a stav baterie.
  • Příjem jednotlivých kanálů je signalizován symbolem na LCD a také žlutou LED diodou.
  • V případě, že déle jak 90 vteřin nebyl přijat signál z určitého čidla(kanálu) je barva kanálu změněna na žlutou, pokud výpadek trvá déle než 180 vteřin, barva hodnot se změní na červenou a tento kanál je vyloučen ze seznamu odesílaných dat na thingspeak.
  • Čas se synchronizuje pomocí NTP (zatím jen při spuštění, v plánu je každou půlnoc).
  • Atmosférický tlak
  • U těchto hodnot se provádí porovnávání a následné zobrazení zda hodnoty stoupají nebo klesají.
  • Hodnoty se posílají přes Wifi na server Thingspeak. Odesílání dat je prováděno každou pátou minutu a je opět signalizováno symbolem na LCD a zelenou LED diodou.
  • Plynulé rozsvěcování a zhasínání podsvícení LCD díky PWM regulaci
  • Display se rozsvítí na cca. 10 vteřin mávnutím ruky nad proximity senzorem. Přidržením ruky nad senzorem se aktivuje nebo deaktivuje režim stálého podsvícení, který je opět signalizováno malým symbolem žárovky na LCD.
  • Hodnota osvětlení.
  • Regulace jasu v závislosti na okolním osvětlením.

Co bych chtěl ještě dodělat

  • Měření rychlosti větru (z toho počítat pocitovou teplotu), směr větru, srážkoměr.
  • Měření UV záření.
  • Měření atmosférického náboje a detekci blesků (v současné době je to ve stádiu testu a čekám na bouřku, abych zjistil, jestli to vůbec funguje). Existuje malý modul, který umí detekovat bouřku a blesky v okruhu 40km… ale sehnat ji za rozumné peníze nelze 🙁
  • Vyměnit LCD display za dotykový (už je na cestě).
  • Pokusit se o předpověď počasí dle změn tlaku vzduchu.
  • Minimální a maximální hodnoty.
  • Přidat různé obrazovky s jiným uspořádáním údajů.
  • Posílat data na vlastní WEBové stránky, ale to už je pro mě složité. Navíc jsem teď objevil celkem pěkný widget pro Android na zobrazování dat z ThingSpeaku.
  • IoT ThingSpeak Monitor Widget (viz obrázek)
IoT Thingspeak Widget

IoT Thingspeak Widget

No a ve finále tomu dát nějaký rozumný vzhled, vyrobit plošný spoj a zabudovat do krabičky – ale to je ještě daleká cesta 🙂

Ještě pořád přemýšlím to celé místo Arduina Mega postavit přímo na ESP8266, ale zatím s ESP nemám zkušenosti a taky netuším, zda to všechno zvládne… přeci jen těch volných pinů má o dost méně než Arduino Mega.

Veškeré rady, nápady nebo i pomoc uvítám…

Zapojení

DS3231          Arduino
VCC               3.3V
GND               GND
SDA               SDA
SCL                SCL

BMP280         Arduino
VCC               3.3V
GND               GND
SDA               SDA
SCL                SCL

APDS             Arduino
INT                 nezapojeno
SDA    -LS-     SDA
SCL    -LS-     SCL
VCC               3.3V
GND               GND
VL                  3.3V
APDS-9930, SCL a SDA je zapojeno do arduina přes Level Shifter, 5V nepřežije!

RXB6             Arduino
VCC               3.3V
GND               GND
DATA             Pin 2

LCD               Arduino
VCC               3.3V
GND               GND
CS                   podle schéma na Pin 10
RESET            podle schéma na Pin 8
D/C                 podle schéma na Pin 9
SDI/MOSI      podle schéma na Pin 51
SCK                podle schéma na Pin 52
LED                přes rezistor 100Ohm na Pin 44
SDO/MISO    nezapojeno

Zapojení LCD

Zapojení LCD

ESP8266
VCC               3.3V
CH_PD           3.3V
TX                  PIN19 (TX1)
RX                  PIN18 (RX1)
GND               GND
RESET           přes tlačítko na GND, občas se zasekne tak je třeba resetovat ESP

Někdo tvrdí že ESP8266 je odolné vůči 5V logice, ale pro jistotu je lepší zapojit také přes level shifter. Já to mám zapojené přímo, ale otázka je jak dlouho to ještě vydrží…

Indikační LEDky přes odpor 220 Ohm
Žlutá               Pin 42
Zelená             Pin 43

A konečně samotný kód, potřebné knihovny lze nalézt v odkazech. Moje upravené fonty jsou přiloženy.

Kód pro Arduino
Font Arial18
Font Arial34
Font Spec18

Na závěr ještě krátké ukázkové video jak se to celé chová v praxi:


Za projekt děkujeme!

Zbyšek Voda

Zbyšek Voda

Už nějaký čas se zajímám o věci kolem Internetu věcí a otevřeného hardware a software. Tak jsem se také v roce 2010 dostal k Arduinu, pro které dodnes programuji a taky píšu články o práci s ním. Baví mě vymýšlet, jak staré věci používat novým způsobem.
Zbyšek Voda

10 Comments on “Meteostanice ovládaná Arduinem

Pene
17.1.2017 at 17:44

Inspirativní.. Jen je škoda že to nic nedělá 🙂 Hodil bych si tam s tak suchým vzduchem zvlhčovač. Klidně obyčejný a spínal zásuvku. Ty dražší už mají vlastní čidla a není je potřeba štelovat. (Jenže kdo tomu má furt doplňovat vodu. Hmm nádrž, měření hladiny, a dopouštění přes čerpadlo další projekt. Náhradní řešení pořídit si akvárko, jenže kdo to má furt krmit. že by další projekt hlídat teplotu, krmeni, o2, co2. Určitě bych taky měřil CO2(hlavně v noci) a zapínal větrání, otevíral okno. Taky otevírat a zavírat hlavice na topení, nebo celý kotel. 😉 Lidi co jenom měří, sledují a logují teplotu asi nechápu :))))

Zbyšek Voda
Zbyšek Voda
17.1.2017 at 21:14

Někde se začít musí 🙂
A když už máte takovýto základ, tak se na tom další automatizace staví dobře.

Martin Zatloukal
20.10.2016 at 16:03

Díky.
Stavím meteostanici s termostatem.
Mrkněte na NEXTION display.Ušetříte s ním spoustu paměti v arduinu a dá se na něm dělat mnohem lepší grafika.

Michal Zelenka
3.11.2016 at 18:30

Tnto display jsem objevil před nedávnem, bohužel prodejce z Ebaye byl asi podvodník a display nedorazil. Čekám na vyřešení sporu a pak objednám znovu od někoho spolehlivějšího. Každopádně ten display tomu dá nový rozměr 🙂

Juro
11.7.2016 at 13:28

Veľmi pekný článok, veľmi pekná práca.
Robím práve jednoduchú automatizáciu primárne riadenú teplotou (vetranie + závlaha skleníka) + meteostanica pohromade.
Ešte by ma zaujímalo, či si použil cez 433 MHz aj nejaký iný vysielač (z Ebay?), ako senzory od Sencoru? BMP280 bol pripojený priamo na Arduino?

Majkl
22.8.2016 at 18:19

Na 433MHz zatim bezi stale jen vysilace Sencor. Dalsi chci dodat casem a uz vlastni konstrukce. A BMP280 je pripojeny primo k arduinu pres SDA a SCL piny

Roman
14.6.2016 at 11:54

Perfektní článek, inspirující, pustím se do něčeho podobného, ale zatím jsem v očekávání dílů. Děkuji.

Daniel Ráž
13.6.2016 at 10:22

Moc pěkný článek!

A díky za inspiraci (IoT ThingSpeak Monitor Widget) pro moje vlastní řešení meteostanice … 😉

detik
11.5.2016 at 16:04

Souhlasím, naprosto parádní čtení, přečetl jsem to jedním dechem. Už se těším až si otestuju hodiny reálného času s automatickým řízením. 🙂 Rovněž hledání nej. modulu 433Mhz hned jsem jeden objednal na hraní. Moje poklona za nápady spojené do hormady v jeden pěkný celek. Děkuji

Ondřej Douša
5.5.2016 at 8:57

Úplně jste mě ohromil a nadchnul. Krásný článek, děkuji za inspiraci a určitě nebudu sám, kdo bude čekat na další díl s informacemi, jak stavba pokračuje. Děkuji také za tipy na RF přijímače (to se bude hodit). V plánu mám něco podobného, jen chci využít protokolu zwave s více čidly a řídit tak kotel a bojler 🙂 zatím je vše v hlavě a rýsují se konkrétní řešení a možnosti (už teď vím, že čidla samotná si budu stavět na Arduino Uno a server na Raspberry Pi). Ještě jednou velké díky a hodně úspěchů s dalším testováním a psaním 🙂

Napsat komentář