Ein Taster hat immer zwei Zustände: gedrückt oder nicht gedrückt. Dieser Wert kann abgefragt werden und je nach Zustand kann dann bspw. eine LED angeschaltet oder ausgeschaltet werden. In diesem Abschnitt lernst du die eltronische Beschaltung eines Tasters kennen und kannst den Zustand des Tasters auslesen. Des Weiteren lernst du wie man einen Taster entprellt und den Zustand speichert.
Mit einem Taster (s. Abb. 1) kann man bspw. ein Licht anschalten. Je nach Tastendruck und elektronischer Schaltung liegt an dem angeschlossenen Pin entweder 0 V (pull-down) oder 3,3 V (pull-up). Dieser Zustand kann mit Hilfe einer Entscheidung ausgewertet werden.
from machine import Pin
import time
button = Pin(17, mode=Pin.IN, pull=Pin.PULL_DOWN)
led = Pin(27, Pin.OUT)
while True:
if button.value() == 1:
led.on()
else:
led.off()
Man beachte, dass der Wert des Tasters entweder eine logische 0 oder 1 ist. So kann ganz einfach der Zustand des Tasters bestimmt werden.
Für die logische Auswertung des Tasters in Abb. 2 ist es von Bedeutung, dass der Wert am Mikrocontrollerpin 17 entweder 0 V oder 3,3 V ist. Es darf keinen schwebenden Zustand, sprich der Wert liegt dazwischen oder ist unbestimmt, geben. Die Schaltung in Abb. 2 garantiert genau dies. Der sogenannte Pull-Down-Widerstand zieht die Spannung bei unbetätigtem Taster am Mikrocontrollerpin nach auf 0 V hoch. Wird der Taster gedrückt liegen 3,3 V am Pin an.
Man beachte, dass beim Tausch von Taster und Pull-Up-Widerstand die Spannung nach oben auf 3,3 V gezogen wird und wir dann von einem Pull-Up-Widerstand sprechen. In diesem Fall liegt beim Betätigen des Tasters, wie in unserem Fall, eine logische 0 am Controllerpin.
Der Schutzwiderstand sorgt dafür, das bei versehentlicher Programmierung des Pins als Ausgang kein Kurzschluss entsteht.
Taster
Für Fortgeschrittene Zustand merken
Der Schnee merkt sich jeden Skifahrer. Nicht so ein Taster: Betätigen wir ihn, ändert er seinen Zustand. Doch lassen wir ihn wieder los, sieht es so aus, als wäre er nie betätigt worden.
Taster kommen sehr häufig in Steuerungen zum Einsatz. Gegenüber einem Schalter haben sie zwei Vorteile. Erstens haben sie immer die identische Endposition und sie vermitteln beim Betätigen ein angenehmes taktiles Gefühl.
Im nächsten Schritt wollen wir den Taster dazu bringen, dass er sich wie der Schnee etwas merkt. Dazu verwenden wir Flags und States verwenden.
Flags und States sind Variablen. Flags sind immer einfache Variablen vom Datentyp Bolean. States sind Variablen die auch mehr Werte speichern können.
from machine import Pin
import time
button = Pin(17, mode=Pin.IN, pull=Pin.PULL_DOWN)
led = Pin(27, mode=Pin.OUT)
# States
ledState = False
lastState = 0
currentState = 0
while True:
currentState = button.value()
# Zustand hat sich geändert
if currentState != lastState:
# Nur reagieren, bei betätigtem Taster
if currentState == 1:
# LED umschalten
ledState = not ledState
led.value(ledState)
lastState = currentState
Wir verwenden drei States: ledState zum Umschalten der LED, currentState zum Speichern des aktuellen Tasterzustandes und lastState zum Speichern des letzten Tasterzustandes. Nur so können wir das Betätigen des Tasters eindeutig festhalten. Dies ist in diesem Fall die steigende Flanke von 0 auf 1.
Zuerst erfassen wir die Flanke, sprich wenn der Taster betätigt oder losgelassen wird: if currentState != lastState. Im zweiten Schritt erfassen wir, ob der Taster gedrückt wurde: if currentState == 1. Dann toggeln wir den Zustand der LED: ledState = not ledState und weisen der LED den neuen Wert zu: led.value(ledState).
Am Ende darf man nicht vergessen den lastState = currentState zu setzen, da sonst die Flanken beim Betätigen oder Loslassen des Tasters nicht mehr erkannt werden.
Ein Flugzeug landet unsanft auf der Landebahn. Der Pilot setzt mehrfach auf. Es ist als ob das Flugzeug hin- und herschwingt.
Die Kontaktfedern eines Taster können sowohl beim Betätigen als auch beim Loslassen nachschwingen, so dass es ungewollt zu mehrfachen Kontakten des Tasters kommt. Diese Eigenschaft nennt man das Prellen eines Tasters.
Um das unerwünschte Prellverhalten loszuwerden, da hierdurch bei einer Betätgigung des Tasters womöglich mehrere Kontakte gezählt werden, entprellt man den Taster. Dies ist entweder durch eine elektronische Schaltung möglich oder wie in unserem Fall durch eine softwaretechnische Lösung.
Abb. 5 zeigt das Zeitablaufdiagramm eines prellenden Tasters. Das Prellen tritt sowohl beim Drücken als auch beim Loslassen des Tasters auf. Darüber hinaus ist es auch möglich, dass durch Störungen der Zustand geändert wird.
Hardwaretechnisch Entprellen kann man, in dem man einen Kondensator parallel zum Pull-Down- oder Pull-Up-Widerstand schaltet. Dadurch werden kurzzeitige Signalschwankungen herausgefiltert. Eine Zustandsänderung tritt erst dann ein, wenn der Kondensator auf die Schaltschwelle des Mikrocontrollers ge- oder entladen ist.
Softwaretechnisch lässt sich das Entprellen durch eine Zeitverzögerung erreichen. Durch Ausprobieren kann man herausfinden, wie lang die Zeit nach dem Drücken und Loslassen jeweils sein muss. Dann packt man noch eine Reserve obendrauf und man erhält eine einfache Lösung.
from machine import Pin
import time
button = Pin(17, mode=Pin.IN, pull=Pin.PULL_DOWN)
led = Pin(27, Pin.OUT)
while True:
if button.value() == 1:
time.sleep_ms(20) # Entprellen
ledStatus = True
Flankenerkennung
Mehrfachbelegung eines Tasters für Fortgeschrittene
Du arbeitest daran deine Garten-LEDs mit einem Taster anzusteuern. Ziel ist, die Funktion des Tasters zu verstehen — Zustand abfragen, entprellen, Flankenerkennung — und daraus eine Schaltung/Programm zu bauen, bei der eine LED beim Tastendruck reagiert.
Folgender Beispiel-Code ist bereits vorhanden:
from machine import Pin
import time
button = Pin(99, mode=Pin.IN, pull=Pin.PULL_DOWN)
led = Pin(27, mode=Pin.OUT)
# States
ledState = False
currentState = False
lastState = False
while True:
3.1 Du möchtest zuerst die Grundlagen überprüfen
3.1.1 Wähle aus, wie der Pin des Tasters konfiguriert werden muss, damit man seinen Zustand zuverlässig abfragen kann.
Wähle eine Antwort.
Pin(99, mode=Pin.IN, pull=Pin.PULL_DOWN)Pin(99, mode=Pin.IN, pull=Pin.PULL_UP)Pin(17, mode=Pin.IN, pull=Pin.PULL_DOWN)Pin(17, mode=Pin.IN, pull=Pin.PULL_UP)3.1.2 Nenne, was dafür sorgt, dass der Eingangspin keinen „undefinierten“ Zustand annimmt, wenn der Taster nicht gedrückt ist. Wähle eine Antwort aus.
3.1.3 Wähle die korrekte Begründung wieso bei einem Pull-Up-Widerstand die Pin-Spannung beim offenen Taster 3,3 V beträgt. Wähle eine Antwort.
3.1.4 Wähle die korrekte Begründung wieso bei einem Pull-Down-Widerstand die Pin-Spannung beim betätigten Taster 3,3 V beträgt. Wähle eine Antwort.
3.2 Bevor du mit der eigentlichen Lösung des Problems beginnst, möchtest Du nochmal das Thema Flankenerkennung trainieren. Dein Kollege stellt dir hierzu zwei Fragen.
3.2.2 Wieso benötigt man hierzu 2 State-Variablen state1 und state2? Wähle eine Antwort.
3.3 Erstelle ein MicroPython-Programm für den ESP32, das folgendes tut:
lastState und currentState (state change detection).Optional (für Fortgeschrittene):
Die Lösung sollte folgendermaßen aussehen:
while True:
oled.fill(0)
oled.text(f"Temperatur: {temperatur:.2f}", 0, 0)
oled.show()
if temperatur >= 23:
led.on()
buzzer.toggle()
else:
led.off()
sleep(0.0025)
| die Flankenerkennung | der Mikrocontroller wurde so programmiert, dass er eine fallende oder steigende Flanke beim Betätigen des Tasters erkennt |
| der State | der Zustand oder Variable auf der ein Zustand gespeichert wird |
| das Flag | eine Variable vom Datentyp boolean |
ledState = not ledState |
toggeln eines Zustands, sprich der gespeicherte Wert wird invertiert RPulldown |
if button.value() == 1 |
Abfrage zum Erkennen des Tastendrucks |