Traffic-lights
电路连接
【元件实物图】
- 图1为Button,按钮的状态控制SIG引脚的电平值。
- 图2为RGB灯,有三种颜色:R-red、G-green、B-blue。三种颜色需由不同的GPIO引脚控制
- 图3为连接好按钮、RGB灯的树莓派
【GPIO引脚连线图】
【模拟连线图】
为了方便连接,RGB LED灯的三个引脚接GPIO 2、3、4,GND接GND。按钮的SIG引脚接GPIO 17, GND接GND。
代码实现
算法设计流程图
python环境配置
-
在Vscode中使用SSH连接树莓派
-
按Ctrl+Shift+~调用bash
-
在命令行中输入
python -m venv myenv
创建虚拟环境,其中myenv是自定义的虚拟环境名称
谢谢杨老板抓虫…之前写成pip了 -
在命令行中输入
source myenv/bin/activate
激活虚拟环境 -
在本次实验中需要安装以下包:
激活虚拟环境后输入以下命令安装包 pip install gpiozero pip install rpi-gpio pip install lgpio
-
在命令行中输入
deactivate
退出虚拟环境
三色呼吸灯实现
为了实现呼吸灯,首先需要控制灯的亮度实现渐变。TrafficLights类提供参数pwm,使用PWM 调光实现亮度的渐变。PWM调光的原理如下图所示。通过占空比来改变电子元件的功率。
因此可以写出代码如下,实现效果为:RGB灯以红、绿、蓝的颜色顺序循环呼吸,每个颜色呼吸3秒
# 呼吸灯效果函数
def breathe():
while breathing:
red_led.on()
red_led.pulse()
sleep(3)
red_led.off()
green_led.on()
green_led.pulse()
sleep(3)
green_led.off()
blue_led.on()
blue_led.pulse()
sleep(3)
blue_led.off()
breathe()
三色呼吸灯+按钮控制
加入按钮后。设置了一个布尔类型的breathing作为标志。当每次按下button的时候,调用button_pressed函数,当此时breathing为False,也就是当时没有在呼吸时,将breathing设为True,并调用breathe函数开始呼吸;当此时breathing为True,也就是当时在呼吸时,将breathing设为False,此时breathe函数内部每0.1秒检查一次breathing的值,此时检查为False则停止呼吸。循环进行,直到下一次按按钮。
实现效果为:
- 第一次按按钮,RGB开始以红、绿、蓝的顺序开始呼吸
- 第二次按按钮,呼吸停止
- 反复循环直至Ctrl+C退出程序
# 是否处于呼吸状态的标志
breathing = False
# 按钮按下时的处理函数
def button_pressed():
global breathing, breathe_thread
print(breathing)
# 创建并启动一个新线程来监视breathing变量的状态
if breathing==False:
# 如果不处于呼吸状态,则开始呼吸灯效果
breathing = True
# 创建并启动一个新线程来执行呼吸灯效果
breathe_thread = Thread(target=breathe)
breathe_thread.start()
else:
# 否则停止呼吸灯效果
breathing = False
red_led.off()
green_led.off()
blue_led.off()
# 呼吸灯效果函数
def breathe():
while breathing:
red_led.on()
red_led.pulse()
for i in range(30):
sleep(0.1)
if not breathing:
return
red_led.off()
...
# 创建按钮对象,代表控制按钮
button = Button(12,bounce_time=0.2)
while(True):
# 当按键被按下时调用button_pressed函数
button.when_pressed= button_pressed
# 进入暂停模式,等待中断信号
pause()