unerwünschte Aktivierung des Tasters

Ich habe ein Türschloss mit einem Servo gebaut und programmiert. Ein Taster für LEDs und einen (geheim-)Code um von außen rein zukommen, 4 Taster (mit 10k Ohm Pull down) drinnen die den Servo auf bzw zu machen (und die LEDs aus) und ein Relay um den Motor von der Stromversorgung zu kappen. Mein Problem ist folgendes: Wenn ich im Haus (meistens am Gang vor meinem Zimmer) den Lichtschalter betätige aktiviert ein Taster entweder die LEDs, den Servo oder beides. Komischerweise passiert dies nicht nur wenn ich den Arduino an der Steckdose anschließe, sondern auch am Laptop (mit Akku betrieben) oder an eine Powerbank anschließe (Nur dass dann nur die LEDs angehen und nicht der Servo, und man muss öfters den Lichtschalter betätigen).
Ich bitte um hilfe.

Lg Julian

Dann sind deine Pulldown-Widerstände zu groß.
Du kannst die problemlos bis auf 1kOhm verkleinern.

Evtl. sind auch die Kabel zu den Tastern zu lang, dann solltest du diese abschirmen.

Okay, das werde ich probieren, danke für die Antwort.

vvhity:
Okay, das werde ich probieren, danke für die Antwort.

Gerne.....viel Erfolg.

Hallo,

ich würde mir auch einen Kopf machen wie es sein kann, dass eine Störung den richtigen Code erzeugen kann.

Bei einem Taster braucht man keinen Code eingeben um den Servo zu aktivieren (einfach einmal draufdrücken) und beim anderen Taster leuchten die LEDs wenn ich einmal draufdrücke und wenn ich zweimal und dann lange drücke geht der Servo an.

Und noch eine Frage zum Abschirmen. Mit was sollte ich die Kabel am besten Abschirmen? Ein neues Kabel kaufen und nochmal alles anschließen oder reicht z.B. Alufolie?

Hallo,

nur du kennst den Aufbau etc.

Hallo,
Ja, ich meine nur dass ich mir darüber keine Sorgen machen muss, mein Programm sollte einwandfrei funktionieren.

Da solltest du besser abgeschirmtes Kabel kaufen.
Es geht auch ein ungenutztes Netzwerkkabel, wo evtl. der Stecker defekt ist.

Ok, danke

Lg Julian

Ich habe jetzt ein abgeschirmtes Kabel verwendet (Cat7 Netzwerkkabel) und ich habe das Programm ein wenig umgeschrieben. Leider ist das Problem noch immer vorhanden, wenn ich den Arduino an der Steckdose anstecke (Man muss jetzt aber öfters den Lichtschalter betätigen bis sich innen der Servo dreht). Wenn ich den Arduino aber am Laptop anstecke habe ich gar keine Probleme mehr.

mein Programm sollte einwandfrei funktionieren.

Der Weg in die Hölle ist mit falschen Annahmen gepflastert.

Unspezifische Hilfeanfrage
Meine Standardantwort zu unspezifischen Hilfeanfragen:

Ich helfe gerne!

Ich bin mir recht sicher: Du machst was falsch!
Da Code und Aufbau geheim sind, gehe ich davon aus, dass du den Fehler selber suchen möchtest.

Also: Welche Form der Hilfe hättest du gerne?

Und dazu noch ein Crossposting ohne Hinweis.

vvhity:
habe das Programm ein wenig umgeschrieben.

was jetzt wie ausschaut?

wenn ich den Arduino an der Steckdose anstecke

Das machst Du nicht. Ganz bestimmt.

Wenn ich den Arduino aber am Laptop anstecke habe ich gar keine Probleme mehr.

Im Kontexkt bringt mir das ein breites Schmunzeln.
Um dann einzufrieren.

Und dazu noch ein Crossposting ohne Hinweis.

Sowas ist hier immer wieder Thema. Auch in den letzten Tagen.
Du wurdest schon darauf angesprochen. Liefere etwas, wenn Du geholfen werden möchtest.

vvhity:
Ich habe jetzt ein abgeschirmtes Kabel verwendet (Cat7 Netzwerkkabel) und ich habe das Programm ein wenig umgeschrieben. Leider ist das Problem noch immer vorhanden.....

Ja, wenn das alles so einfach wäre.....

Wir kennen deinen Aufbau doch nicht und können somit nur vermuten, welche Tipps helfen könnten.

Zeige uns deinen aktuellen Sketch und ein aktuelles Schaltbild.
Wie und wo hast du das abgeschirmte Kabel angeschlossen ?

Die Drähte sind an eine Loch-raster-Platine und an den jeweiligen LED's, Taster, ... angelötet.
Sorry für den unprofessionellen Schaltplan.

#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);
 pinMode(buttonPin2, INPUT);
 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(140);
 delay(1000);
 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 == HIGH)
     buttonPushCounter1++;
 }
 lastButtonState1 = buttonState1;
}


void button2()
{
 buttonState2 = digitalRead(buttonPin2);
 if (buttonState2 != lastButtonState2)
 {
   if (buttonState2 == HIGH)
     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 auf
 digitalWrite(RelaisPin2, LOW);
 delay(100);
 servo.write(10);
 delay(1000);
 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(140);
 delay(1000);
 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;
}

Schaltplan.pdf (525 KB)

Nimm bei den Code-Tags noch die Sterne raus, dann passt es und der Sketch wird besser lesbar.

Das Schaltbild ist schwer zu verstehen.
Du hast Taster parallel und auch Leds parallel ?
Das mit den Leds kann schief gehen. Meist ist der Strom für einen Pin zu hoch. Hier sind max. 20 mA angesagt.

Wie hast du das mit der Abschirmung gelöst ?
Die darf nur auf einer Seite angeschlossen werden.

Wenn du das meinst?: Die Schirmung habe ich nicht geerdet (oder sonst irgendwo angeschlossen)
Und die LED's wären besser Seriel mit nur einem Wiederstand?

vvhity:
Wenn du das meinst?: Die Schirmung habe ich nicht geerdet (oder sonst irgendwo angeschlossen)
Und die LED's wären besser Seriel mit nur einem Wiederstand?

Ja wozu sollte der Schirm denn sein ?

Nein, die Leds so anschließen, das die Pins nicht überlastet werden.
Also wenn parallel, dann mit einem Transistor schalten. Oder pro Pin ein Led.
In Reihe ist bei 5Volt etwas knapp.

Und Widerstand schreibt man nur mit "i".

vvhity:
Die Drähte sind an eine Loch-raster-Platine und an den jeweiligen LED's, Taster, ... angelötet.
Sorry für den unprofessionellen Schaltplan.

So na bitte - genau wie ich es mir dachte.
Du hast an den Tastern ein PULL_DOWN.
Das ist Mist.

   if (buttonState1 == HIGH)
     buttonPushCounter1++;

Jedes bisschen brizzeln in der Luft löst einen HIGH aus.

Wenn Du das anders herum machst:
R zwischen +5V und PIN und dann Taster zwschen PIN und GND und auf LOW prüfst, bekommst Du eindeutigere Ergebnisse.

(deleted)