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.
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.
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.
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.
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."
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....
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.