Raspberry Pi - Knop - Lang indrukken en kort indrukken

Deze handleiding legt uit hoe u met de Raspberry Pi een lange en korte indrukking van een knop kunt detecteren. Om het eenvoudig te houden, verdelen we het in de volgende voorbeelden:

In de laatste sectie onderzoeken we hoe u debouncing in een praktische situatie kunt gebruiken. Voor meer informatie over waarom debouncing bij knoppen noodzakelijk is, raadpleeg dit artikel. Zonder debouncing kunt u per ongeluk een korte indrukking van de knop verkeerd detecteren.

Hardware Vereist

1×Raspberry Pi 5
1×Breadboard-montage knop met kap
1×Breadboard-montage knop kit
1×Paneel-montage drukknop
1×Drukknopmodule
1×Breadboard (experimenteerprint)
1×Jumper wires
1×(Aanbevolen) Schroefklem Block Shield voor Raspberry Pi
1×(Aanbevolen) Raspberry Pi Prototyping Basisplaat & Breadboard Kit
1×(Aanbevolen) HDMI-Touchscreen-Monitor voor Raspberry Pi

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de Knop

Als u niet bekend bent met knoppen (inclusief pinouts, werking en programmering), kunnen de volgende tutorials u op weg helpen:

Bedradingsschema

Raspberry Pi Knop bedradingsschema

This image is created using Fritzing. Click to enlarge image

Om uw bekabelingsopstelling te vereenvoudigen en te organiseren, raden we het gebruik van een Schroevenklemaansluiting-shield voor Raspberry Pi aan. Deze shield zorgt voor veiligere en beter beheerbare verbindingen, zoals hieronder weergegeven:

Raspberry Pi Schroevenklemaansluiting-Shield

In deze tutorial maken we gebruik van de interne pull-up weerstand. Dit betekent dat de knopstatus HIGH is wanneer de knop niet ingedrukt is, en LOW wanneer de knop ingedrukt wordt.

Hoe detecteert u een korte indrukking

We berekenen de tijd tussen het indrukken en loslaten van de knop. Als deze periode korter is dan een vooraf bepaalde tijd, registreren we een korte indrukking.

Specificeer de duur van een korte indrukking.

SHORT_PRESS_TIME = 0.5 # 500 milliseconden
  • Detecteer wanneer de knop is ingedrukt en registreer het tijdstip van indrukken.
if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Knop is ingedrukt press_time_start = time.time()
  • Bepaal wanneer de knop is losgelaten en registreer het tijdstip van loslaten.
if prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Knop is losgelaten press_time_end = time.time()
  • Bereken de drukduur.
press_duration = press_time_end - press_time_start
  • Vergelijk de drukduur met de gedefinieerde korte indrukkingstijd om een korte indrukking te identificeren.
if press_duration < SHORT_PRESS_TIME: print("Een korte indrukking is gedetecteerd")

Raspberry Pi Code voor het detecteren van de korte indrukking

Snelle stappen

  • Zorg dat u Raspbian of een ander Raspberry Pi compatibel besturingssysteem op uw Pi hebt geïnstalleerd.
  • Zorg dat uw Raspberry Pi verbonden is met hetzelfde lokale netwerk als uw pc.
  • Zorg dat uw Raspberry Pi verbonden is met internet als u nog libraries moet installeren.
  • Als dit uw eerste keer met Raspberry Pi is, bekijk dan de handleiding: Raspberry Pi instellen.
  • Verbind uw pc met de Raspberry Pi via SSH met de ingebouwde SSH-client op Linux en macOS of PuTTY op Windows. Zie hoe verbind ik mijn pc via SSH met Raspberry Pi.
  • Zorg dat de RPi.GPIO bibliotheek geïnstalleerd is. Zo niet, installeer die met het volgende commando:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Maak een Python-scriptbestand met de naam short_press.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 SHORT_PRESS_TIME = 0.5 # 500 milliseconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration < SHORT_PRESS_TIME: print("A short press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • Sla het bestand op en voer het Python-script uit via het terminal met het volgende commando:
python3 short_press.py
  • Druk meerdere keren kort op de knop.
  • Bekijk het resultaat in de Terminal.
PuTTY - Raspberry Pi
A short press is detected A short press is detected A short press is detected

Het script draait in een oneindige lus totdat u Ctrl + C indrukt in de terminal.

Hoe detecteert u een lange indrukking

Er zijn twee scenario’s om een lange indrukking te herkennen:

  • Het lange-indrukken evenement wordt pas herkend nadat de knop is losgelaten.
  • Het lange-indrukken evenement wordt herkend terwijl de knop ingedrukt wordt gehouden, nog vóór het loslaten.

In het eerste scenario wordt de tijd tussen indrukken en loslaten berekend. Als deze tijd langer is dan een vooraf bepaalde tijd, wordt een lange indrukking geregistreerd.

In het tweede scenario wordt de duur van het indrukken continu gecontroleerd zolang de knop ingedrukt is. Zodra de duur de vooraf bepaalde tijd overschrijdt, wordt de lange indrukking herkend, zelfs als de knop nog niet is losgelaten.

Raspberry Pi Code voor het detecteren van lange indrukking bij loslaten

Snelle stappen

  • Maak een Python-scriptbestand met de naam long_press_1.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 LONG_PRESS_TIME = 1.0 # 1 seconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration >= LONG_PRESS_TIME: print("A long press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • Sla het bestand op en voer het Python-script uit via het terminal met het volgende commando:
python3 long_press_1.py
  • Houd de knop 2 seconden ingedrukt en laat daarna los.
  • Bekijk het resultaat in de Terminal.
PuTTY - Raspberry Pi
A long press is detected

Het lange-indrukken evenement wordt alleen herkend op het moment dat de knop losgelaten wordt.

Raspberry Pi Code voor het detecteren van lange indrukking tijdens indrukken

Snelle stappen

  • Maak een Python-scriptbestand met de naam long_press_2.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 LONG_PRESS_TIME = 1.0 # 1000 milliseconds (1 second) # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 is_pressing = False is_long_detected = False # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() is_pressing = True is_long_detected = False elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released is_pressing = False if is_pressing and not is_long_detected: press_duration = time.time() - press_time_start if press_duration > LONG_PRESS_TIME: print("A long press is detected") is_long_detected = True # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • Sla het bestand op en voer het Python-script uit via het terminal met het volgende commando:
python3 long_press_2.py
  • Houd de knop enkele seconden ingedrukt en laat de knop los.
  • Bekijk het resultaat in de Terminal.
PuTTY - Raspberry Pi
A long press is detected

Het lange-indrukken evenement wordt al gedetecteerd terwijl de knop nog ingedrukt is, dus ook vóór het loslaten.

Hoe detecteert u zowel lange als korte indrukking

Snelle stappen

  • Maak een Python-scriptbestand met de naam long_short_press.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-button-long-press-short-press import RPi.GPIO as GPIO import time BUTTON_PIN = 16 SHORT_PRESS_TIME = 0.5 # 500 milliseconds LONG_PRESS_TIME = 1.0 # 1 seconds DEBOUNCE_TIME = 0.1 # 100 milliseconds # Variables will change: prev_button_state = GPIO.LOW # the previous state from the input pin button_state = None # the current reading from the input pin press_time_start = 0 press_time_end = 0 # Set up GPIO and configure the pull-up resistor GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Perform debounce by waiting for DEBOUNCE_TIME time.sleep(DEBOUNCE_TIME) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: # Button is pressed press_time_start = time.time() elif prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: # Button is released press_time_end = time.time() press_duration = press_time_end - press_time_start if press_duration < SHORT_PRESS_TIME: print("A short press is detected") elif press_duration >= LONG_PRESS_TIME: print("A long press is detected") # Save the last state prev_button_state = button_state except KeyboardInterrupt: print("\nExiting the program.") GPIO.cleanup()
  • Sla het bestand op en voer het Python-script uit via het terminal met het volgende commando:
python3 long_short_press.py
  • Druk korte en lange tijd op de knop.
  • Bekijk de resultaten in de Terminal.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Waarom zijn lange en korte indrukking nodig?

  • Om het aantal knoppen te minimaliseren, kan één knop meerdere functies uitvoeren. Bijvoorbeeld: een korte indrukking kan worden gebruikt om een bedieningsmodus te wisselen, terwijl een lange indrukking het apparaat uitschakelt.
  • Een lange indrukking helpt per ongeluk indrukken te voorkomen. Sommige apparaten gebruiken een knop om een fabrieksreset te starten. Onbedoeld indrukken kan gevaarlijk zijn. Daarom werkt het apparaat zo dat een fabrieksreset alleen begint als de knop gedurende een bepaalde tijd wordt vastgehouden (bijvoorbeeld 5 seconden).

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!