Was ist Falsch in meinem code?

Hallo,
das ist mein erster Post und ich bin relativ neu in der Arduino Welt.
Ich habe mir einen code geschrieben welcher wie folgt Funktionieren sollte:
Auf einem LCD Display sollte die ganze Zeit "Frei" angezeigt werden außer man drückt den Knopf. Dann sollte dort "Besetzt" stehen. Jetzt wird aber nur kurz 2 mal "Status Besetzt" angezeigt und das wars. Vllt habe ich auch etw Falsch verbunden aber es wäre wirklich hilfreich wenn jmd mit Erfahrung mal über den Code schauen kann.

#include <Wire.h>

#include <LiquidCrystal.h>

// LCD-Pins: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// Taster-Pin
const int buttonPin = 2;

// Variablen zur Zustandssteuerung
bool isOccupied = false;  // Zustand: Besetzt oder Frei
bool lastButtonState = LOW;  // Letzter Zustand des Tasters

void setup() {
  // LCD initialisieren
  lcd.begin(16, 2);  // 16 Zeichen, 2 Zeilen
  lcd.print("Status: Frei");

  // Taster-Pin initialisieren
  pinMode(buttonPin, INPUT);
}

void loop() {
  // Tasterstatus lesen
  bool currentButtonState = digitalRead(buttonPin);

  // Wenn der Taster gedrückt wurde (flankengesteuert)
  if (currentButtonState == HIGH && lastButtonState == LOW) {
    delay(500);  // Entprellen
    isOccupied = !isOccupied;  // Zustand wechseln

    // LCD entsprechend aktualisieren
    lcd.clear();
    if (isOccupied) {
      lcd.print("Status: Besetzt");
    } else {
      lcd.print("Status: Frei");
    }
  }

  // Tasterzustand speichern
  lastButtonState = currentButtonState;
}

Danke an jeden der mir helfen kann und einen angenehmen start in die Woche

Pullup?

Er fragt ja nach HIGH ab. Da bräuchte es eher ein PullDown. Oder?

Hallo @lennoxtsunami2468
herzlich willkommen im Arduino-Forum.

Super dass du den Code als Code-Section gepostest hast.

na Hauptsache über das drei-Zeichenlimit der Forensoftware drüber gekommen.

Und aus diesem Text kann man schlussfolgern, dass noch nicht so viel Wissen da ist.

Du hast am Taster vermutlich einen Kontakt mit dem IO-pin
und den anderen mit + 5V verbunden.

So lange der Taster nicht gedrückt ist, ist keine definierte Spannung auf der Leitung.
Dann fungiert die Leitung vom Taster zum IO-pin als Antenne die den elektromagnetischen Wellensalat einfängt und dann dem IO-pin eben doch des öfteren ein HIGH-Signal anliefert.

Das passiert so weil der Eingangswiderstand des IO-pins sehr hoch ist. Deswegen reicht dann das bisschen elektromagnetische Energie um den IO-pin zum zufälligen Umschalten
zwischen LOW und HIGH zu bringen.

Hier ist dein Code in einer WOKWI-Simulation. Da funktioniert dein Code weil es in der Simulation keine elektromagnetischen Störungen gibt. Was die Simulation jedoch macht ist das mechanische Prellen des Tasters zu machen.

Die function delay() ist zwar schön einfach macht aber bei größeren Programmen viele Probleme.

Hier die WOWKI-Simulation von deinem Code. Die Anschlussbelegung des LCDs hat eine andere Reihenfolge.

Code
// LCD1602 to Arduino Uno connection example

#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(12, 11, 10, 9, 8, 7); 
//LiquidCrystal lcd(7, 8, 9, 10, 11, 12); originalBelegung

// Taster-Pin
const int buttonPin = 2;

// Variablen zur Zustandssteuerung
bool isOccupied = false;  // Zustand: Besetzt oder Frei
bool lastButtonState = LOW;  // Letzter Zustand des Tasters

void setup() {
  // LCD initialisieren
  lcd.begin(16, 2);  // 16 Zeichen, 2 Zeilen
  lcd.print("Status: Frei");

  // Taster-Pin initialisieren
  pinMode(buttonPin, INPUT);
}

void loop() {
  // Tasterstatus lesen
  bool currentButtonState = digitalRead(buttonPin);

  // Wenn der Taster gedrückt wurde (flankengesteuert)
  if (currentButtonState == HIGH && lastButtonState == LOW) {
    delay(500);  // Entprellen
    isOccupied = !isOccupied;  // Zustand wechseln

    // LCD entsprechend aktualisieren
    lcd.clear();
    if (isOccupied) {
      lcd.print("Status: Besetzt");
    } else {
      lcd.print("Status: Frei");
    }
  }

  // Tasterzustand speichern
  lastButtonState = currentButtonState;
}

Microcontroller haben einen sogenannten internen PULLUP-Widerstand.
Damit wird der IO-pin schon im inneren des Microcontrollers mit +5V verbunden.
Man schließt dann den Taster am IO-pin und an GND an.

Ohne Tastendrücken ist der IO-pin dann über den internen PULLUP-Widerstand mit +5V verbunden und liest HIGH
Wenn man den Taster drückt dann liest der IO-pin LOW.
Man hat also umgekehrte Signal-pegel

Taster losgelassen: HIGH
Taster gedrückt: LOW

Das sieht dann so aus

code
// LCD1602 to Arduino Uno connection example

#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(12, 11, 10, 9, 8, 7); 
//LiquidCrystal lcd(7, 8, 9, 10, 11, 12); originalBelegung

// Taster-Pin
const byte buttonPin = 2;
// Konstanten die direkt so heissen dass sie sich selbst erklären
const byte losgelassen = HIGH;
const byte gedrueckt   = LOW;

// Variablen zur Zustandssteuerung
bool isOccupied = false;  // Zustand: Besetzt oder Frei
bool lastButtonState = LOW;  // Letzter Zustand des Tasters

void setup() {
  // LCD initialisieren
  lcd.begin(16, 2);  // 16 Zeichen, 2 Zeilen
  lcd.print("Status: Frei");

  // Taster-Pin initialisieren
  //pinMode(buttonPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // Tasterstatus lesen
  bool currentButtonState = digitalRead(buttonPin);

  // Wenn der Taster gedrückt wurde (flankengesteuert)
  if (currentButtonState == gedrueckt && lastButtonState == losgelassen) {
    delay(500);  // Entprellen
    isOccupied = !isOccupied;  // Zustand wechseln

    // LCD entsprechend aktualisieren
    lcd.clear();
    if (isOccupied) {
      lcd.print("Status: Besetzt");
    } else {
      lcd.print("Status: Frei");
    }
  }

  // Tasterzustand speichern
  lastButtonState = currentButtonState;
}

Sehe weder Pullup, noch Pulldown, weder im Schaltplan, noch im Text.
Will mir auch keinen da hin denken, auch wenn er notwendig ist.

Ach ja:
Natürlich könnte das Wort Pullup als Anstoß reichen, sich über das Thema schlau zu machen. Gefühlte 20 tausend Tutorials und Dokumentationen handeln den Umstand ab.

Der Code des TO fragt den Taster auf HIGH ab. Da ist ein PullUp Unsinn. Warum fragst du dann nach ein PullUp?

Ja dann wäre doch effektiv einen Link zu einem guten Tutorial zu posten.

Weil er in vielen µC schon eingebaut ist, muss man nur aktivieren.
Eingebaute Pulldown sind viel seltener.
Zudem ist er mir als erstes eingefallen.

Sowieso ist es (mir) doch völlig egal, ob Pulldown oder Up, man muss es nur richtig machen.

Nein das wäre es nicht.

Effektiv ist, wenn jeder Einsteiger lernt sich selber kundig zu machen. Dazu reicht ein Stichwort und Google.
Ich vermute, man wird im Arduino Umfeld häufiger Pullup antreffen/finden, als Pulldown.

Das Romane vorkauen, auch gerne zum xten mal, überlasse ich dir doch gerne.

Und wie hilft das dem TO, wenn er einen PullUp aktiviert, obwohl er einen PullDown bräuchte?

Wieso soll er einen Pulldown brauchen?

Braucht er einen Pulldown?

Kann doch genauso gut einen Pullup verwenden.
Eine kleine Änderung im Code, und fertig!

Zudem hält er ja auch geheim, was er da hat.
Board geheim, Schaltplan geheim.

Dann muss er aber auch den Taster nach GND klemmen.
Oder halt nen Pulldown einbauen.

Ich finde auch, man sollte gerade Anfänger nicht mit Fragmenten abfrühstücken, sondern insbesondere auch wegen der Netiquette ein paar mehr Worte opfern.
Also z.B. "Aktiviere den eingebauten Pullup und verdrahte den Taster gegen GND. Dann frage im Code auf LOW ab und Du weißt, dass der Taster gedrückt ist."

Aber das ist natürlich nur meine Meinung.

2 Likes

Da er den Statuswechsel nimmt und auf einen vorherigen Status prüft, ist die Frage, ob es eine Codeänderung benötigt.
Dann wird auf den losgelassenen Taster reagiert....

Und warum wird das verschwiegen?

Ein PullDown macht bei einer HIGH Abfrage im Code ob der Taster gedrückt ist mehr Sinn.
Natürlich kann man alles umstricken. Aber dieses

Verwirrt mehr als das es Lösung bringt.

Mein "Pullup?" ist einfach nur ein Stichwort zu der Problematik.
Evtl. gar eine Frage..

Warum lässt Du dem User nicht die Wahlfreiheit?

Willkommen lennoxtsunami2468!

Ich bin mir noch nicht ganz sicher, was Du mit

Jetzt wird aber nur kurz 2 mal "Status Besetzt" angezeigt und das wars.

meinst. Was passiert danach? Und zwischen den 2 Mal?

Ein Problem könnte sein, dass Du nur den Übergang zu Button gedrückt entprellst, aber nicht den Übergang zu loslassen.

Gruß
Nils

Hast Du Dir die entsprechende Codezeile angesehen?

Ja.

Worauf zielt diese Frage ab? Irre ich mich? Kann sein, aber nach meinem Verständnis, wird das Loslassen hier nicht entprellt.
Und wenn es einen Preller beim Loslassen gibt, wird einfach das nächste Besetzt aktiv. Oder?

Das tue ich, daher habe ich auch mit "z.B." gestartet. Mein Beitrag sollte das einsilbig eingeworfene Thema Pullup aufgreifen und darstellen, wie ich mir Anfängerhilfe vorstellen kann und ich mir auch wünsche wenn ich ein Problem habe.
Natürlich helfen Stichworte, aber ganze Sätze helfen meist besser.