From c76aa08c83c6c4f041dc94ab3a4189bdee58c326 Mon Sep 17 00:00:00 2001 From: Olli Graf Date: Wed, 3 May 2023 10:44:36 +0200 Subject: [PATCH] Taster lesen. --- gpio/button.py | 37 +++++++++++++++++++++++++++++++++++++ gpio/ledserver.py | 43 +++++++++++++++++++++++++++++++++---------- 2 files changed, 70 insertions(+), 10 deletions(-) create mode 100755 gpio/button.py diff --git a/gpio/button.py b/gpio/button.py new file mode 100755 index 0000000..ea33582 --- /dev/null +++ b/gpio/button.py @@ -0,0 +1,37 @@ +#! /usr/bin/python3 +import RPi.GPIO as GPIO +from time import sleep +import logging + + +__PIN__ = 16 # GPIO Pin, für den Taster +__WAIT__ = 0.5 # Warten für 0,5 Sekunden +logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=logging.DEBUG) + +if __name__ =='__main__': + GPIO.setwarnings(False) +# benutze Broadcom Pin Nummerierung + GPIO.setmode(GPIO.BCM) + +# Pin 16 als Input mit Pull-Up-Widerstand schalten. + logging.debug(f'konfiguriere Pin ${__PIN__} als Input.') + GPIO.setup(__PIN__, GPIO.IN, pull_up_down=GPIO.PUD_UP) + pressed = False + + logging.debug('Start der Schleife.') + try: + while True: + if not GPIO.input(__PIN__): + if not pressed: + logging.info('Button wurde gedrückt.') + pressed = True + else: + logging.debug('Button nicht gedrückt.') + pressed = False + + sleep(__WAIT__) + except KeyboardInterrupt: + logging.debug('Abbruch durch Benutzer.') + finally: + pass + diff --git a/gpio/ledserver.py b/gpio/ledserver.py index 16c7370..27b8e2b 100755 --- a/gpio/ledserver.py +++ b/gpio/ledserver.py @@ -4,25 +4,41 @@ import socketserver import logging from led import setLED - +responsehtml = '

LED-Server

LED ist $ledstate_str

' logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=logging.DEBUG) +# Da http ein stateless Protokoll ist, wird der Handler bei jedem Request neu +# aufgebaut! Deswegen benutzen wir hier setup() statt __init__() class LEDHttpRequestHandler(SimpleHTTPRequestHandler): + def setup(self): + logging.debug('setting up Handler') + self.ledstate = False + super().setup() + def do_GET(self): logging.debug(f'path= {self.path}') logging.debug('GET: empfangen') - logging.debug(f'Request: {self.request}') self.send_response(200) self.send_header('Content-Type:','text/html') +# Ende der Header markieren, dass ist wichtig, sonst kommt der Response nicht zurück! + self.end_headers() - if 'led=on' in self.path: - logging.debug('schalte LED ein') - setLED(True) - else: - logging.debug('schalte LED aus') - setLED(False) +#Wenn im Requestpath 'led='on'enthalten ist, schalten wir die LED ein. Bei off aus + if '?led=' in self.path: + if 'on' in self.path: + logging.debug('schalte LED ein') + self.ledstate = True + setLED(self.ledstate) + elif 'off' in self.path: + logging.debug('schalte LED aus') + self.ledstate = False + setLED(self.ledstate) - self.wfile.write('

LED geschaltet

'.encode()) + logging.debug(f'ledstate={self.ledstate}') + + response = responsehtml.replace('$ledstate_str',('aus','an')[self.ledstate]) + + self.wfile.write(response.encode()) @@ -35,12 +51,19 @@ class http_server: if __name__ == '__main__': logging.debug('MAIN: start') + setLED(False) # Beim Start LED ausschalten +#Request-Handler aufbauen handler = LEDHttpRequestHandler - with socketserver.TCPServer(('',9000),handler) as httpd: + handler.ledstate = False +#Socketserver mit unserem Handler starten + with socketserver.TCPServer(('',8080),handler) as httpd: logging.info('SERVER: start') try: +#Server läuft bis CTRL-C gedrückt wird. httpd.serve_forever() except KeyboardInterrupt: pass + finally: + setLED(False)