Forum
Zdravím,
prosím Vás potřeboval bych pomoct s úpravou kódu z Arduina na zprovoznění UDP vstupu pro Loxone. Při vysoké úrovni na pinu 7 odeslat UDP zprávu DI1ON.
Takto je to funkční, ale arduino odešle několik packetů a vstup problikne alespoň 3x.
Dále by nebyl funkční dlouhý stisk ani vícenásobný klik.
Jak řešíte tento problém?
Děkuji
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
EthernetUDP Udp;
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x5C, 0x18};
IPAddress ip(192,168,116,80);
unsigned int localport = 44444;
IPAddress remoteIP(192,168,116,100);
unsigned int remotePort = 44444;
void setup(){
int pinMode = (7, INPUT);
Serial.begin(9600);
Serial.println("****************");
Serial.println("Puerto Serial OK");
Ethernet.begin(mac,ip);
Serial.print("IP : ");
Serial.println(Ethernet.localIP());
Udp.begin(localport);
}
void loop(){
if (digitalRead(7) == HIGH) {
Udp.beginPacket(remoteIP, remotePort);
Udp.println("DI1ON");
delay(20);
Udp.endPacket();
}
Serial.println("Refresh");
}
Ahoj,
mě se to jeví jako problém "zakmitání" (bounce), kdy při stisknutí tlačítka nedojde k jednorázovému sepnutí kontaktu, ale k několikerému sepnutí a rozepnutí kontaktu (mechanické kmitání). Výsledek je takový, jako bychom stiskli tlačítko několikrát rychle za sebou (celý děj trvá až několik ms). Jev jako takový je vysvětlený např. zde: https://robotika.vosrk.cz/guide/arduino/lesson06/cs
Dá se řešit buď elektronicky přidáním kondenzátoru, nebo elegantně např. pomocí softwarové knihovny "Bounce": https://github.com/thomasfredericks/Bounce2
Zákmity jsem myslel taky že by to mohly být, ale ono to odešle strašně mockrát. V UDP monitoru to jede asi 4 sekundy a pořád to posílá tu informaci "DI1ON" (asi 100x)... protože to prád monitoruje ten pin 7
No moze to byt aj zakmitmi, ale ved pozri co je v slucke loop.
if (digitalRead(7) == HIGH)
Co znalena ze ked je high tak posli.
Vies kolko krat dokaze ta slucka prebehnut kym stalcis kratko tlacitko.
No asi 100x a MS to este tie 4s spravovava.
Musit si tam dat nejaky priznak, ze je stlacene a vtedy uz neposielat.
Testovat ci uz sa tlacitko pustilo a potom priznak resetnut.
V tom reset si kludne posli ten isty prikaz ale OFF a vies kedy sa stlacilo a kedy pustilo.
nieco na inspiraciu
https://www.instructables.com/id/How-to-use-a-Push-Button-Arduino-Tutorial/
Alebo aj s debounce (velkost XXX treba odskusat):
#define XXX 10
int cnt = 0;
loop {
bool status = (digitalRead(7) == HIGH);
cnt += status ? 1 : -1;
if(cnt == XXX && status) {
// todo send udp 'ON'
}
else if(cnt == 0 && !status) {
// todo send udp 'OFF'
}
if(cnt > 2*XXX) { cnt = 2*XXX; }
if(cnt < -2*XXX) { cnt = -2*XXX; }
}
Jo, to je skoro ono, ale ON a OFF se mi vrací zdvojeně nebo ztrojeně
#define XXX 10
int cnt = 0;
void setup() {
int pinMode = (3, INPUT);
Serial.begin(9600);
Serial.println("****************");
}
void loop() {
cnt += (digitalRead(3) == LOW) ? 1 : -1;
if(cnt == XXX) {
Serial.println("ON");
}
else if(cnt == 0) {
Serial.println("OFF");
}
if(cnt > 2*XXX) { cnt = 2*XXX; }
if(cnt < -2*XXX) { cnt = -2*XXX; }
}
Serial monitor:
OFF
OFF
ON
ON
OFF
OFF
ON
ON
OFF
OFF
ON
ON
OFF
OFF
ON
ON
OFF
@etniesdc Jasne, pretoze som pica. Upravim povodny prispevok, snad to uz bude ono.
@dusanmsk Yess, to je přeně ono. Moc díky. A ještě kdybych chtěl když tlačítko se bude držet, aby to posílalo ON třeba po 5s, bylo by to těžký?