소스 뷰어
from gpiozero import TrafficLights, Button
from time import sleep, time
# 버튼과 신호등 초기화
button = Button(21) # GPIO 핀 21에 연결된 버튼을 설정
tr = TrafficLights(23, 24, 25) # GPIO 핀 23, 24, 25에 각각 초록, 노랑, 빨강 신호등을 설정
# 신호등 및 관련 타이밍 설정
lights = [tr.green, tr.amber, tr.red] # 초록, 노랑, 빨강 순서의 신호등 리스트
durations = [5, 3, 10] # 각 신호등이 켜져 있을 시간 (초)
light_no = 0 # 현재 신호등 인덱스
signal_no = 0 # 신호 변경 카운터
# 신호를 변경하는 함수
def change_signal():
global light_no, signal_no
signal_no += 1 # 신호 변경 카운터 증가
light_no += 1 # 다음 신호등으로 이동
pass
# 버튼이 눌렸을 때 change_signal 함수가 실행되도록 설정
button.when_pressed = change_signal
# 무한 루프 시작
while True:
# 모든 신호등을 꺼둠
for light in lights:
light.off()
pass
# 신호등 인덱스가 리스트 범위를 넘지 않도록 조정
light_no = light_no % len(lights)
curr_signal_no = signal_no # 현재 신호 번호 저장
light = lights[light_no] # 현재 켜야 할 신호등 선택
duration = durations[light_no] # 현재 신호등이 켜질 시간 설정
start_time = time() # 신호등 시작 시간을 기록
elapsed = 0 # 경과 시간 초기화
# 현재 신호가 유효하고, 경과 시간이 지정된 시간을 넘지 않을 때까지 신호등 깜빡임
while curr_signal_no == signal_no and elapsed < duration:
if duration - elapsed <= 2 and int((duration - elapsed)/0.25)%2 == 0 :
# 남은 시간이 1초 이내일 때 신호등 점멸
light.off()
else:
light.on() # 신호등 켜기
pass
sleep(0.1) # 짧은 지연 시간 설정
elapsed = time() - start_time # 경과 시간 업데이트
pass
# 신호 번호가 변경되지 않았으면 다음 신호등으로 이동
if curr_signal_no == signal_no:
light_no += 1
pass
pass