"Geisterinputs" Ich werde noch wahnsinnig!

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)

Hallo,
"1k Pulldown"

mal mit 10k versuchen?

Gruß und Glück
Andreas
P.S. den Sketch bitte mit CodeTags (Editor </>) hier ins Forum. Niemand hat wirklich Lust sich Müll auf den
Rechner zu laden.

:frowning: und damit das hier keiner in den falschen Hals bekommt... Müll bezieht sich auf Anhang, nicht auf Sketch
Inhalte

Wie lange sind die Leitungen von den Tastern zum Arduino? Ein paar Meter oder mehr?

Liegen die Leitungen eventuell nahe und parallel zu anderen stromführenden Leitungen (vielleicht sogar Netzspannung)?

Falls dem so ist, könnte es sein, dass du dir trotz des 1k Ohm Pulldown Störungen einfängst.

Ich verwende bei längeren Leitungen gerne Optokoppler (unter "lang" verstehe ich in diesem Zusammenhang: mehr als 1 Meter).

SkobyMobil:
"1k Pulldown"

mal mit 10k versuchen?

Aber bei 10k wäre es ja dann sogar wahrscheinlicher, dass so ein Fehler auftaucht. Deshalb habe ich auch geschrieben "... sogar 1k".

SkobyMobil:
P.S. den Sketch bitte mit CodeTags (Editor </>) hier ins Forum.

Ist erledigt.

uxomm:
Wie lange sind die Leitungen von den Tastern zum Arduino? Ein paar Meter oder mehr?

Liegen die Leitungen eventuell nahe und parallel zu anderen stromführenden Leitungen (vielleicht sogar Netzspannung)?

Falls dem so ist, könnte es sein, dass du dir trotz des 1k Ohm Pulldown Störungen einfängst.

Ja, dem ist in der Tat so.
Garage mit Licht und Torantrieb. Leitungslänge bis zu 9m.
Das war natürlich auch sofort mein erste Gedanke.

Habe ich aber schon getestet und "ganz wild" das Licht schnell hintereinander ein und aus geschaltet und das Garagentor laufen lassen.
Da tut sich genau gar nichts in der Signalleitung zum Arduino (CAT.7 Verlegekabel)

uxomm:
Ich verwende bei längeren Leitungen (lang ist mehr als 1 Meter) gerne Optokoppler.

Inwiefern würden hier Optokoppler helfen?
Ob eine evtl. induzierte Spannung nun den Optokoppler auslöst und dieser dann den Arduino-Eingang, oder den Arduino Eingang direkt, wäre doch das gleiche, oder?

Könnte es einen Vorteil bringen, wenn ich die Logik der Schalter invertiere?
Also die Eingänge am Arduino mit PullUPs auf 5V/High, und die Schalter ziehen dann auf LOW?

Naja, bei einem Optokoppler kannst du die Stromkreise eben entkoppeln, wenn du möchtest (wie der Name ja schon andeutet) :slight_smile:
Ausserdem müssen da zumindest ein paar Miliampere fließen, damit die LED im Optokoppler leuchtet und ein Signal übertragen wird. Ich bin damit bis jetzt ganz gut gefahren.
Bei langen Leitungen fängst du dir immer "Netzbrumm" etc. ein, auch wenn es eine geschirmte Leitung ist.

Bin aber nicht "vom Fach" und kann dir deshalb keine fundierte Begründung liefern.
Das können kompetentere Leute hier sicher besser :slight_smile:

Das Thema Fake-Input habe ich auch gerade durch, die traten sogar bei nur 50cm Leitung auf. Ursache war eine Membranpumpe (230V/800W) in 50cm Entfernung, für "Staubsauger-Deo" in der Staubsauger-Steuerung für eine Tankstelle/Autowaschanlage.

Ich benutze jetzt Reed-Relais vom Input-Pin nach Masse (bei aktiviertem internen PullUp) - die sind billiger und robuster als Optokoppler. Zusätzlich habe ich die Software-Entprellung so dimensioniert, dass mind. ein Tastendruck von 0,3s notwendig ist, damit überhaupt etwas passiert.

Seitdem sind die Probleme behoben.

Vielleicht hilft auch mein Beitrag zum Thema Optokoppler und (interner) Pullupwiderstand weiter...

http://forum.arduino.cc/index.php?topic=470501.0

Fang die Geisterinputs doch mal ab und schalte nur, wenn der Taster länger als 0,2s gedrückt ist, ohne weitere Hardware. So wie es qualisat gelöst hat.

Wenn du den Fehler weiter eingrenzen willst, messe die Länge jeden Inputs und protokolliere das seriell. Dann sieht man, ob Spitzen oder länger. Könnte ja auch das Kabel mechanisch beschädigt sein und irgendwie bewegt werden (Ratte?).
Oder Du legst Taster still und suchst so den Störenfried.

Wie meine Vorredner dir schon mitgeteilt haben, mit 8 m. Kabel funktioniert das so einfach nicht.
Du kannst es mit Optokopplern lösen und solltest aber die Steuerspannung höher als 5 Volt wählen, damit du eine bessere Störsicherheit bekommst.

Was auch funktioniert, du verwendest einen eigenen Controller für die Tasten und überträgst die Information per serieller (RS232) Datenleitung oder du verwendest I2C mit einem Portexpander (PCF8574) und 2 zusätzlichen Portextendern (P82B715). Das funktioniert bei mir über 20 m. schon einige Jahre.

Natürlich gibt es sicher noch mehr Möglichkeiten, aber das sind erst mal die "einfachsten".

Hallo,
mein Widerstand hat Dir ja nicht gefallen…
Das hier ist alles "Rate mal mit Rosental". Ohne vernünftiges Messquipment
wird sich der Fehler nicht lokalisieren lassen.
Aber Deinen Sketch könntest Du "sicherer" machen. Das Entprellen würde ich
über eine einfache Hardware-Schaltung machen.
millis() und delay() sind immer eine fragwürdige Kombination.
Dann würde ich mal über Variablen Fehler abfangen, damit Du sehen kannst was-
wo- denn passiert.
Aber was viel wichtiger ist, von den Tastern ein eindeutiges Signal senden.
"Taster drücken" ist kein eindeutiges Signal. Ein eindeutiges Signal könntest
Du z.B, mit einem N555 oder einem RC-Glied erzeugen.
Gruß und Spaß
Andreas
P.S. hast Du die Abschirmung des Kabel auf GND gelegt? Mal versucht einen
kleinen Kondensator da mit rein zu nehmen?

Ich würde es mal mit Pullup anstatt Pulldown versuchen..

manchmal liest man auch von 1K in serie für solche Störungen.. damit kenn ich mich aber nicht aus.

SkobyMobil:
...mein Widerstand hat Dir ja nicht gefallen…

Mir würde ein 10k an der Stelle auch nicht gefallen.
dadurch wird die Störanfälligkeit noch größer.

Hier heißt es "je kleiner, je besser". :wink:

Schuppeste:
Ich würde es mal mit Pullup anstatt Pulldown versuchen..

manchmal liest man auch von 1K in serie für solche Störungen.. damit kenn ich mich aber nicht aus.

Der Widerstand in Serie und ein Kondensator gegen GND ist quasi eine "Hardware Entprellen" und könnte helfen. Dennoch sind 8 m Kabel hier nicht angebracht.

Hallo,
na- dann haben wir ja eine Fehlerquelle weniger.

Fakt ist- sein StörSignal kann theoretisch auch mit seinen Taster erzeugt
werden- und das ist falsch! Das darf nicht sein…

Ich würde mich um diesen Dreck auf der Leitung nicht kümmern. Mit den Tastern
würde ich einen Aktor (Relais, Transistor, LED, was weiß ich) schalten der, erst bei einer bestimmten Stromstärke das Signal weitergibt.
Gruß und Spaß
Andreas

P.S.
"Dennoch sind 8 m Kabel hier nicht angebracht."

Die sind nicht angebracht- sondern vorgegeben. Und es ist völlig egal wie lang die sind-
am Arduino muß- ein eindeutiges Signal ankommen.

Bluebrain:
Garage mit Licht und Torantrieb. Leitungslänge bis zu 9m.

Wie meinen? Die Taster sind mit Leitungslänge bis zu neun Meter am Arduino angeschlossen?
Und zusätzlich befinden sich lange Leitungen mit 230 Volt Netzspannung im Raum?

Sowohl Deine Neun-Meter-Anschlussleitungen als auch Deine langen Netzleitungen sind "Antennen" für Funksignale eines breiten Spektrums.

Und ein "Funksender" erster Güte ist ein "Blitzeinschlag.

Bei neun Meter langen Antennen dürfte Deine Installation noch starke Gewitter in bis zu dreißig Kilimetern Entfernung als Fehlimpulse auf der Tasterleitung aufnehmen. Grob geschätzt.

Sind in der fraglichen Zeit, wenn Du Fehlimpulse bekommst, eventuell Gewitter in der Nähe?

Schaue im Zweifelsfall mal auf ein Bild vom "Wetterradar" oder "Regenradar", darauf kann man Gewitterzellen eigentlich ganz gut erkennen. Und so wie Du Deine langen Leitungen installiert hast, sind es wohl prima Hochfrequenzantennen, die Blitzeinschläge noch in über zehn Kilimetern Entfernung registrieren und mit einem falschen Pegel an DeinemArduino signalisieren.

Deine Schaltung hat wegen der langen Leitungen keine "elektromagnetische Verträglichkeit". Als Herstellereines Produkts würde das ein Vertriebsverbot für Dein Produkt bedeuten, weil Du kein CE-Kennzeichen darauf anbringen dürftest, wenn sich das Gerät durch weit entfernte Blitzeinschläge von Gewittern bereits stören läßt und Fehlfunktionen auftreten.

SkobyMobil:
"Dennoch sind 8 m Kabel hier nicht angebracht."

Die sind nicht angebracht- sondern vorgegeben. Und es ist völlig egal wie lang die sind-
am Arduino muß- ein eindeutiges Signal ankommen.

Und das bezieht sich einzig und allein auf die Art wie der TO diese Kabel an den Arduino angeschlossen hat, nichts weiter.

Hallo,
red´ ich hier denn gegen Wände...
ich gehe mal davon aus, das der TO wohl in der Lage ist- am Arduino einen Taster richtig anzuschliessen.
Es- spielt- keine- Rolle- welche Länge die Steuerleitung hat.

Es muss- dafür gesorgt werden, das ein einfandfrei zu verarbeitendes Signal am Arduino ankommt.
DAS- ist nicht gegeben! Punkt!

In Deinem Haus befinden sich auch Leitungen, die jurs seine Blitze empfangen... funktionieren tut aber alles.
Ist das nicht merkwürdig?
Gruß und Spaß
Andreas

SkobyMobil:
Es muss- dafür gesorgt werden, das ein einfandfrei zu verarbeitendes Signal am Arduino ankommt.
DAS- ist nicht gegeben! Punkt!

Ja, und eine bewährte Schaltung dafür bei "langen Button-Zuleitungen" ist diese Schaltung hier mit Verwendung eines RC-Glieds als "Tiefpassfilter".

Die Diode in dieser Schaltung kann weggelassen werden, sie ist für die Funktion nicht entscheidend.

Entscheidend sind der Pull-Up Widerstand R1, der den Kondensator C als Pufferspeicher auflädt und der Begrenzungswiderstand R2, der den Lade-/Entladestrom des Kondensators bremst und damit dem übermäßigen Kontaktverschleiß vorbeugt.

Dimensionierung beispielsweise:

  • R1=R2=1000 Ohm
    -Kondensator C=1µF
  • Diode ==> nicht verwenden, einfach weglassen

Dann sollte der Schalter auch mit Zehnmeter-Kabel einwandfrei funktionieren, wenn keine größeren Störquellen in der Nähe sind, beispielseise Vorrichtungen zum "Schalten induktiver Lasten mit mechanischen Relais oder mechanischen Schaltern.

SkobyMobil:
Hallo,
red´ ich hier denn gegen Wände...
ich gehe mal davon aus, das der TO wohl in der Lage ist- am Arduino einen Taster richtig anzuschliessen.
Es- spielt- keine- Rolle- welche Länge die Steuerleitung hat.

Es muss- dafür gesorgt werden, das ein einfandfrei zu verarbeitendes Signal am Arduino ankommt.
DAS- ist nicht gegeben! Punkt!

In Deinem Haus befinden sich auch Leitungen, die jurs seine Blitze empfangen... funktionieren tut aber alles.
Ist das nicht merkwürdig?
Gruß und Spaß
Andreas

es spielt halt sehr wohl eine Rolle wie lange die Leitung ist, da sich einige andere Parameter nicht ohne weiteres ändern lassen. zB die 5V sind doch recht schwer umzustricken. Leider scheint es so, das auch die 9m Leitungslänge sich nicht ändern lassen. Abschirmung alleine (CAT7-Kabel) ist wie ein Reifen mit Zulassung 290kmh am 60PS Diesel. Der wird dadurch nicht schneller. Genauso kann eine solche Abschirmung keine Einstreuungen beseitigen nur durch ihre blosse Anwesenheit.

Wo genau das Problem dann liegt, ist mit Homemethoden garnicht mehr erfassbar. Da könnte durchaus schon ein Rundsteuersignal der Energieversorger eine Schuld haben. Aber auch ganz banal eine Waschmaschine, deren Motoren werden heute meist per Frequenzumrichter geregelt und die können böse stören.

Vieleicht ist auch nur die Erdung des CAT7 Kabels schuld. Falsch geerdet und man hat statt Abschirmung eine Erdschleife die genau das Gegenteil macht und Störungen eher noch verstärkt. Oder garnicht geerdet (wo erdet man den die 5V DC eigentlich) wirkt die Abschirmung nicht abschirmend sondern als Antenne. Oder man verbindet es mit GND und schleift so alles was die Abschirmung sich einfängt ins 5V Netz ein.

Also könnte schon der Kabeltyp die Ursache sein...könnte...zum genauen Bestimmen müsste man viel Messequipment reinhängen und Langzeitmessung machen.

Vorschlagen würde ich jetzt als erstes:
Normales Klingelkabel nehmen. Abschirmung in dem Fall Kontraproduktiv. Kondensatoren mindestens 100nF, 470nF sogar besser gegen Störimpulse, 30ms Entprellung mindestens, 20ms wäre Netzfrequenz, man sollte deutlich über den 50Hz Netzfrequenz bleiben.. die 1KOhm Widerstand sind in jedem Fall ausreichend. Um einen Impuls von 5V mit mehr als 5mA Stromstärke zu erzeugen muss man schon richtig gut einstrahlen. Immerhin wären das 25mW Leistung. Mehr Stromfluss bringt da wenig, weil ja dein Eingangsstrom am Arduino nur 1mA beträgt. Diese Empfindlichkeit bleibt auch mit Pullup erhalten.

Ob man die GND erdet oder sauber erdfrei hält kann beides richtig oder falsch sein. Das würde ich durch Austesten probieren. Wenn wirklich oft fehlfunktionen auftauchen, also einmal Täglich oder mehr, ist es ja nach 2-3 Tagen als sicher anzusehen, das die Massnahme Erfolg hatte.

Nicht zu viel verändern auf einmal. Hier ist geduld gefragt. Vieleicht zu anfang statt die echte Funktion eine Dummyfunktion aufspielen, die sich nur merkt ob ein Taster gedrückt wurde und das zb durch eine LED anzeigen. So das zwar alles angeschlossen ist, aber die Fehlfunktion gespeichert wird und dauerhaft abrufbar bleibt.

.... und noch ein Tip:
Pulldown weglassen, dafür interne Pull-ups an den Pins einschalten.
Leider fehlt in der Skizze, wo sich genau die 9m Leitung befindet.
Sind deine (ursprünglichen) Pull-down direkt am Arduino oder an den Tastern?