Meteostanice – měření atmosferického tlaku, vlhkosti, teploty, intenzity světla a detekce srážek

Meteostanice – měření atmosferického tlaku, vlhkosti, teploty, intenzity světla a detekce srážek

You are here:
  • KB Home
  • Hardware
  • Meteostanice – měření atmosferického tlaku, vlhkosti, teploty, intenzity světla a detekce srážek
< Zpět

Úvod

A je zde pokračování seriálu o stavbě domácí meteostanice pro Loxone. Tentokráte přijde ke slovu opět Arduino a připravený projekt je velmi variabilní, takže bude jen na vás, jaké komponenty si pořídíte a co budete používat. Komunikace je realizována přes Modbus (RS485), ale bylo by určitě reálné udělat i jiné varianty.

Zdrojové kódy

http://jirin.deso.cz/WetatherStation_RS485/

Hardware

Pro čtení jsem opět využil Arduino Nano, ale je určitě možné využít i jiné moduly (Uno, Pro Mini etc.).

BH1750

Přesný 16 bitový modul pro měření intenzity světla v jednotkách luxů osazený obvodem BH1750FVI umožňuje měřit intenzitu v rozsahu 1 – 65535 lx. Komunikace probíhá přes I2C. Důležité jsou pinyA4 (SDA), A5 (SCL), dále je nutné modul napájet pomocí 3,3 či 5 V a na zem připojit zem, pin ADDR nechat nezapojený.

BME280

Tento senzor patří k dražším, ale co se týká měření atmosferického tlaku, tak je opravdu velmi přesný. Dále je z něj možné číst i vlhkost + teplotu, zde bohužel ale už moc neexceluje a kupříkladu měření teploty jsou běžně o 2 °C mimo (zahřívá se), což rozhodně není ideální. Připojení je realizováno přes sběrnici I2C. Zapojení je naprosto stejné jako u BH1750, stejné piny + napájení.

Je důležité také zmínit, že změřený tlak je absolutní a je nutné zadat v kódu nadmořskou výšku, aby byl přepočítán na hladinu moře.

DHTXX, použit DHT22

DHT je řada senzorů (DHT11, DHT21, DHT22), které velmi dobře měří teplotu a vlhkost, v tomto projektu slouží jako vykrytí hluchého místa BME280. Připojení je jednoduché, napájení VCC jde na 3,3 či 5 V, zem na zem a data na PIN D3. Pokud máte verzi, kdy je dodávám samotný senzor, je vhodné použít pull-up rezistor 4,7 kΩ mezi daty a napájením. U vyobrazené verze pull-up rezistor není nutný (je již na PCB).

DS18B20

Toto teplotní čidlo asi není potřeba představovat, je zde zařazeno jako „levnější“ alternativa k DHT22. Zapojení je stejné jako u každého jiného 1-Wire čidla s tím, že je nutné použít 10 kΩ pull-up rezistor. Pin pro připojení je D2.

Detekce srážek (raindrop sensor)

Přidávám ho jen pro zajímavost, chci si ozkoušet, jak moc dlouho vydrží. Jeho kvalita mě úplně neuchvátila, bohužel také nedisponuje vyhříváním. Senzor disponuje analogovým i digitálním výstupem, použit je pouze ten analogový a je zapojen na pin A0. Napájení VCC na 5 V, zem na zem.

TTL to RS485 předovník

Tento převodník nám zajistí komunikaci po RS485. Napájení je opět 5 V, zem je zem a dále pak RX na RX Arduina a TX na TX Arduina. Na kontakty A + B pak můžeme připojit Loxone Extension či TCP RS485 převodník.

Je důležité zmínit, že pokud je převodník připojen, není možné Arduino programovat! Využívá totiž sériové rozhraní, proto když budete projekt rozcházet, tak minimálně nezapojte pin RX či celý převodník zapojte, až bude modul oživen a ozkoušen.

Takto to vypadá na nahrubo zapojené v nepájivém poli:

Kde senzory pořídit?

https://www.aliexpress.com/wholesale?SearchText=arduino+nano
https://www.aliexpress.com/wholesale?SearchText=bme280+i2c
https://www.aliexpress.com/wholesale?SearchText=ds18b20
https://www.aliexpress.com/wholesale?SearchText=dht22 
https://www.aliexpress.com/wholesale?SearchText=raindrop+sensor 
https://www.aliexpress.com/wholesale?SearchText=RS485+uart+automatic

Konfigurace Arduino Sketche

Jak už jsem zmínil na začátku tento projekt je velmi variabilní a záleží, co budete chtít používat. Základní nastavení se provádí zde:

// Configuration of modules
#define USE_BH1750
#define USE_BME280
#define USE_DHT
#define USE_DS18B20
#define USE_RAINDROP_SENSOR

Pokud kupříkladu budete používat pouze BME280, vše ostatní zakomentujte:

// Configuration of modules
//#define USE_BH1750
#define USE_BME280
//#define USE_DHT
//#define USE_DS18B20
//#define USE_RAINDROP_SENSOR

Po zakomentování budou ze sketche komplet odstaněny věci týkající se neaktivních senzorů a hodnoty, které se k nim vztahují, budou vždy 0.

Dále přichází na řadu nastavení Modbus komunikace:

// Modbus config
#define MODBUS_ID 10
#define MODBUS_SPEED 19200
#define MODBUS_CONFIG SERIAL_8N1

Ve standardním nastavením je použita Modbus adresa 10, rychlost 19200 a 8 datových bitů, žádná bit parity a 1 stop bit. Další módy jsou popsány zde. Přednastavené možnosti byly zvoleny tak, aby fungovaly se zde hojně vyskytujícími se elektroměry ABB B23.

A poslední odstavec, který se vztahuje k nastavení nám umožní změnit nastavení pinů (což asi nebude potřeba), ale je zde určitě nutné zadat správnou nadmořskou výšku v metech nad mořem, aby bylo možné správně vypočítat relativní atmosferický tlak.

// Other config
#define ALTITUDE 340.0F         // Altitude [meters over sea level], needed for pressure conversion
#define BME280_I2C_ADDRESS 0x76 // Address of your BME280 sensor 0x76 or 0x77
#define DHT_PIN 3               // Pin where to connect DHTXX
#define DHT_TYPE DHT22          // Accepted values are "DHT11", "DHT22" (AM2302, AM2321), "DHT21" (AM2301)
#define DS18B20_PIN 2           // Pin where to connect DS18B20
#define RAINDROP_A_PIN A0       // Analogue pin for raindrop sensor

Zprovoznění modulu

Pro oživování modulu je vhodné provést odkomentování řádku:

// Debug
// Enable only when really needed otherwise it will mess up RS485 communication
#define DEBUG

Do vašeho Arduina nahrajte připravený sketch a sledujte na sérové konzoli, že je schopen číst data ze všech senzorů. V ideálním případě uvidíte něco jako:

Pokud bude vše v pořádku, blok DEBUG zase zakomentujte a připojte RS485 předník a pokračujte dále. Pokud data nebudou správná, zkontrolujte zapojení a další nastavení (kupříkladu adresa BME280 apod.).

Ozkoušení Modbus připojení

Tato část je víceméně volitelná, ale pokud máte k dispozici USB <=> RS485 převodník, tak ji doporučuji ozkoušet.

Zapojení je naprosto triviální – A na svorku A, B na svorku B. Pro ozkoušení také bude potřeba vhodný SW, za sebe mohu doporučit kupříkladu QModMaster.
V programu zvolte správný COM port a parametry, které jste vložili do Arduino kódu (standard 19200 8N1):

Dále zvolte připojení přes RTU a zadejte Modbus adresu (standard 10) a zkuste číst 16 vstupních registrů (0x04):

Pokud uvidíte něco podobného (mimochodem stejná data jako v předchozím případě s sériovou konzolou), tak máte vyhráno.

Modus komunikace

Nyní bych chtěl popsat, adresování dat pomocí Modbus, je k dispozici 16 registů, který každý povětšinou vrací 16ti bitové (unsigned) int hodnoty, jediná výjimka jsou 2 hodnoty, které se týkají atmosferického tlaku. Ty jsou kvůli zachování přesnosti přenášeny pomocí 2 16 bitových registrů a ve výsledku je nutné složit jednu 32bitovou unsigned int hodnotu. Zde je mapování:

#define ADDR_TEMP_BME280       0 //  int16_t
#define ADDR_TEMP_DHT          1 //  int16_t
#define ADDR_TEMP_DS18B20      2 //  int16_t
#define ADDR_HUM_BME280        3 // uint16_t
#define ADDR_HUM_DHT           4 // uint16_t
#define ADDR_HEAT_INDEX_BME280 5 //  int16_t
#define ADDR_HEAT_INDEX_DHT    6 //  int16_t
#define ADDR_DEW_POINT_BME280  7 //  int16_t
#define ADDR_DEW_POINT_DHT     8 //  int16_t
#define ADDR_LIGHT             9 // uint16_t
#define ADDR_RAIN_RAW         10 // uint16_t
#define ADDR_RAIN_CONV        11 // uint16_t
#define ADDR_PRESSURE_RAW     12 // uint32_t
#define ADDR_PRESSURE_CONV    14 // uint32_t

Za povšimnutí určitě stojí, že hodnoty, které mohou nabývat záporných hodnot (teploty) jsou přenášeny jako signed int, zbytek jako unsigned int – pozor na to při mapování hodnot v Loxonu.

Dále je také nutné poznamenat, že veškeré hodnoty, které obsahují desetinnou část (vše kromě srážek a intenzity světla) jsou vynásobeny 100 (jsou tedy přenášeny 2 desetinná místa) a je nutné provést korekci „100“ => „1“.

Předpokládám, že ± všechny hodnoty jsou jasné, co ale stojí za vysvětlení jsou 2 hodnoty týkající se srážek. Registr 10 vrací hodnotu v intervalu <0, 1023> a je to přímý vstup z analogového vstupu A0 a hodnota odpovídá 10bitovému DAC převodníku Arduina. Hodnota „0“ znamená 100% detekci srážek (senzor se koupe), naopak hodnota „1023“ indikuje naprosté sucho, takže 0% detekci srážek. Registr 11 vrací hodnoty uvedené v předchozí větě v procentech (provádí přemapování), výstupní hodnoty jsou z intervalu <0, 100>. Je tedy daleko logičtější využít právě tento registr, ale dal jsem možnost číst data z obou.

Loxone šablona

Zde přidávám Loxone šablony pro snadnou integraci to vašeho Loxone plánu.

Další možnosti vývoje

Projekt lze lehce portovat na zasílání dat po 1-Wire sběrnici či při použití ESP8266 není problém data posílat přes WiFi. Dále je možné přidat podporu dalších senzorů ;-).

Autor článku a projektu: Jiří Jaša, http://www.deso.cz

Poslední úprava článku December 04, 2018

8 thoughts on “Meteostanice – měření atmosferického tlaku, vlhkosti, teploty, intenzity světla a detekce srážek

  1. Čau.
    Díky za pokračování pěknýho návodu.
    Co jsem to tak posčítal, tak za všechny díly bych dal cca. 930Kč, což je super cena (v porovnání s orig. meteostanicí za 12tis…).
    Máš nějaký praktický zkušenosti (popř. tip) kam umístit venku všechny ty čidla (teplota/tlak/osvětlení)? Když je zavřeu někde do krabičky, tak nebudou fungovat, když je nechám přímo venku, tak asi nebudou mít dlouhý život. Samotný Arduino bude asi taky ideální mít taky venku na konzoli co.

    1. Ahoj, nemáš vůbec zač ;-).
      K tomu umístění a faktickému použití. Dal jsem to zde vše dohromady, ale použití určitých senzorů dohromady se i částečně vylučuje, takže já osobně budu tento projekt meteostanice rozdělovat na 2 části.
      První bude měřit tlak, teplotu a vlhkost. Tuto část je ideální uzavřít do něčeho takovéhoto: https://www.tme.eu/cz/details/box-sens-white/krabicky-pro-poplasna-zarizeni-a-cidla/supertronic/# a umístit ven pod okraj střechy (aby na to nepršelo) směrem na severní stranu (aby na to zase nesvítilo a nedocházelo k ohřívání). Ve výsledku se může použít asi libovolná krabice, ale je potřeba, aby k tomu byl přístup vzduchu.
      Dále přichází na řadu měření intenzity světla a srážek. Ty je naopak nutné umístit taky, aby na ně pršelo a svítilo. Mám na to koupenou následující IP67 krabičku: https://aukro.cz/montazni-vodotesny-box-krabicka-ip67-ii-6917508347. Dovnitř umístit ten BH1750 a nahoru pak ten senzor deště – dá se tam dostat vše.
      Tuto krabici pak mám v plánu nabastlit na ty senzory WH1080 které musí být také někde vysoko na střeše (aby na ně mohl foukat vítr ze všech stran).
      Ještě co se týká detekce srážek, tak mně se do rukou dostal nový detektor od Veluxu (za krásných 500 Kč), který má i vyhřívání a funguje rovnou na 24 V. Je to daleko kvalitnější varianta než ten levný senzor z Aliexpressu, který ale určitě taky nějakou chvíli poslouží.

  2. Díky moc za návod. Modbus komunikaci jsem odzkoušel v QModMasteru a OK.
    Bohužel se mi zatím nedaří napojení na Loxone přes USR-TCP232-410s převodník.
    Různě jsem zkoušel a nastavoval, ale zatím bez úspěchu.
    Existuje nějaký soft, kterým bych mohl v PC zkusit napojení na ten ModbusServer USR-TCP232-410s ?
    Moje nynější nastavení:
    Miniserver: http://cloud1.zoolz.co.uk/s-vbYKijps
    HMI: http://cloud1.zoolz.co.uk/s-Y4I55XlQ
    USR_1: http://cloud1.zoolz.co.uk/s-kM5NwvAM
    USR2_: http://cloud1.zoolz.co.uk/s-Kqip3tPv
    Třeba něco přehlížím 🙂
    Díky moc za rady!

    1. Nastavení vypadá na první pohled dobře, na ozkoušení té komunikace přes TCP doporučím SW ModbusMaster ale stejně tak to umí i ten QModMaster, který ti na to vřele doporučím. Jen se místo RTU dáš TCP, malá ukázka.

      1. Díky za pomoc. Konečně jsem to rozjel. Protože mi to fungovalo jen s tím QModMasterem, tak jsem nevěděl, jestli dělám chybu v nastavení převodníku USR-TCP232-410s nebo až v Loxone.
        Šel jsem na to tedy postupně, třeba to někomu pomůže..
        1) Vycházel jsem z toho, že Arduino vysílá data korektně (ověřeno v QModMasterem).
        2) Nainstaloval jsem si SW ModbusMaster a ModbusSlave (odkazy od jirin.sv výše). 3) Na PC jsem si spustil ModbusSlave, zvolil RTU, nastavil přenos a použil USB RS485 převodník, který jsem napojil na vstup USR-TCP232-410s převodníku.
        4) TCP výstup USR-TCP232-410s převodníku jsem připojil k PC, spustil jsem QModMaster (nebo ModbusMaster), nastavil TCP a odzkoušel spojení.
        5) Tato komunikace přes USR-TCP232-410s převodník fungovala, tak jsem si ověřil, že mám správně nakonfigurovaný převodník a chybu mám v nastavení v Loxone.
        6) Po kratším bádání jsem zjistil, že jsem korektně nenastavil IO adresy v Loxone. Nyní už všechno funguje tak, jak má.
        Níže přikládám příklad zapojení výše uvedeného návodu 1) až 5).
        http://cloud1.zoolz.co.uk/s-2uNPkxzV

  3. ahoj,
    díky za perfektní návod, narazil jsem ale na jeden problém, se kterým si nevím rady:
    pokud startuji modbus s parametry
    slave.begin(MODBUS_SPEED, MODBUS_CONFIG);
    tak mi komunikace nefunguje, pokud zadám jen
    slave.begin(MODBUS_SPEED);
    tak běží vše správně. Potřeboval bych ale nastavit MODBUS_CONFIG SERIAL_8E1
    Pokud má kdokoli nějáky nápad, proč to nefunguje, budu vděčný.
    Díky!

  4. vyřešeno- v aktuální knihovně na webu bylo toto nastavení zakomentované, proto šlo konfigurovat jen rychlost komunikace a nic víc.
    Momentálně už vše běží, jak má, komunikace Arduino-Loxone funguje

Leave a Reply

Your email address will not be published. Required fields are marked *