I want a LED to flash, while some work is beeing done on my Raspberry. I am using a Thread for the LED in my Python script.
The initial code:
pinLED = 10
pinButton = 12
GPIO.setup(pinButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
working = False
status = 0
if status == 0:
status = 1
status = 0|
time.sleep(0.02) #found out that 0.02 is a good value to get every tiny button push and save resources
if GPIO.input(pinButton) == 1:
t = threading.Thread(target=flash)
working = True
time.sleep(5) #work would be here
working = False
except Exception as e:
I found no logic fault and i confirm it works, but used the following changes:
if __name__ == '__main__':.
GPIOcalls inside this
Avoid placing code that is executed on startup outside of
if __name__ == '__main__':
From the docs: Safe importing of main module One should protect the “entry point” of the program by using if __name__ == '__main__':
working = False, this guaranteed the thread has terminated befor starting it again.
working = False t.join()
I would suggest to change the
def flash(), to the following:
threading.Event() instead of a
global Instance and passing it together with the
This generalizes the
def flash(...) and allow its use with different
pinLED, even parallel.
threading.local() threadsafe, so instance’s values will be different for separate threads.
def flash(pinLED, flashing): status = threading.local() status.LED = False while flashing.is_set(): status.LED = not status.LED GPIO.output(pinLED, int(status.LED)) time.sleep(0.5) GPIO.output(pinLED, 0)
Changes to the
def main_thread(): flashing = threading.Event() flashing.clear() try: while True: time.sleep(0.02) if GPIO.input(pinButton) == 1: t = threading.Thread(target=flash, args=(pinLED, flashing,)) flashing.set() t.start() time.sleep(2) # work would be here flashing.clear() t.join() ...
Tested with Python:3.4.2