Eigentlich ist es ein ganz simples Projekt. Bringt mich jedoch zur Verzweiflung.
Arduino Uno + Ethernet Shield
Beim drücken eines von 5 (Wand-)Tastern, wird eine UDP Nachricht gesendet.
Die Taster hängen an +5V, die Inputs am Arduino habe ich (sogar) mit 1k Pulldown Widerständen mit GND verbunden.
Natürlich habe ich mich auch schlau gemacht, welche Inputs ich bei Verwendung des Ethernet Shields nicht verwenden darf. Das ist z.B. Pin 4.
Also nutze ich die Pins 2,3,5,6 und 7. Laut Schaltplan und Sichtprüfung haben diese am Ethernet Shield auch keine Verbindung.
Soweit funktioniert auch alles.
ABER: immer wieder, mal alle paar Stunden oder nur 1 Mal am Tag wird ein Tastendruck registriert, obwohl nichts betätigt wurde.
Es ist auch nicht immer der gleiche Input.
Wie gesagt, es sind 1k Pulldown-Widerstände drin, und wenn ich mit dem Multimeter messe, habe ich auch wunderschöne 0,00V und 5V bei Tastendruck.
Schaltplan und Sketch im Anhang.
Wäre toll, wenn mir jemand weiter helfen könnte. Ich bin mit meinem Latein am Ende.
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 };
IPAddress ip(192, 168, 0, 110);
IPAddress dnServer(192, 168, 0, 1);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress ip_dest(192, 168, 0, 21);
IPAddress ip_dest_debug(192, 168, 0, 100);
unsigned int localPort = 8888;
unsigned int destPort = 8001;
char message[4]=" ";
char b[2];
String str;
unsigned long timer_start = 0;
unsigned long timer_dur = 0;
int pressbutton = 0;
EthernetUDP Udp;
void setup() {
// unveränderten Teil der Nachticht festlegen
message[0]='a';
message[1]='1';
message[2]='\0';
message[3]='\0';
// Pins als Inputs definieren
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
// Netzwerk starten
Ethernet.begin(mac, ip, dnServer, gateway, subnet);
delay(1000);
Udp.begin(localPort);
}
void loop() {
// Ist einer der Inputs HIGH?
if (digitalRead(2) == HIGH) {
pressbutton=2;
} else if(digitalRead(3) == HIGH) {
pressbutton=3;
} else if(digitalRead(5) == HIGH) {
pressbutton=5;
} else if(digitalRead(6) == HIGH) {
pressbutton=6;
} else if(digitalRead(7) == HIGH) {
pressbutton=7;
}
if (pressbutton!=0) {
// zur Messung der Zeit, die der Taster gedrück wurde
timer_start = millis();
// 20ms warten zum entprellen
delay(20);
// warten, bis der Taster nicht mehr gedrückt wurde, oder 1500ms vergangen sind
do {
timer_dur = millis() - timer_start;
delay(1);
} while(digitalRead(pressbutton)==HIGH && timer_dur<=1500);
// länger als 1500ms? Dann "l" für "long" in die Nachricht einfügen, ansonsten "s" für "short"
if(timer_dur >= 1500) {
message[2] = 'l';
} else {
message[2] = 's';
}
// letzter Teil der Nachricht - ASCII Code für die Zahl 2,3,5,6 oder 7
message[3] = (48+pressbutton);
// UDP Nachricht senden
Udp.beginPacket(ip_dest, destPort);
Udp.write(message,4);
Udp.endPacket();
// wenn der Taster noch immer gedrückt ist (>1500ms), warten, bis er losgelassen wurde
do {
delay(1);
} while(digitalRead(pressbutton)==HIGH);
delay(20);
// pushbutton wieder auf 0 setzen
pressbutton=0;
}
}
UDP_button_v4_nodebug.ino (2.17 KB)