Ein schönes Einsteigerproblem mit GPIO und Python ist eine Ampelsteuerung.
Ich habe zwei Ampeln (Hauptstrasse und 90 Grad dazu die Nebenstrasse) auf meinem Breadboard per GPIO verfügbar und steuere die momentan über einen Thread pro Ampel. Das läuft auch sehr gut - aber da irgendwann die beiden Threads mit ihrem Timing auseinanderlaufen werden, muss ein gemeinsamer Taktgeber her. Ich denke das läuft auch in der Realität so.
Welche Methode sollte man dazu benutzen? signals sind wohl nicht der richtige Weg.
Anbei mein momentaner Ampelcode mit Threading und Classes (es fehlt noch der 'Inaktivstatus' - also wenn nur die mittlere Lampe ständig blinkt ... kommt aber noch):
Python
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
from threading import Thread
GPIO.setmode(GPIO.BOARD)
# GPIO pins for red yellow green
trafficLight1=[18,22,7]
trafficLight2=[13,15,16]
SLEEP_MAIN=3
SLEEP_TRANSITION=1
# traffic lights shown (red, yellow, green) and the time it's shown
phases=[
[[1,0,0],SLEEP_MAIN], # red
[[1,1,0],SLEEP_TRANSITION], # red yellow
[[0,0,1],SLEEP_MAIN], # green
[[0,1,0],SLEEP_TRANSITION] # yellow
]
class TrafficLightThread(Thread):
def __init__(self,trafficLight):
Thread.__init__(self)
self.trafficLight=trafficLight
def run(self):
while True:
self.trafficLight.setNextPhase()
class TrafficLight:
# init GPIO pins and set LEDs according phase
def __init__(self,pins, initialPhase=0):
(self.red, self.yellow, self.green) = pins
GPIO.setup(self.green,GPIO.OUT)
GPIO.setup(self.yellow,GPIO.OUT)
GPIO.setup(self.red,GPIO.OUT)
assert initialPhase >= 0 and initialPhase <= len(phases)
self.phase=initialPhase
self.setPhase(self.phase)
# reset all LEDs
def __del__(self):
self.setRed(False)
self.setYellow(False)
self.setGreen(False)
def setRed(self,state=True):
GPIO.output(self.red,state)
def setYellow(self,state=True):
GPIO.output(self.yellow,state)
def setGreen(self,state=True):
GPIO.output(self.green,state)
# set LEDs according phase
def setPhase(self,phase):
assert phase>=0 and phase<=len(phases)
self.phase=phase
self.setRed(phases[phase][0][0])
self.setYellow(phases[phase][0][1])
self.setGreen(phases[phase][0][2])
# advance to next phase modulo number of phases
def setNextPhase(self):
time.sleep(phases[self.phase][1])
self.setPhase((self.phase +1) % len(phases))
try:
light1=TrafficLight(trafficLight1,0)
light2=TrafficLight(trafficLight2,2)
t1=TrafficLightThread(light1)
t2=TrafficLightThread(light2)
t1.start()
t2.start()
t1.join()
t2.join()
except KeyboardInterrupt:
pass
finally:
print "Cleaning GPIO up"
#GPIO.cleanup()
Display More