digitalRead() sowoll true als auch false

Als ich mir ein etwas größeres Programm geschriben habe, hatte ich plötzlich volgenden Fehler:

int but = 2;
void setup() {
  Serial.begin(9600);
  pinMode(but, INPUT_PULLUP);
  Serial.println("setup");
}
void loop() {
  if (digitalRead(but) == true ) {
    if (digitalRead(but) == false) {
      Serial.println("Fehler ");
     }
   }
}

Eigentlich solte doch "Fehler" nie ausgegeben werden oder wo habe ich da ein Fehler?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Du liest den Pin zweimal.
Wenn er zwischen den Lesevorgängen den Wert ändert, entsteht dein "Fehler".

It depends how much time is between the digitalRead statements in the actual code.

Es hängt davon ab, wie viel Zeit zwischen den digitalRead-Anweisungen liegt.

habe es mal schnell auf einen nackten nano geflasht und seit 30 minuten (nichts an Pin2 angeschlossen) keinen "Fehler". Könnte vielleicht an dem liegen, was bei Dir dort angeschlossen ist,.. oder der verwendete Microcontroller hat den Schaden und der interne Pullup funktioniert nicht (k.a., ob sowas möglich ist)

Ja der Fehler kommte nur beim wechel von dem schalter
Was ich irgendwie aber nicht ganz Kapiere weil entwer sollte es 0 oder 1 sein

Schalter und Taster prellen. Google mal danach.

Kann eigentlich nicht sein weil wenn ich danach noch mal abfrage immer der Fehler kommt

int but = 2; 
void setup() { 
  Serial.begin(9600);
  pinMode(but, INPUT_PULLUP); 
  Serial.println("setup");
 }
 void loop() {
   if (digitalRead(but) == true ) {
     if (digitalRead(but) == false) { 
       if (digitalRead(but) == true ) {
         if (digitalRead(but) == false) { 
           Serial.println("Fehler ");
         }
       }
      } 
    }
 }

Du musst mir nicht glauben, dass dein Schalter prellt, ist ja dein Schalter.

Lies einen Pinwert in eine Variable und benutze die Variable.

Und genau das beweist doch, dass der Schalter prellt.

Nur zum Spaß: flash doch mal diesen Sketch. Der zählt alle Flankenwechsel die bei einer Tasterbetätigung (high zu low beim Drücken, low zu high beim Loslassen) auftreten und gibt sie im 2-Sekunden-Takt auf dem Seriellen Monitor aus. Idealerweise sollte er pro Drücken und Loslassen +2 registrieren. Bei einem quick-and-dirty-test bei mir kann das aber auch mal schnell 4, 6, 8 oder noch mehr Sprünge machen... Ergo: Taster prellt.

int but = 2;
bool btnstate, btnlaststate;
unsigned long counter = 0;
unsigned long serialtimer;

void setup() {
  Serial.begin(9600);
  pinMode(but, INPUT_PULLUP);
  Serial.println("setup");
  btnlaststate = HIGH;
}
void loop() {
  btnstate = digitalRead(but);
  if (btnstate != btnlaststate) {   // Flankenerkennung High <-> Low
    counter++;  
  }
  btnlaststate = btnstate;
  if ((millis() - serialtimer) > 2000) {      // alle 2 Sekunden eine Ausgabe auf dem Serial Monitor
    Serial.print  ("Flankenerkennungen: ");
    Serial.println(counter);
    serialtimer = millis();
  }
}

Abhilfe schafft da eine geeignete Bibliothek (z.B. Bounce2), die das Entprellen für Dich übernimmt.

Wieso Spaß....für mich ist das purer Ernst. :wink: Und toller Lerneffekt.

Danke für die info. Ich komme einfach eher aus der well von Sps (z.B Siemens sps) und von da kenn ich es garnicht das Schaltern "Prellen" können. Danke für die info ich werde mich mit dem Thema meher auseinandersetzen und dann schauen wie ich es lösen will

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.