Arduino Leonardo Zwei taster zwei-kanal-Relais-Modul

Hallo zusammen,

ich habe an meinem Arduino an Pin 3 & 5 jeweils einen Taster, der über den Arduino +3,3V auf eingang legt.
Die Pins 8 & 12 sind als Ausgänge definiert und werden auf Low gesetzt sobald ein taster gedrückt wird.
so sollte es sein
also wenn pin 3 high, dann setze pin 8 low damit das relaismodul schalten kann (das relaismodul schaltet auf Ground und nicht auf VCC)

also wenn pin 5 high, dann setze pin 12 low damit das relaismodul schalten kann (das relaismodul schaltet auf Ground und nicht auf VCC)

nun habe ich mir dazu ein kleines sketch geschrieben dass mir das umsetzen soll, aber irgendwo ist der wurm drin denn der ausgang 12 wird immer mit dem Programmzyklus ein bzw ausgeschalten (habe am ende des Progs ein Delay von 250 rein um das mal zu identifizieren)

wäre echt froh wenn mir jemand helfen könnte

P.S. stört euch nicht am taster zwei das soll mal ein taster werden der beim drücken beide ausgangsports wieder high setzt um die relais abzuschalten.

freue mich schon auf eure antworen

mfg freak

Hier der Code ...

const int taster1 = 3; // Abwärtsbutton
const int taster2 = 7; // Stop-button
const int taster3 = 5; // Aufwärtsbutton
//Relais
const int relais1 = 8;
const int relais2 = 12;

//Variable, werden geändert
int taster1status = 0; // Variable für den taster1
int taster2status = 0; // Variable für den taster2
int taster3status = 0; // Variable für den taster3


// PIN Eigenschaften I/O
void setup ()
{
 //Pins Eigenschaften zuweisen Outputs
 pinMode (relais1, OUTPUT);
 pinMode (relais2, OUTPUT);
 
 //Pins Eigenschaften zuweisen Inputs
 pinMode (taster1, INPUT);
 pinMode (taster2, INPUT);
 pinMode (taster3, INPUT);
}
void loop()
{
  digitalWrite(relais1, HIGH);
  digitalWrite(relais2, HIGH);
  //Status von taster1 einlesen
  taster1status = digitalRead(taster1);
  taster3status = digitalRead(taster3);
  
  //Überpüfen ob taster1 gedrückt
  //Wenn gedrückt taster1status HIGH Setzte Relais1 Low um Relais zu schalten
 if (taster1status == HIGH)
 {
  //Relais1 einschalten
  digitalWrite(relais1, LOW);
 }
 else
 {
 //Relais1 abschalten
 digitalWrite(relais1, HIGH);
 
 }

  //Überpüfen ob taster1 gedrückt
  //Wenn gedrückt taster1status HIGH Setzte Relais1 Low um Relais zu schalten
 if (taster3status == HIGH)
 {
  //Relais1 einschalten
  digitalWrite(relais2, LOW);
 }
 else
 {
 //Relais1 abschalten
 digitalWrite(relais2, HIGH);
 
 }
 delay(250);
}

Sind an den Tastern Pulldown Widerstände dran? Wenn nicht, die Taster auf INPUT_PULLUP umstellen und die Logik herumdrehen. Mit den internen Pullups sind die Taster gedrückt LOW und ungedrückt HIGH.

Außerdem musst du die Taster entprellen:
http://arduino.cc/en/Tutorial/Debounce (per Hand)
GitHub - thomasfredericks/Bounce2: Debouncing library for Arduino and Wiring (per Lib)

Primitiv geht auch ein delay(30) oder etwas in der Größenordnung direkt nach dem Auslesen des Zustands.

hab leider keinen 10k widerstand da - meine sind alle im Mohm-bereich

ich versteh nicht wo da das problem ist? vom elektrischen her ist´s doch auch ohne die widerstände richtig, dachte ich zumindest bis jetzt. ich geb doch nur +3,3V auf nen eingang und will den dementsprechenden ausgang auf GND also 0V schalten. Wenn der taster nicht gedrückt ist bekommt der eingang kein signal und der Ausgang dürfte nicht schalten - tut er aberim millisekunden-takt :wink:

mit einem Taster funktiniert es doch auch wunderbar aber sobald ich den Code für die zweite Tasterabfrage einbaue fängt das relais das tickern an

hab dann den delay ans ende gesetzt um zu merken ob mein fehler von der software kommt - so dachte ich bis jetzt.

Du darfst CMOS Eingänge nie offen lassen. Die floaten und haben einen willkürlichen Wert. Wenn der Taster an Plus hängt und die andere Seite am µC hast du einen offenen Eingang. Das geht nicht. Zumindest nicht zuverlässig.

Verwende wie gesagt die internen Pullups indem du die Konstante bei pinMode() änderst. Und was ich vergessen hatte: den Taster dann gegen Masse schalten! Also ein Ende an den Pin. Das andere an Masse. So:
http://www.rapidsignalph.com/wp-content/uploads/2013/04/atmega-internal-pullup-resistor.png

Durch die internen Pullups hängt der Pin dann an Plus wenn der Taster nicht gedrückt wurde. Wenn man ihn drückt wird er auf Masse gezogen. Siehe auch hier:

Dann kommt noch hinzu dass Taster prellen:

danke für die vielen infos

mal zum prellen - das relais fängt sofort sas tickern an wenn der sketch auf dem board ist ohne tasterbewegung.
das kommt doch dann nicht vom prellen oder?

um den taster gegen masse zu legen muss ich mir erst widerstände besorgen - meine sind wie gesagt recht hoch alle.

wie man merkt bin ich ein absolouter noob und freue mich das Ihr so geduldig seit

Das wird eher davon kommen, dass der Eingang offen ist. Das Prellen passiert wenn man den Taster drückt.

Du brauchst dazu keine extra Widerstände. Der Controller hat intern Widerstände eingebaut, die man per Code aktivieren kann. Du musst lediglich den zweiten Anschluss des Tasters auf Masse legen statt auf Plus.

Hier ist noch ein Bild:

Unten mit Pulldown wenn der Taster an Plus hängt. Oben mit Pullup wenn der Taster an Masse hängt. Und den Pulldup-Widerstand hat der Controller wie gesagt intern. Dazu muss man nur pinMode(..., INPUT_PULLUP) machen.

Und dann eben noch bedenken, dass sich dadurch die Logik herumdreht.

Hallo,
was möchtest du mit den beiden ersten Zeilen deiner Loop bewirken?

void loop()
{
  digitalWrite(relais1, HIGH);
  digitalWrite(relais2, HIGH);

Hier werden in jedem Loop Durchlauf die Relais abgeschaltet, also auch wenn du einen Taster drückst, wird das Relais nur für einen Loop Durchlauf eingeschaltet.
Gruß Ardubu

Hallo nochmal an alle,

danke für den Tipp mitm entprellen - habe an beide Taster noch 5 1K widerstände in Reihe gegen Masse geschalten (Was anderes hatte ich nicht da) nun bekomme ich saubere signale und bin auch schon einen schritt weiter.

ich wollte eine Schalter Lösung für meine Taster (also einmal drücken Schaltet mein Relais1 ein ein zweites mal drücken schaltet mein Relais1 aus)

mein Gedanke

Wenn der Taster Gedrückt wird, Variable um 1 hochzählen

Prüfen ob Variable Wert 1 hat

  • wenn Ja -
    Ausgang xy Low
  • wenn Nein -
    Ausgang xy High

Prüfen ob Variable Wert 2 hat

  • wenn Ja -
    Variable auf 0 setzen

Die Umsetzung habe ich dann so gelöst
(weis als laie ja nicht ob es nicht eleganter gegangen wäre aber es läuft)

nun muss ich noch den ausgang relais 2 gleichsetzen, dann ist die erste hürde gepackt

Edit:
jetzt habe ich schon das nächste problem, wenn man auf dem Taster bleibt schaltet der ausgang ständig // wenn ich die Delay am ende erhöhe könnte man länger am taster bleiben, aber eigentlich wollte ich die komplett raus schmeissen, aber ohne die geht es über haupt nicht - kann mir da jemand nen tip geben?

const int taster1 = 3; // Abwärtsbutton
const int taster2 = 7; // Stop-button
const int taster3 = 5; // Aufwärtsbutton
//Relais
const int relais1 = 8;
const int relais2 = 12;

//Variable, werden geändert
int taster1status = 0; // Variable für den taster1
int taster2status = 0; // Variable für den taster2
int taster3status = 0; // Variable für den taster3

int zaehler1 = 0; // Variable zähler 1
int zaehler2 = 0; // Variable zähler 1
int zaehler3 = 0; // Variable zähler 1



// PIN Eigenschaften I/O
void setup ()
{
 // serielle kommunikation mit 9600 bits per second:
 Serial.begin(9600);
 //Pins Eigenschaften zuweisen Outputs
 pinMode (relais1, OUTPUT);
 pinMode (relais2, OUTPUT);
 
 //Pins Eigenschaften zuweisen Inputs
 pinMode (taster1, INPUT);
 pinMode (taster2, INPUT);
 pinMode (taster3, INPUT);
}
void loop()
{

  //Status von taster1 einlesen
  taster1status = digitalRead(taster1);
  taster3status = digitalRead(taster3);

  //Überpüfen ob taster1 gedrückt
  //Wenn gedrückt taster1status HIGH Setzte Relais1 Low um Relais zu schalten


 if (taster1status == HIGH)
 {
  //Wert der Variable um 1 erhöhen
  zaehler1 ++;
 }
 //Prüfen ob Variable Wert 1 hat
 if (zaehler1 == 1)
 {
  //Relais1 einschalten
  digitalWrite(relais1, LOW);
 }
 else
 {
 //Relais1 abschalten
 digitalWrite(relais1, HIGH);
 }




  //Überpüfen ob taster3 gedrückt
  //Wenn gedrückt taster1status HIGH Setzte Relais1 Low um Relais zu schalten

 if (taster3status == HIGH)
 {
  //Relais2 einschalten
  digitalWrite(relais2, LOW);
 }
 else
 {
 //Relais2 abschalten
 digitalWrite(relais2, HIGH);
 
 }

//Prüfen ob Variable Wert 2 hat 
if (zaehler1 == 2)
{
 //Variable Wert 0 zuweisen
 zaehler1 = 0;
} 

Serial.println(zaehler1);

delay(250);
}