from unihiker_k10 import pin, rgb, button, screen
import time
import asr
# 语音初始化
asr.init_asr()
asr.start_asr()
asr.start_tts()
screen.init(dir=2)
# 引脚定义
p0 = pin(0) # 震动
p1 = pin(1) # 人体红外
trigger_mode = False
p0.write_digital(0)
def button_a_pressed():
global trigger_mode
trigger_mode = True
bt_a = button(button.a)
bt_a.event_pressed = button_a_pressed
# 时间参数
GREEN_NORMAL = 30
YELLOW_NORMAL = 5
RED_NORMAL = 25
EMERGENCY_GREEN = 10
light_state = 0 # 0绿 1黄 2红
countdown = GREEN_NORMAL
# 灯光控制
def set_light(r, g, b):
rgb.write(num=0, R=0, G=0, B=0)
rgb.write(num=2, R=r, G=g, B=b)
# 屏幕显示
def show_text(msg):
screen.clear()
screen.draw_text(text=msg, line=1, font_size=24, color=0x00FFFF)
screen.show_draw()
# 主循环
while True:
human_detected = p1.read_digital() == 0
# 触发:人体 或 按钮
if human_detected or trigger_mode:
trigger_mode = False
# 语音+震动
asr.add_tts_data("请通行")
p0.write_digital(1)
time.sleep(0.5)
p0.write_digital(0)
# 紧急绿灯10秒
set_light(0, 255, 0)
for i in range(EMERGENCY_GREEN, 0, -1):
show_text(f"绿灯倒计时:{i}秒")
time.sleep(1)
show_text("恢复正常红绿灯")
time.sleep(1)
light_state = 0
countdown = GREEN_NORMAL
continue
# 正常红绿灯
if light_state == 0:
show_text(f"绿灯:{countdown}秒")
set_light(0, 255, 0)
elif light_state == 1:
show_text(f"黄灯:{countdown}秒")
set_light(255, 255, 0)
else:
show_text(f"红灯:{countdown}秒")
set_light(255, 0, 0)
time.sleep(1)
countdown -= 1
if countdown < 0:
if light_state == 0:
light_state = 1
countdown = YELLOW_NORMAL
elif light_state == 1:
light_state = 2
countdown = RED_NORMAL
else:
light_state = 0
countdown = GREEN_NORMAL