Browsed by
Tag: DS18B20

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

Ú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

Arduino 1-Wire UDP Gateway – alternativa k Loxone 1-Wire Extension

Arduino 1-Wire UDP Gateway – alternativa k Loxone 1-Wire Extension

Rád bych se vámi podělil o další projekt, na kterém jsem v poslední době pracoval. Jedná se o Arduino sketch, který je schopen pracovat s DS18(B)2X, DS2401 a DS2438 senzory, číst z nich data a posílat je po UDP jako multicast či unicast. Mezi výhody toho řešení patří to, že je možné používat více 1-Wire sběrnic a předejít tak případným problémům s kabeláží apod. Dále je možné určité sběrnice priorizovat (ideální pro využití s iButtony či NFC).

Zdrojové kódy

http://jirin.deso.cz/1-Wire_UDP_Gateway/

Video tutoriál

Potřebný hardware

Pro jeho použití budete potřebovat Arduino UNO či MEGA a k tomu Ethernet shield – mám ozkoušený W5100, který funguje výborně a lze jej sehnat i v 802.3af verzi.

Arduino UNO s W5100

Odkazy na zakoupení:
https://www.aliexpress.com/wholesale?SearchText=arduino+uno+mega328p
https://www.aliexpress.com/wholesale?SearchText=arduino+mega+2560
https://www.aliexpress.com/wholesale?SearchText=arduino+uno+w5100

Zapojení

Pro každou 1-Wire sběrnici je bezpodmínečně nutné použít pull-up rezistory 4,7 kΩ a zapojení je následující:

Ještě přidávám pinout pro DS18B20 samotný:

Hlavně si nepoplést zem a napájení – nedopádá to úplně nejlépe.

Konfigurace 1-Wire sběrnic

Při nastavování lze vydefinovat libovolný počet sběrnic. U každé z nich lze také říct, jestli je prioritní nebo ne – prioritní jsou určené pro čtení iButtonů, kdy je potřeba okamžitá reakce.

Základní nastavení (použita pouze sběrnice na pinu D5 a není prioritní):

ONE_WIRE_BUS ONE_WIRE_BUSES[] = {{5, false},
                                 //{6, false},
                                 //{7, false},
                                 //{8, false},
                                 //{9, false},
};

Pokud chcete ale použít sběrnic více, stačí řádky odkomentovat případně si přidat další. Kupříkladu:

ONE_WIRE_BUS ONE_WIRE_BUSES[] = {{5, false},
                                 {6, false},
                                 {7, false},
                                 {8, false},
                                 {9, true},
};

Kdy je port na pinu D9 prioritní, takže na něm mám třeba čtečku, D5–D8 jsou pak další obyčejné sběrnice.

A jako poslední poznámka, není možné používat piny D4, D10, D11, D12 a D13 jelikož je využívá W5100 (Ethernet shield).

Získávání dat v Loxone

Loxone dostává pakety ve tvaru:
DS2401 – „1W 01000065A43BBE67
DS18(B)2X – „1W 2861641273EA057D TEMP 24187“
DS2438 – „1W 26CABA16020000BD TEMP 23656 VAD 2220 VDD 4700 VSENS 250“
Všechny teploty a voltáže jsou posílány jako celá čísla, která vznikla násobením původní hodnoty číslem 1000.

Dále je možné se potkat s pakety:
1W 28616412704EF007 ERROR“
1W 2861641273E55AFF DETECTED“
Tyto jsou posílány v případě chyby či detekce nového 1-Wire zařízení.

V Loxone je potřeba vytvořit digitální UDP vstup pro daný port:

Dále je nutné vytvořit příkaz pro každé 1-Wire zařízení.

Pro DS2401 je to digitální vstup:

Pro DS18(B)2X je to analogový vstup a je nutné použít korekci (vstupní hodnota 2: „1000“, zobrazená hodnota 2: „1“):

A v případě DS2438 je nutné vytvořit 4 analogové virtuální vstupy, stejně jako v předchozím případě je nutné použít korekci („1000“ => „1“):

Pro instalaci do rozvaděče doporučuji sehnat uchycení na DIN lištu, něco ve stylu:

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