Schalter klappt nicht Problemlos

Ich habe hier ein Schalter (kein Taster...) welchen ich über ein ca. 5m Kabel mit dem Arduino Verbunden habe.
Nun habe ich das Problem das egal ob ich einen Pullup/Down Wiederstand vorschalte immer noch 1-2 fehlerhafte Signale kriege wenn ich umschalte. Heisst anstelle von einer klarren 0 oder 1 kriege ich meistens 0 1 0 bis der Arduino "fest" bleibt.
Nun schalte ich damit ein Relais welches sich nun mehrfach ein/aus schaltet was nicht gerade Optimal ist. Was muss ich verändern?

Das hat mit dem Arduino an sich nichts zu tun, such mal nach dem Thema "entprellen" oder "debounce". :wink:

Danke für deine Antwort.
Ich habe mittels millis() mal eine Verzögerung eingestellt bis frühstens wieder gemessen wird...
So klappt das ganze auch soweit..
Nur kommt nun das nächste Problem. Am Relais hängt eine alte Leuchtstoffröhre mit Starter. Jedesmal wenn der Schaltzustand LOW ist und die Lampe Startet zieht es den zustand auf HIGH und löscht die Lampe somit wieder ab bevor sie überhaupt 100% gestartet war.
Der Schalter ist allerdings ca. 3m von der Lampe entfernt, daher sollte das eigentlich ja nicht durch Induktion oder sowas zustande kommen?

Also das Problem ist noch grösser als angenommen, wenn ich im Nebenzimmer welches ebenfalls eine CCFL Lampe hat das Licht aus!schalte schaltet bei mir im Zimmer das Licht ein oder aus...
Ich muss irgend wie diese HIGHs ausfiltern...

Eine Idee wäre nun einfach zu testen ob der Schaltzustand mind xx ms andauert und erst dann etwas zu unternehmen. Das verzögert allerdings die Schaltung ev. um 100-200ms

Was ich mir auch überlegt habe wäre anstelle von digitalRead() analogRead() zu verwenden.

Falls jemand noch bessere Ideen hat oder eine Anfügung zu einer von meiner hat wäre ich Dankbar.

Hallo,

mit analogRead() wirst du nicht viel weiter kommen, der Schalter prellt analog genau so lange wie digital.
Der naheliegendste Weg für mich wäre, auf die erste Zustandsänderung zu reagieren und dann die nächsten paar ms lang folgende Zustandsänderungen zu ignorieren.

Grüße in die Schweiz (nehme ich mal an)

if (switchState != oldSwitchState){
  doSomething();
  oldSwitchState=switchState;
  delay(100);
}

Das bringt ihm aber nichts für sein Problem mit der unbeabsichtigen Einschaltung durch die Nebenzimmerlampe. :wink:

Wie wäre es denn mit sowas:

// Stellt 50ms lang sicher dass der Knopf den Status haelt bevor es was macht
#define MAKESURE 50

int counter;
...
void loop() {
...
  if (digitalRead(BUTTON) && counter<MAKESURE*2) // damit der counter nicht ueberlaeuft
    counter++;
  else if (counter>0) // und auch nicht "unterlaeuft"
    counter--;

  delay(1); // Damits nicht zu schnell laeuft

  if (counter>MAKESURE)
    // Lampe ein
  else
    // Lampe aus

Oh, die Nebenzimmerlampe habe ich überlesen - Schande über mich!

@flohzirkus
ist doch nicht so schlimm, passiert gerne mal das man sowas überliest :smiley:

@Jogurt:
Dank, das war es genau es scheint nun gut zu klappen.
Ich habe den Code nur noch etwas angepasst damit der Schalter die Lampe toggelt um die auch via PC steuern zu können.

if (digitalRead(SWITCH)!=switch_state && counter<MAKESURE*2) // damit der counter nicht ueberlaeuft
   {
     counter++;
   }
  else if (counter>0){ // und auch nicht "unterlaeuft"
    counter--;
  }
  delay(1); // Damits nicht zu schnell laeuft

  if (counter>MAKESURE)
    {
    switch_state = digitalRead(SWITCH);
    counter = 0; 
     toggle();
    }