【树莓派+python】实现三色呼吸灯+按钮切换

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环境配置

  1. 在Vscode中使用SSH连接树莓派

  2. 按Ctrl+Shift+~调用bash

  3. 在命令行中输入python -m venv myenv创建虚拟环境,其中myenv是自定义的虚拟环境名称
    谢谢杨老板抓虫…之前写成pip了

  4. 在命令行中输入source myenv/bin/activate激活虚拟环境

  5. 在本次实验中需要安装以下包:

    激活虚拟环境后输入以下命令安装包
    pip install gpiozero 
    pip install rpi-gpio
    pip install lgpio
    
  6. 在命令行中输入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()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快苏排序OAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值