Forum

Forum

Univerzální UDP brá...
 
Notifications
Clear all

Univerzální UDP brána

30 Posts
3 Users
3 Likes
7,190 Views
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

Ahoj,

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á...

No a tady to je:


   
L, jzaruba and Georgio reacted
Quote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

Ahoj,

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.

 

dik

 


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

Zdar,

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"


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

ad 2)

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.


   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

diki za odpoved...

 

1. Ten ethernet skusim doplnit uvidime co to spravi.

Reset mi cez tie piny tiez nejde , ci som to dal na 

pinMode(RESET, OUTPUT) alebo pinMode(RESET, INPUT);

digitalWrite(RESET, HIGH) alebo digitalWrite(RESET, LOW);

stale sa to pri zapojeni kabla resttartovalo dokola...este sa s tym pohram

skusal som podla tohto ale bez LED https://www.instructables.com/id/two-ways-to-reset-arduino-in-software/

 

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

 

dik


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

Ahoj

ještě k resetu:

https://www.codeproject.com/Articles/1012319/Arduino-Software-Reset

 

Co se týče opakovaného odeslání instrukce na UDP virtuální výstup po restartu Arduina, máš dvě možnosti.

1) pokud chceš, aby Loxone posílal opakovanou instrukci při restartu Arduina, udělej to přes to "hello" odesílané arduinem přři restartu:

1

2) pokud ti stačí periodické znovuodesílání instrukce, pak si nastav ve virtuálním výstupu:

5

Nevýhodou je, že instrulkce se neodešle hned po restartu arduina, ale až po nějaké periodě.

 

Jak to má řešené Raulduino, nevím (myslím, že nijak). Můžeš se podívat na Lox config k railduinu:

https://sedtronic.eu/cs/railduino/4-22-railduino-20.html#/3-typ_rele-12x_klas_rele_max_7a

(sekce ke stažení)

Koukám, že pan Sedláček udělal nový web. Gratuluju, web je super!

 


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

Oprava k té analogové paměti. Správně to má být takto (všimni si, že reset je negovaný):

3

a vstup hello by měl být nastavený takto, aby fungoval jako "tlačítko" (s dvousekundovým stiskem)

4

   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

Diki za tip, pridal som si aj pocitadlo restartov / statistika aby som videl co sa dialo

BTW: ten preklad Loxone je pekny mix SK/CZ pozeram 😀

vod1
vod

Pri 2s nestiha Arduino nabootovat, tak som to zvysil na 10s , drzi to vo vizualizacii zapnute po nabehnuti ale fyzicky nezopne to rele znova

vod2

Napadlo ma pridat modul oneskorenie impulzu ale ani tak to nezopne

vod3

 


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

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).

 


   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

Prehodil som to ale aj ked posle Analogova pamat impulz tak to nereaguje.

lox3

Treba po nabootovani (s oneskorenim) vyvolat reset Tlacitka, ine riesenie ma nenapada

Ak je Vypinac zopnuty, UDP Ready cez AND posle Tlacitko do RESETu a zaroven posle impulz "oneskoreniu impulzu" a ten to tlacitko znova zapne 🙂

Pripadne napada ta nejake "elegantnejsie" riesenie? 

lox4

   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

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é...

 

7
6

Zpoždění impulzu mám 5s, doba výstupního impulzu 1s.

 

EDIT: Takhle to nefunguje.


   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 
Posted by: budulinek

Oprava k té analogové paměti. Správně to má být takto (všimni si, že reset je negovaný):

3

a vstup hello by měl být nastavený takto, aby fungoval jako "tlačítko" (s dvousekundovým stiskem)

4

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)

Funguje mi len ten sposob s "resetom tlacitka"


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
Topic starter  

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é:

8

 

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í.

9

 

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).

10

 

UDP výstup DO2. Musí být nastaven jako digitální výstup, jinak mi to nefungovalo.

11

 

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ý.

   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

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 🙂

lax5

Na UDP mam svoj kod co som uz zacal cca pred 2r (postupne doplnam zlepsujem), ale podstata je vlastne rovnaka.

https://www.vodnici.net/wiki/arduino-lan-shield-udp-gateway/


   
ReplyQuote
(@killeriq)
Prominent Member
Joined: 7 years ago
Posts: 810
 

Prehodil som si UDP prikazy do zrozumitelnejsej formy....

Ale po prvom ON/OFF mi to spravi to ze aj na ON mi pridava extra znak do poctu 7 na vsetky UDP prikazy posielane na Arduino

Zapnutie (6 znakov): R01-ON

Vypnutie (7 znakov): R01-OFF (ak to dam 6 znakov R01-OF, tak to funguje ok)

Netusis ako to obist/vyriesit pripadne co by to mohlo sposobovat? dik

lox11

   
ReplyQuote
Page 1 / 2
Share: