Author Topic: Python: LCD20x4 Display - Button Pressed und Callback  (Read 601 times)

topi

  • Newbie
  • *
  • Posts: 13
    • View Profile
Python: LCD20x4 Display - Button Pressed und Callback
« on: September 08, 2017, 15:53:50 »
Hallo,
ich bin mit meinem marginalen Python-Kenntnissen ans vorläufige Ende gekommen und hoffe auf Tipps der Python-Kenner hier im Forum.
Gegeben und funktionierend, basierend auf den Beispielen im Tinkerforge Website, ist folgender Python-Code:
Code: [Select]
HOST = "localhost"
PORT = 4223
UID = "XXX" # Change XYZ to the UID of your LCD 20x4 Bricklet

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_lcd_20x4 import BrickletLCD20x4
import os

# Callback function for button pressed callback
def cb_button_pressed(button):
    print("Button Pressed: " + str(button))
    print("backlight=",lcd.is_backlight_on())
    if button == 0:
      if lcd.is_backlight_on() is True:
        lcd.backlight_off()
      else:
        lcd.backlight_on()
    if button == 3:
      os.system("sudo systemctl reboot")   


# Callback function for button released callback
def cb_button_released(button):
    print("Button Released: " + str(button))

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    lcd = BrickletLCD20x4(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Register button pressed callback to function cb_button_pressed
    lcd.register_callback(lcd.CALLBACK_BUTTON_PRESSED, cb_button_pressed)

    # Register button released callback to function cb_button_released
    #lcd.register_callback(lcd.CALLBACK_BUTTON_RELEASED, cb_button_released)

    input("Press key to exit\n") # Use input() in Python 3
    ipcon.disconnect()
Wo ich nun nicht mehr weiter weiss ist, wie kann ich für Button 3 eine funktionale Abfrage einbauen in der Art "Bitte Button 3 nochmals drücken für System Reboot!" Button 3 soll dabei innerhalb von 5 Sekunden nochmals gedrückt werden, ansonsten würde alles wieder in den Ausganszustand zurückfallen.
Vielen Dank für hilfreiche Tipps im Voraus,
topi

__LC__

  • Newbie
  • *
  • Posts: 8
    • View Profile
Re: Python: LCD20x4 Display - Button Pressed und Callback
« Reply #1 on: September 09, 2017, 22:21:31 »
Moin topi.

Anbei mal ein einfaches Beispiel wie du es machen könntest:

Code: [Select]
from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_lcd_20x4 import BrickletLCD20x4
import os, time

def callback_wrapper():
    timestamp = -1
    def cb_button_pressed(button):
        print("Button {0} pressed...".format(button))

        if button == 0:
            if lcd.is_backlight_on():
                lcd.backlight_off()
            else:
                lcd.backlight_on()
        elif button == 3:
            nonlocal timestamp
            if time.time() - timestamp > 5:
                print('Press button 3 within the next 5 seconds again...')
                timestamp = time.time()
            else:
                print('Shutdown now...')
                timestamp = -1      # This line is only necessary for testing purpose without real shutdown!
    return cb_button_pressed


if __name__ == "__main__":

    UID = "XYZ" # Change XYZ to the UID of your LCD 20x4 Bricklet
    HOST = "127.0.0.1"
    PORT = 4223

    ipcon = IPConnection()
    lcd = BrickletLCD20x4(UID, ipcon)
    ipcon.connect(HOST, PORT)

    button_pressed_callback = callback_wrapper()
    lcd.register_callback(lcd.CALLBACK_BUTTON_PRESSED, button_pressed_callback)

    input("Press key to exit\n")
    ipcon.disconnect()

Hoffe es entspricht dem was du dir vorgestellt hast. Bei Fragen einfach fragen.

Viele Grüße
__LC__

Nachtrag 10.09.2017: Zur besseren Übersichtlichkeit habe ich den Code-Schnipsel nochmal leicht abgeändert.
« Last Edit: September 10, 2017, 15:26:55 by __LC__ »

topi

  • Newbie
  • *
  • Posts: 13
    • View Profile
Re: Python: LCD20x4 Display - Button Pressed und Callback
« Reply #2 on: September 11, 2017, 08:19:48 »
Guten Morgen __LC__,
Herzlichen Dank für die schnelle Hilfe. Es funktioniert und ist das, was ich mir mit der Absicherung gegen versehentliches Drücken von Button 3 vorstellte  :)