chtěl jsem si na jedno Arduino připojit víc DHT22 senzorů a data odesílat přes UDP. Ve wiki sice máme návod na UDP bránu s DHT senzory ( https://www.vodnici.net/wiki/arduino-lan-shield-udp-gateway/), ale přidávání dalších DHT senzorů je trochu nepraktické.
Tak jsem na to šel z jiného konce úpravou firmware pro railduino od pana Sedláčka, které je mnohem univerzálnější, snadněji se definuje co je na jakém pinu atd. Výsledkem je tedy upravený FW railduina, který můžete použít na jakoukoliv Arduino desku.
Smazal jsem věci, které fungovaly jenom s dodatečným HW:
modbus komunikace přes dodatečný serial
nastavení IP, baudrate, sítě atd. přes dip switch
1wire input přes DS2438
HSSwitch a LSSwitch
Přidal jsem nějaké další věci:
čtení DHT senzorů
timer pro dotazovací cyklus pro digitální vstupy (kvůli dlouhodobě sepnutým vstupům jako jsou okenní kontakty). Samozřejmě kromě dotazovacího cyklu funguje i reportování každé změny stavu.
UDP příkazy (dotazy) na stavy vstupů a senzorů. Můžete se dotázat na stav jednotlivých vstupů, na skupiny vstupů (například všechny DHT senzory) i na všechny vstupy a senzory najednou. Pro ty, kteří nechtěji používat vestavěné timery (cyklické odesílání stavů vstupů a senzorů) a radši se chtějí na stav vstupů a senzorů ptát podle potřeby.
Nastavení na začátku skeče:
IP adresy a porty
identifikátor arduina (boardAddress)
Dotazovací cykly na digitální vstupy (cyklus čte vždy), na analogové vstupy (cyklus čte jen při změně) a DHT senzory (cyklus čte jen při změně).
Nastavení jednotlivých pinů. To je obrovská výhoda skeče pro railduino, že můžete velice jednoduše nastavit, kolik máte jakých vstupů / výstupů a na jakých jsou pinech. Konkrétně můžete nastavit:
digitální výstupy (do), na které můžete použít jak digitální piny tak i analogové piny (na mém Arduino Nano jsou to piny 14-21)
analogové výstupy (ao), na které můžete použít digitální piny s podporou PWM (u mě např. pin3)
analogové vstupy (ai), na které můžete použít analogové piny (u mě A0 - A7, nebo-li 14-21)
digitální vstupy (di), na které můžete použít jakékoliv digitální piny. Je zapojen interní pull-up rezistor, takže digitální vstupy se spínají proti zemi GND.
DHT senzory (dht), na které můžete použít jakékoliv digitální piny
2 led piny (na stav arduina a UDP komunikaci, u mě nezapojeno)
nastavení typu DHT senzoru
Použití:
Upozorňuji, že všechny vstupy a výstupy jdou přímo na Arduino, nemáte tam žádné optočleny na galvanické oddělení apodobně. Použití hlavně na senzory (DHT, senzory s napěťovým výstupem). Digitální výstupy používám na rozsvěcení signalizačních diod ve vypínačích, na spínání relé to není, protože chybí optočlen (proto jsem taky výstupy přejmenoval z "ro" na "do").
UDP komunikace v zásadě odpovídá modelu, který používá railduino, s několika drobnými změnami. Takže můžete po úpravě využít návody a šablony, které má pan Sedláček na svém webu ( http://www.sedtronic.cz):
název zařízení není "rail", ale "ardu" + identifikátor (viz výše)
digitální výstup "ro" přejmenován na "do"
přidány DHT senzory "dht"
odebrány 1 wire senzory "1W"
možnost dotazování na stav vstupů a senzorů
UDP syntax: signals: DHT sensor (temp°C humid%): ardu1 dht3 25.3 42.0 digital input state: ardu1 di1 1 analog input state (V): ardu1 ai1 0.797 commands: digital output on: ardu1 do12 on digital output off: ardu1 do5 off analog output: ardu1 ao1 180 digital input status: ardu1 di2 all digital inputs status: ardu1 di all analog inputs status: ardu1 ai all DHT sensors status: ardu1 dht all inputs and sensors: ardu1 all reset: ardu1 rst default scan cycles: digital input on change digital input cycle (always): 3600000 ms (1 hour) analog input cycle (if change): 5000 ms DHT sensors cycle (if change): 5000 ms
Upozorňuju, že jsem amatér a samouk. Pokud narazíte na nějakou šílenost, dejte vědět. Na github jsem to zatím nedával, možná až zjistím, jak se to dělá...
Riesim svoj projekt na ovladanie zavlahy / zahrady.
Ale narazil som na tieto 2 problemy, tak ma napadlo mozno si sa s tym stretol alebo by si vedel riesenie.
Problem c.1:
Ked zapnem napajanie arduina cez 9v zdroj, tak niekedy sa stane ze nenabieha LAN Shield (neblika vsetkymi diodami ako obycajne), nepomada ani ON/OFF pripadne ich musi byt viacej 4-5x.
Quick fix je stlacenie RESET a potom uz aj na dalsie zapnutie vacsinou nabehne.
Napadlo ma dat do kodu reset hned pri starte, ale tym by som to dostal do loopu, restart cez PIN vynuteny z Loxone (cez UDP) tiez nepojde kedze nenabieha ten LAN Shield
Problem c.2:
Pri nejakom vypadku napatia PINy / RELE co mam zopnute, ostanu zopnute v Loxone ale v Arduine po nabehnuti ostanu vypnute.
Ako to vyriesit? na urovni Arduino kodu / Loxone Config - pripadne ak to je v tom kode na ktoru cast sa pozriet.
jo, něco podobnýho jsem řešil / řeším. Arduino se u mě chovalo jinak při napájení přes USB a při napájení přes Vin (12V).
1) ethernet shield
můžeš zkusit dát do setuou nějakou delay (což u mě ze záhadného důvodu vedlo k vytuhnutí arduina) nebo něco takového:
Ethernet.begin(mac, ip);
if (Ethernet.hardwareStatus() == EthernetNoHardware) { dbgln("Ethernet shield was not found."); while (Ethernet.hardwareStatus() == EthernetNoHardware) { delay(1000); // do nothing, no point running without Ethernet hardware Ethernet.begin(mac, ip); } }
anebo to můžeš zkusit v kombinaci s vynuceným restartem buď přes pin (ten u mě moc nefungoval) nebo přes tu resetFunc(), co mám v kódu z railduina.
2) obnovení stavu relé
Arduino si stav relé nezapamatuje, o obnovení stavu to by se měl starat Loxone. Arduino by mohlo akorát po nastartování poslat zprávu o tom, že se nastartovalo (restartovalo). Tj. něco jako sendMsg("hello"); na konec setupu. A potom naprogramovat Loxone, aby při obdržení "hello" obnovil stav relé. Asi by šlo dát před každý virtuální výstup arduina nějakou (analogovou) paměť, která by si pamatovala stav relé a která by se spouštěla při obdržení "hello"
Anebo můžeš u virtuálního výstupu dát nějaký krátký interval opakování instrukce. Pokud ti nevadí, že Loxone bude tu instrukci neustále odesílat přes UDP.
2. to "hello" pri boote dobry napad tym Loxone zisti ze to naskocilo nanovo. Som to chcel riesit cez ping ale to ma nejake oneskorenia a na vypadok staci 1s a je vsetko OFF.
Len ako to nastavit v Loxone? odchytim na UDP , ukaze niekde online a dat BUTTON cez AND s tym stavom? to by asi slo 🙂
Jak to ma railduino riesene tieto stavy/citanie, alebo to tam nie je vyriesene nijako pri restarte? je pripadne niekde navod ako je to potom naparovane v Loxone?
2.1 to opakovanie instrukcie pri stave ON by islo asi cez modul "zdroj impulzov" ked je ON bude posielat kazdych 30s. Tlacitka u loxone maju "remanence" ta bateria, cize to drzi stav tlacitka.
Pripadne nejaky zapisovac/config ze si bude pamatat posledny stav do Arduina, ale to je zase viac programovania
drzi to vo vizualizacii zapnute po nabehnuti ale fyzicky nezopne to rele znova
Jasně, to dává smysl. Loxone odesílá UDP zprávu (instrukci) jenom při změně stavu (pokud není nadefinované opakování instrukce). To, že ve vizualizaci máš relé "stále zapnuté" znamená, že Loxone kdysi dávno (v době, kdy Arduino ještě nenabootovalo) odeslal UDP zprávu a teď předpokládá, že relé je sepnuté.
Omlouvám se, zapomněl jsem dát Arduinu čas na dokončení bootování...
V tom případě ten blok "zpoždění impulsu" je potřeba. Ale to zpoždění impulsu zkus dát PŘED analogovou paměť (mezi UDP Ready a Analog paměť), ne za ni.
Zároveň ten parametr "překročení časového limitu" u virt. vstupu můžeme klidně stáhnout na minimum (třeba 0,3s). "překročení časového limitu" by mělo být co nejmenší, abychom analog paměť zresetovali co nejdřív, protože jinak výstup analogové paměťi koliduje s instrukcemi z toho 2-tlačítka. Protahovat to na 10s není dobrý nápad.
Přiznám se, že ten tip jsem psal od stolu, v reálu jsem zatím nezkoušel (zkusím zítra).
Tak jsem to vyzkoušel. Taky mi to nefungovalo, nakonec jsem zkusil zrušit zaškrtnutí "použít jako digitální výstup. Pak vše funguje. Neptej se mě jak je to možné...
Zpoždění impulzu mám 5s, doba výstupního impulzu 1s.
Oprava k té analogové paměti. Správně to má být takto (všimni si, že reset je negovaný):
a vstup hello by měl být nastavený takto, aby fungoval jako "tlačítko" (s dvousekundovým stiskem)
Tu si to tiez nemal zapnute, teda som to skusal vzdy bez...
Mne ta "Analog pamet" preblikne na chvilu a vysle "1" ako ze to zopne ale VSTUP/VQ na to nijako nezareaguje, stale drzi zopnuty v loxone (na arduino je vypnuty, zrejme to neodosle znova UDP prikaz do Arduina)
Zasr**ný Loxone. No jo, takhle to dopadá, když se kombinuje stavová logika s impulzy, digitál s analogem....
Takže to zkusíme jinak. Tady je celé schéma. Analogovou paměť jsem úplně vyhodil a místo toho dal obyčejný AND (bacha, druhý vstup je negovaný). Tentokrát jsem to důkladně otestoval. Pro úplnost k čemu mi to slouží: je to fyzické tlačítko (Quido-31) na vypínání a zapínání TČ (samotné relé tepelného čerpadla na obrázku není, je to ta odbočka nahoru). Blok "vypínač" pro ovládání přes web. Pod fyzickým tlačítkem je signalizační dioda, připojená na Arduino ovládaná virtuálním UDP výstupem DO2. Virtuální vstup RST je signál, který Arduino vyšle, když se (re)startuje. Obnoví to stav diody v případě, že se Arduino z jakéhokoliv důvodu restartuje. Takhle to v LiveView vypadá, když je TČ zapnuté:
UDP vstup RST, nastavený tak, aby fungoval jako "virtuální tlačítko" s impulsem 0,3s. Nesmí být zaškrtnuto "použít jako digitální vstup", protože jinak bychom nemohli dělat ty kejkle s validací.
Zpoždění impulsu. Doba zpoždění 2s (ale fungovala mi i kratší doba 1s), abychom dali Arduinu čas na dokončení úvodního setupu. Doba výstupního impulsu krátká (0,3s).
UDP výstup DO2. Musí být nastaven jako digitální výstup, jinak mi to nefungovalo.
Tak vyzkoušej a dej vědět.
Jo a pro úplnost, tady je aktualizovaný skeč UDP brány pro Arduino:
Do setupu doplněna UDP zpráva o tom, že se Arduino (re)startovalo (ardu1 rst).
Oprava čtení DHT senzorů.
Inicializace ethernet shieldu: Arduino si počká, dokud není shield iniciovaný.
Tak bol som blizko so svojim riesenim ale tvoje je lepsie, menej ciar/prehladnejsie ale funguje rovnako. Ja mam oneskorenie na 6s , dlhsie mi to bootuje.
V kazdom pripade dik za spolupracu, zase sme o nieco dalej 🙂
Na UDP mam svoj kod co som uz zacal cca pred 2r (postupne doplnam zlepsujem), ale podstata je vlastne rovnaka.