Ú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