Entprellte Taster voneinander Isolieren wie geht das?

Ich bin halt gerade mal so Anfänger.

Ich habe eine Anordnung aus 8 Tastern.

Diese haben eine gemeinsame Masse mit Widerstand dazwischen.
Dann habe ich für den Eingang je ein eigenes Kabel angeschlossen.

Die Auswertung erfolgt halt Masseseitig vor dem Widerstand.

Einen einzelnen Taster kann ich hier mit:

// this constant won't change:
const int  buttonPin1 = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // LED Rot
const int led2Pin = 12;     //LED Grün
// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, OUTPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(led2Pin, LOW);
  } else {
    digitalWrite(ledPin, LOW);
    digitalWrite(led2Pin, HIGH);
  }
}

auslesen und gleichzeitig eine Farb LED ansteuern.

Mit dem Counter zähle ich quasi die Häufigkeit des drückens und die IF / Else Abfrage schaltet die LED um.

Aber sobald ich einen zweiten Taster anschließe, zählen dessen Pushes zu denen des ersten dazu.

Wie trenne ich die Schalter in der Programmierung und der Verkabelung voneinander?

Ich will halt acht einzelne LEDs getrennt schalten. (Statt der LEDs kommen Später Relais dran)
Jeder Button soll dann eine ihm zugeordnete LED bzw. Relais bedienen.

Jeder Taster braucht seinen eigenen Pulldown-Widerstand.
Du kannst auch die internen Pullup-Widerstände verwenden, dann sparst du die externen Widerstände.
Du musst dann im Sketch nur auf LOW abfragen.

Das würde dann bedeuten, das ich auf der 5V Seite die Widerstände setze richtig?

Mir geht es ja noch darum, dass ich halt außer dem buttonPin1 noch den buttonPin2,3,4,... auslesen möchte.

Und das dann halt separat voneinander, damit die einzelnen Pushes nicht in einen einzigen Counter rein zählen, sondern das jeder Taster einen eigenen Counter hat.

Wie sähe das im Sketch aus?

Kannst du mir da eventuell was beispielhaft vorprogrammieren? (Bekomme das leider selber nicht hin.)

An welchem Pin hängt buttonPin2, oder hast Du mehrere Taster an D2 parallel angeschlossen?

Warum ist buttonPin2 als Ausgang angegeben?

Wie du es programmieren musst, habe ich ja angedeutet.
Die Definition der Button erfolgt so:

pinmode(buttonPin1, INPUT_PULLUP);

Ok, aber wie werte ich das jetzt aus?

Und wie verkabel ich die anderen Taster, dass sie mir nicht reinpfuschen?

Ich hatte bereits zwei Taster dran, aber das ist dann wie eine Hotelschaltung, wenn ich auf einem Taster drücke, geht die erste LED an, bei wiederholtem drücken geht sie auch aus, aber wenn ich auf dem anderen drücke, geht sie eben auch aus oder an.

Und das soll halt nicht so sein.

Ich bräuchte bestenfalls mal einen Verdrahtungsplan mit mehreren Tastern, weil so rein mit Worten ist das nicht wirklich zu verstehen.

pinMode(buttonPin2, OUTPUT);

Das solltest du reparieren, wenn du zwei Taster verwenden willst.

Erstens ist buttonPin2 nicht definiert, und wenn du ihn so verwenden willst wie der Name sagt, wäre als
pinMode entweder INPUT oder INPUT_PULLUP sinnvoll.
(Moko war schneller)

Mein Zusatz-Tip:
Nimm dir das kleinere Beispiel aus den Basics und erweitere das um den zweiten Taster und die zweite LED.
(INPUT_PULLUP halte ich übrigens auch für einfacher, auch wenn gedrückt == LOW erstmal seltsam wirkt)

Dann lies mal bitte meinen Post #1.
Und einen Plan findest du bei Google.
Ein wenig mitarbeiten solltest du schon.

Als ebenfalls Arduino Anfänger kann ich dir hier nur raten
schau dir mal die Beispiel Datei Button in der Arduino IDE und
das Programm Multible buttons denouncing von jurs an.
Wenn du diese beiden verknüpfst und dann keine LEDS sonder Relais schaltest, sollte alles so klappen wie du es möchtest!

Gruß Joe

Ok, das ist ja nicht das Hexenwerk. (Bezogen auf HotSystems Beitrag)
Was ich ja möchte ist, dass das Arduino Board in gewisser Weise den Zustand des Tasters als Schaltung interpretiert.

Mit Worten ausgedrückt:

Wenn Taster 1 gedrückt, schalte LED ein.
Wenn Taster 1 erneut gedrückt, schalte LED wieder aus.

Und das dann halt auch für die restlichen sieben Taster.

Und daran hänge ich mich eben gerade auf.

Das andere bekomme ich wie gesagt recht einfach zusammengetippelt.

Ich Wiederhole mich, aber schau dir die beiden oben genannten Programme an.
dann Hast du alles was du zum umsetzten d ines Projektes brauchst!

Gruß Joe

Ich probiere mich mal durch.

Wenns dann immer noch nicht geht, melde ich mich noch mal kurz.

Mach mal mehrere getrennte Aufgaben draus:

  • Einfachsten Beispielsketch (button.ino) auf zwei Taster erweitern. LED leuchten, solange Taster gedrückt.
  • LED abwechselnd ein aus bei jeweils einem Tastendruck. Da kommt Entprellen ins Spiel.
  • Das zweite für zwei Taster und zwei LED.

Solange du Probleme bei den ersten zwei Aufgaben hast, brauchst du nicht weiter zu machen.
Von zwei auf acht zu kommen ist danach entweder Fleißarbeit, oder nochmal eine Stufe komplizierter.

Und Sketche die nicht kompilieren, brauchst du nur zu posten wenn du nicht weißt, wie du Übersetzungsfehler wegkriegst. Aber dann musst du auch anders fragen.

Auf "funktioniert nicht" kriegt übrigens keiner vernünftige Antworten.

So ich habe jetzt mal von einem Taster auf 3 erweitert und ein Problem damit.

Der Sketch, der zwar kompiliert, aber irgendwie nicht funzt:

const int buttonPin1 = 2;     // the number of the pushbutton pin
const int buttonPin2 = 3;
const int buttonPin3 = 7;
const int ledPin1 =  8;      // the number of the LED pin
const int ledPin2 =  11;
const int ledPin3 =  12;

// variables will change:
int buttonState1 = 0;         // variable for reading the pushbutton status
int buttonState2 = 0;
int buttonState3 = 0;


void setup() {
  // put your setup code here, to run once:
// initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
// read the state of the pushbutton value:
  buttonState1 = digitalRead(buttonPin1);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState1 == HIGH) {
    // turn LED on:
    digitalWrite(ledPin1, LOW);
  } else {
    // turn LED off:
    digitalWrite(ledPin1, HIGH);
  }
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState2 == HIGH) {
    // turn LED on:
    digitalWrite(ledPin2, LOW);
  } else {
    // turn LED off:
    digitalWrite(ledPin2, HIGH);
  }
  buttonState3 = digitalRead(buttonPin3);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState1 == HIGH) {
    // turn LED on:
    digitalWrite(ledPin3, LOW);
  } else {
    // turn LED off:
    digitalWrite(ledPin3, HIGH);
  }
}

Bei 2 Tastern und 2 LEDs ist alles wunderbar.

Schreibe ich den Sketch auf 3 Taster und 3 LEDs um, schaltet Taster 1 LED 1 und 3, Taster 2 LED 2 und Taster 3 macht gar nichts.

Habe ich im Sketch was falsch gesetzt?

Ich habe übrigens die HIGH und LOW Werte der LED Ausgabe im Loop geändert, weil bei mir die Pull Widerstände genau anders herum sind.

Aber wie gesagt, 2 Taster gehen.
Nur 3 halt nicht.

Weil Du im 3. Teil schreibst if (buttonState1 == HIGH) mach aus der 1 eine 3.

Gruß Tommy

JAAA Endlich geht es.

Jetzt ist noch das Problem ganz vom Anfang da.

Marino_needing_help:
Jetzt ist noch das Problem ganz vom Anfang da.

Welches Problem und welcher Anfang?
Grüße Uwe

uwefed:
Welches Problem und welcher Anfang?
Grüße Uwe

Ich will halt mit 8 Tastern 8 LEDs getrennt voneinander Einschalten, diese sollen dann an bleiben, bis der Taster erneut gedrückt wird.

Marino_needing_help:
Ich will halt mit 8 Tastern 8 LEDs getrennt voneinander Einschalten, diese sollen dann an bleiben, bis der Taster erneut gedrückt wird.

Und ich wiederhole mich gern.
Lies meinen Post #1, da steht die Antwort auf deine Frage.

byte pins[]={1,2,3,4,5,6,7,8};
byte leds[]={13,14,15,16,17,18,19,20};
...
loop(){
  for (byte i=0;i<7;i++){
    digitalWrite(leds[i],digitalRead(pins[i]);
  }
}

Nur dahin getippt - könnte aber fast direkt klappen.

Dein ‘an bleiben’ - dazu musst Du den Taster korrekt als Gedrückt erkennen - da der Taster prellen kann, sind Da auch viele LOW-Impulse bei - Die musst Du ausfiltern.
Wenn Du hinter dieser Filterung einen gültigen Tastendruck erkennst, negierst Du das Signal des OUT-Pin - entweder durch Einlesen des aktuellen Zustand, oder durch Merken, wohin Du den Pin geschickt hast.

MfG