소스 뷰어
from picozero import LED, Button
from time import sleep, time
# 버튼과 신호등 초기화
button = Button(16) # GPIO 핀 16에 연결된 버튼을 설정
# 신호등 및 관련 타이밍 설정
lights = [ LED(28), LED(27), LED(26)] # 빨강, 노랑, 초록 순서의 신호등 리스트
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 # 경과 시간 초기화
# 현재 신호가 유효하고, 경과 시간이 지정된 시간을 넘지 않을 때까지 신호등 깜빡임
period = 0
while curr_signal_no == signal_no and elapsed < duration:
if duration - elapsed <= 2 :
# 남은 시간이 2초 이내일 때 신호등 점멸
period += 1
if period%2 : light.off()
else : light.on()
else:
light.on() # 신호등 켜기
pass
sleep(0.25) # 짧은 지연 시간 설정
elapsed = time() - start_time # 경과 시간 업데이트
pass
# 신호 번호가 변경되지 않았으면 다음 신호등으로 이동
if curr_signal_no == signal_no:
light_no += 1
pass
pass