Problem mit Taster, Relativ willkürliche Resultate

Hallo zusammen,
ich bin blutiger Anfänger und habe Probleme mit einem Taster.

Der Code lautet:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
const int taster1_Pin = 7; //Input-Pin

void setup () {
Serial.begin(9600);
pinMode(taster1_Pin, INPUT_PULLUP);
Serial.println("Tasterabfrage");
}

void loop () {
Serial.println(!digitalRead(taster1_Pin)); //Abfrage und Ausgabe des Wertes invertiert
delay(1000); //Pause
}
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Also wie man leicht sieht, nichts wirklich wildes und auch im Aufbau der Schaltung, lässt sich nicht viel falsch machen. Ein Kabel führt vom Pin7 zum Taster und eines vom Taster zurück zum GND.
Mein Problem ist, dass der Serielle Monitor komplett willkürlich 0er und 1er ausgibt. Manchmal reagiert er aufs drücken des Tasters, öfters nicht, dann führt einmal kurz drücken zu zehnmaligen 1ern...Ich habe schon alle Kabel ausgetauscht und auch den Taster. Ich hatte vorhin mal eine kurze Phase, wo es scheinbar funktioniert hat und dann ist es wieder in den willkürlichen Zustand verfallen. Ich frag mich schon, ob mein Arduino bzw. Elegoo Uno R3 einen Macken hat.

p.s. den Aufbau und auch den Code, habe ich aus einem YT-Video, daher denke ich, dass im Prinzip alles stimmen müsste und eventuell doch ein Hardwareproblem seitens des Boards vorliegt.

Wenn jemand, ne Idee hat, dann gerne her damit. Vielen Dank :wink:

Hallo
Zeige ein Bild vom Hardwareaufbau, in dem alle Komponenten und Verbindungen deutlich sichtbar sind.
Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

1 Like

a)
bitte lies im Forum how to nach wie man code in code tags postet und korrigiere (edit) deinen ersten post
https://forum.arduino.cc/t/wie-man-dieses-forum-benutzt-bitte-lesen/902274

dort steht hoffentlich auch, dass wir einen Schaltplan und Echtbilder von dem Aufbau brauchen.

b)

ist klar oder?
Du fragst den button ab und schickst den controller dann 1 Sekunde schlafen mit delay()

Kein Wunder, dass du das verschläfst.

schau mal in die IDE, Beispiel

02 Digital / Debounce

so liest man einen Taster aus.

hier beschrieben: https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce

1 Like

Also der Code ist ok und funktioniert.

Aber, bedenke: du fragst nur einmal pro Sekunde ab, ob dein Taster gedrückt ist.

Ich denke, dein Fehler liegt in der Hardware.
a) Taster richtig angeschlossen?
b) probier mal einen anderen Pin, vielleicht (unwahrscheinlich) hat Pin 7 einen Treffer (welcher Arduino?

1 Like

Sagen wir mal die Abfrage dauert ein paar Millionstel Sekunden, dann kommt die Pause mit einer ganzen Sekunde. In der Zeit wird die Tatste nicht abgefragt. Wie wahrscheinlich wird es sein, dass du beim Tatsendruck diese millionstel Sekunde erwischt, wo die Taste abgefragt wird?? Der Tastendruck dauert vielleicht 200-300ms. Mache aus dem delay(1000) mal delay(100). Dann wirst die den Tatstendruck fast jedesmal angezeigt bekommen. Jedes Delay ist eines zuviel.

Ich mache immer wenn ich einen Tastendruck erkenne, für 200ms keine Erkennung dieser Taste. Erst nach dem Ablauf dieser Zeit, wird diese Taste wieder abgefragt. Und das geht völlig ohne delay(), sondern mit Millis(). Die Abfrage dieser Taste wird 200ms lang "übersprungen" wenn sie eimal gedrückt wurde. Das überbrückt auch jedes prellen. Und das hat einen Nebeneffekt. Wenn ich auf der Taste drauf bleibe, drücke ich die Taste automatsch alle 200ms einmal. Das ist zusätzlich eine nützliche Sache, wenn ich z.B. einen Zahlenwert mit so einer Taste immer um eines höher oder oder niedriger machen will. Das wirkt wie ein automatischer Drehimpulsgeber. Einmal drücken ist einmal erhöhen, auf der Taste draufbleiben, erhöht 5x je Sekunde.
Hier mal für zwei Tasten:

// Deklarationen
//-----------------------Taster01----------------------------------------
// const byte ist im Programm Constant und byte ist fuer Werte 0-255
const byte Taster01 = 15;           // Pin 15 wird Constant als Taster01 bezeichnet
byte Tasterstatus01 = 0;            // Zum Abfragen des Tatsenpins
byte Tastenmerker01 = 0;            // Zum Merken des aktuellen Tatsenstatus
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit01 = 200;
//-----------------------Taster02---------------------------------------
const byte Taster02 = 16;           // Pin16 wird Constant als Taster02 bezeichnet
byte Tasterstatus02 = 0;
byte Tastenmerker02 = 0;
unsigned long Sekundenablauf02 = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit02 = 200;

//=============================================================================================================
void setup() {

  Serial.begin(9600);

  //-----------Taster einrichten----------------------------------------
  pinMode(Taster01, INPUT_PULLUP); // Pin 15 fuer Taster01 wird intern auf plus gelegt. Mit GND ueber Taste aktivieren
  pinMode(Taster02, INPUT_PULLUP); // Pin 16 fuer Taster02
}
//=============================================================================================================
void loop() {
  //-----------Taster01 abfragen--------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
    Tasterstatus01 = digitalRead(Taster01);         // Pin von Taster01 abfragen
    if (Tasterstatus01 == LOW) {                    // Ist Taster01 gedrueckt?
      Tastenmerker01 = !Tastenmerker01;             // Merken dass Taster01 gedrueckt wurde
      Serial.print(F("Taste 1 ="));
      Serial.println (Tastenmerker01);
      Sekundenablauf01 = millis();                  // Die 200ms neu starten
    }
  }
  //-----------Taster02 abfragen--------------------------------------------
  if (millis() - Sekundenablauf02 >= Pausezeit02) { // 200msec abgelaufen?
    Tasterstatus02 = digitalRead(Taster02);         // Pin von Taster02 abfragen
    if (Tasterstatus02 == LOW) {                    // Ist Taster02 gedrueckt?
      Tastenmerker02 = !Tastenmerker02;             // Merken dass Taster02 gedrueckt wurde
      Serial.print(F("Taste 2 ="));
      Serial.println (Tastenmerker02);
      Sekundenablauf02 = millis();                  // Die 200ms neu starten
    }
  }
}
1 Like

Danke, für die Antworten. Für nen Schaltplan hab ich (noch) kein entsprechendes Programm (und was mit Paint hinzukritzeln erspare ich euch und mir :wink: ). Wie gesagt, ich bin blutiger Anfänger. Pin habe ich gewechselt (natürlich dann auch im Programmcode), Kabel habe ich gewechselt, Schalter habe ich gewechselt, Delay-Zeit habe ich auch alles mögliche durchgespielt. Keine Veränderung. Wie gesagt es ist komplett willkürlich. Jetzt hat er z.B. beim Drücken gar nicht reagiert (also nur 0er ausgegeben). Wenn ich den Schalter durch ein Kabel ersetze, zeigt er an, dass der Stromkreis geschlossen ist (also gibt richtigerweise ne 1 aus).

Du solltest den Schalter auf jeden Fall noch entprellen (google mal nach "debouncing"), Schalter gehen nicht sauber von aus nach an, sondern haben einiges an auf und ab, bis sie sich auf einen Zustand festlegen.

1 Like

Die Taster haben teilweise zu kurze Pins und berühren die Kontakte im Breadboard nicht richtig.
Oder Dein Schalter ist defekt. Zumindestens liegt es am Schalter lt. Deiner Ausssage.

1 Like

Wenn ich mir so anschaue, wie der Taster angeschlossen ist, dann muss digitalRead() eigentlich immer 0 liefern.

Siehe dieses Datenblatt: https://docs.rs-online.com/5010/0900766b80dbe05c.pdf
Bei den "Dimensions" sieht man wie der Schalter innen aufgebaut ist.

image

Mach doch die Kabel mal nur auf einer Seite dran, oder diagonal

Auch das. Erschwert natürlich die Erkenntnis.

1 Like

Er gibt ja bei geöffnetem Stromkreis eine 0 aus.

Ja, es liegt zu 90% an den zu kurzen Pins. Ich hab den Schalter mal direkt mit den Kabeln verbunden (ohne Breadboard), so scheint es so klappen (oder es ist halt mal wieder Zufall). Seltsam, dass im Starter-Kit die Schalter zu kurze Pins für das Breadboard haben.
Hab mir mal andere bestellt....

Vielen Dank an alle, wird bestimmt nicht mein letztes Problem sein :smiley:

Hello
Ersetze den Taster durch ein Kabel.

Brille muss mal geputzt werden :nerd_face:

1 Like

Hat er in #6 gemacht :wink:

1 Like

Nein. Durch den aktivierten internen Pullup gibt er unbeschaltet oder bei offenen Taster 1 aus.
[EDIT]
Jein. Durch aktivieren des internen Pullup wird der Eingang wenn unbeschaltet oder nicht betätigten Taster (Schließer) als 1 gelesen. Durch das negieren ( ! ) des gelesenen Wertes bekommt man eine 0.
[/EDIT]

Ich gebe combie (Ausnahmsweise :wink: :innocent:) recht (wo er recht hat).
Du hast am Taster die falschen Pins angeschlossen. Diese 2 Pins sind miteinander verbunden.
Außerdem sind die Pins relativ kurz sodaß sie keinen guten Kontakt im Steckbrett machen.
Es gibt wenige Taster die gut geeignet für Breadboards sind. zB
https://de.rs-online.com/web/p/tastschalter/9173996 und den gibt es natürlich nicht mehr GRRRRR.
https://de.rs-online.com/web/p/drucktaster-schalter/1193507 müßte auch gehen, hab aber nicht praktisch getestet da ich die anderen habe.

Grüße Uwe

1 Like

Ihm hat da noch ein kleines ! eingebaut.
Leicht zu übersehen, aber invertiert trotzdem.

Nichts anderes erwarte ich von dir.
Mal Zustimmung und mal Gegenkraft.

1 Like

Nochmals danke;
!digitalRead gibt doch mit dem ! (=nicht) das Gegenteil aus. Also 0

Die 2 Pins vom Schalter sind nicht miteinander verbunden. Wenn ichs direkt verkable, funktioniert es einwandfrei. Ich habe auch darüber hinaus auch schon die Anordnung geändert. Ich habe so ziemlich alles geändert, was sich in diesem Aufbau ändern lässt.
Es liegt an den zu kurzen Pins.

*Nachtrag: Hab noch nen altes Breadboard gefunden, welches etwas flacher erscheint. Hier funktioniert es

1 Like

Ich muß (kleinlaut) gestehen daß ich es übersehen habe :innocent: :innocent: :innocent:

Grüße Uwe