Unerwünschte Aktivierung eines Tasters

Hallo
Schon vor längerer Zeit habe ich mir mithilfe eines Arduinos ein Automatisches Türschloss für mein Zimmer gebaut.

Die Schaltung hat 4 Taster zum Aufsperren und 1 Taster zum anläuten und einen “Code” damit man von außen rein kann. Am Türschloss ist ein Servo befestigt der über ein Relay geschalten wird. 2 LED’s sind noch verbaut als Signalisierung, wenn außen wer “anläutet”.

Es handelt sich um ein nicht originales Arduino Board von Velleman (gekauft bei Conrad). Betrieben über den Strom Eingang (der runde Stecker am Board) und mit einem 230V auf 5V Trafo.
LED’s sind rote 5mm.
Relay ist ein SainSmart 2-CH 5V 2 Kanäle Relais.

Das ganze ist zusammengelötet auf einer Lochrasterplatine und zu den Tastern mit CAT7 Netzwerkkabeln im Zimmer verlegt. Zu 3 Tastern und den LED’s ist das Kabel ca. 7m lang und zu den anderen Tastern und zum Servo 3m. Die Abschirmung ist geerdet.

Schaltplan ist im Anhang und Code kommt jetzt.

#include <Servo.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

const int  buttonPin1 = 11;
const int  buttonPin2 = 7;
const int  ledPin     = 5;
const int  RelaisPin   = 3;
const int  RelaisPin2  = 2;

int buttonPushCounter1 = 0;
int buttonState1 = 0;
int lastButtonState1 = 0;

int buttonPushCounter2 = 0;
int buttonState2 = 0;
int lastButtonState2 = 0;

int i=0;
int x=2;
int buttonCounter = 0 ;

Servo servo;

void button1(); //Funktionen
void button2();
void LED();
void servo_decide();
void servo_open();
void servo_close();
void code();

void setup()
{
  servo.attach(9);
  pinMode(buttonPin1, INPUT); //_PULLUP
  pinMode(buttonPin2, INPUT);  //INPUT_PULLUP
  pinMode(ledPin, OUTPUT);
  pinMode(RelaisPin, OUTPUT);
  pinMode(RelaisPin2, OUTPUT);
  
  Serial.begin(9600);
  
  digitalWrite(RelaisPin, LOW);      //Servo macht Tür zu
  digitalWrite(RelaisPin2, LOW);
  delay(100);
  servo.write(105);
  delay(800);
  digitalWrite(RelaisPin, HIGH);
  digitalWrite(RelaisPin2, HIGH);
  delay(200);
}

void loop()
{
  button1();
  button2();
  LED();
  
  if(buttonPushCounter1==1)
    servo_decide();
    
  if(buttonPushCounter2 > 3)
  code();
}

void button1()
{
  buttonState1 = digitalRead(buttonPin1);
  if (buttonState1 != lastButtonState1)
  {
    if (buttonState1 == LOW)
      buttonPushCounter1++;
  }
  lastButtonState1 = buttonState1;
}


void button2()
{
  buttonState2 = digitalRead(buttonPin2);
  if (buttonState2 != lastButtonState2)
  {
    if (buttonState2 == LOW)
      buttonPushCounter2++;
  }
  lastButtonState2 = buttonState2;
}


void LED()
{
  if(buttonPushCounter2 != 0)
  {
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }
}


void servo_decide()
{
  if(x==2)
    servo_open();
  else if(x==-2)
    servo_close();
  else
  return;
}


void servo_open()
{
  digitalWrite(RelaisPin, LOW);      //Servo macht Tür zu
  digitalWrite(RelaisPin2, LOW);
  delay(100);
  servo.write(25);
  delay(800);
  digitalWrite(RelaisPin, HIGH);
  digitalWrite(RelaisPin2, HIGH);
  delay(200);

  digitalWrite(ledPin, HIGH); //Blinken
  delay(200);
  digitalWrite(ledPin, LOW);
  delay(200);
  digitalWrite(ledPin, HIGH);
  delay(200);
  digitalWrite(ledPin, LOW);
  x=x*-1;
  buttonPushCounter1=0;
  buttonPushCounter2=0;
  loop();
}


void servo_close()
{
  digitalWrite(RelaisPin, LOW);      //Servo macht Tür zu
  digitalWrite(RelaisPin2, LOW);
  delay(100);
  servo.write(105);
  delay(800);
  digitalWrite(RelaisPin, HIGH);
  digitalWrite(RelaisPin2, HIGH);
  delay(200);

  digitalWrite(ledPin, HIGH); //Blinken
  delay(200);
  digitalWrite(ledPin, LOW);
  delay(200);
  digitalWrite(ledPin, HIGH);
  delay(200);
  digitalWrite(ledPin, LOW);
  x=x*-1;
  buttonPushCounter1=0;
  buttonPushCounter2=0;
}


void code()
{
  while (digitalRead(buttonPin2) == ( HIGH ))
  {
    buttonCounter++;
    delay( 100 );
  }
  if(buttonCounter > 23)
    {
       servo_decide();
    }
    else buttonCounter=0;
}

Der Code funktioniert so: Bei einmal drücken im Zimmer geht die Tür auf oder zu und bei einmal drücken von außen leuchten innen die LED’s. Bei 3mal von außen drücken und dann 3s halten geht die Tür auch auf oder zu.
Und beim öffnen und schließen blinken die LED’s kurz.

Nun zu meinem Problem: Da die Kabel ziemlich lang sind habe ich das Problem, dass wenn man vor meiner Zimmer Tür im Gang das Licht ein oder aus schaltet sich sich auch manchmal die Tür von meinem Zimmer öffnet.

Was ich schon alles versucht habe: von normalen Drähten auf das CAT7 Kabel gewechselt, die Abschirmung geerdet, die Taster über Pulldown zu schalten, dann über Pullup, dann mit unterschiedlichen Widerständen (1k, 2,2k, 10k), dann über internen Pullup.
Ich weiß nicht was ich sonst noch alles probieren soll. Daher bitte ich um Hilfe für mein Problem und hoffe das ich nichts vergessen habe zu erwähnen.

LG

Technische Daten.pdf (66.6 KB)

Arduino Türschloss Schaltplan.pdf (12 KB)

Betrieben über den Strom Eingang (der runde Stecker am Board) und mit einem 230V auf 5V Trafo.

An der Rundbuchse solltest du mehr als 5V (7-12V) einspeisen.
Wofür die 5 (statt 1) Taster im Schaltplan gut sind verstehe ich nicht.

Betrieben über den Strom Eingang (der runde Stecker am Board) und mit einem 230V auf 5V Trafo.

Der Netzteileingang braucht mindestens 7V. Mit 5V kannst Du über ein abgeschnittenes USB-Kabel in die USB Buchse einspeisen oder über das 5V Pin.
Es muß aber verhindert werden daß gleichzeitig Spannung vom 5V Pin und USB kommt. Das Einfachste ist es für das Programmieren einen USB Kabel mit unterbrochener 5V Ader zu verwenden.

Die Pullupwiderstände sind bereits ziemlich klein und das hilft gegen Störungen. Sie können noch auf 220 Ohm herabgesetzt werden. Ein 0,1µF Kondensator zwischen Eingang und Masse könnte auch helfen.

Grüße Uwe

Ok, danke schonmal.
Die 5 Taster sind weil ich mehrere Plätze habe wo ich die Tür aufmachen kann (z.B Schreibtisch, an der Tür selbst usw.)

Neues Netzteil und Kondensator werde ich mir dann mal besorgen und den 220 Ohm Widerstand auch noch probieren.

Den Kondensator dann zwischen welchen Eingang genau? 5V vom Arduino und GND oder die vom Netzteil?

Die Vorwiderstände für die Leds solltest du auch größer wählen.
In diese Anordnung wirst du den Pin deutlich überlasten.
Der sollte bei Dauerlast nicht größer wie mit 20mA belastet werden.

Also mindestens 250 Ohm Widerstände?

(Betriebsspannung - Flußspannung)/20 mA = ?? kOhm

Vorwiderstandsrechner

Gruß Tommy

Um sicher zu gehen, wäre 680 Ohm der bessere Wert.

Da 3 LED paralellgeschaltet sind muß die Summe der Ströme 20mA nicht überschreiten. Die Widerstände müssen dementsprechend gewählt werden.

Den Kondensator dann zwischen welchen Eingang genau? 5V vom Arduino und GND oder die vom Netzteil?

Wir reden von Problemen der Taster. Die Taster sind an Eingängen angeschlossen. Diese Eingänge müssen entstört werden. Also kommen die Kondensatoren zwischen jedem Eingang eines Tasters und Masse.
Grüße Uwe

Kann ich auch einen Elko anhängen? Den hätte ich nämlich daheim

vvhity:
Kann ich auch einen Elko anhängen? Den hätte ich nämlich daheim

Was für einen Elko und wo anhängen ?

Eklos sind allgemein kapazitätsmäßig relativ groß.
Was ist die kleinste Kapazität die Du hast?
Grüße Uwe

0,1µF

uwefed:
Ein 0,1µF Kondensator zwischen Eingang und Masse könnte auch helfen.

vvhity:
0,1µF

Glaube zwar nicht daß Du einen 0,1µ Elko hast, das müßte ein anderes Dielektrikum sein. Aber Deine 0,1µ "Elko" sind optimal.
Grüße Uwe

Laut Conrad: Aluminium Elektrolyt Kondensator 0,1 µF 50V mit plus und minus Seite. Aber es ist eh egal solange er die richtige Kapazität hat und die Polung richtig ist.

vvhity:
Laut Conrad: Aluminium Elektrolyt Kondensator 0,1 µF 50V mit plus und minus Seite. Aber es ist eh egal solange er die richtige Kapazität hat und die Polung richtig ist.

In diesem Fall Ja.
Das Dielektrikum hat schon Einfluß auf die elektrischen Eigenschaften des Kondensators.
Grüße Uwe

uwefed:
Glaube zwar nicht daß Du einen 0,1µ Elko hast, das müßte ein anderes Dielektrikum sein. Aber Deine 0,1µ "Elko" sind optimal.
Grüße Uwe

Warum nicht, ich habe da auch welche von.

Hab geglaubt Elektrolyt startet bei 1µF. Hab beim C 3 Modelle zu 0,1µ Elektrolyt SMD gefunden.
Uwe