1、实现要求
1.1、运用树莓派设计一个简单的按键控制LED灯点亮系统。通过树莓派控制器读取外部数字信号,使用三个按键分别控制三种颜色的 LED灯,当有按键按下时对应的LED灯会点亮,按键松开后对应的LED灯则熄灭。
1.2、按下三个按键中的一个按键时,可以看到对应的一个LED灯会点亮;同时按下其中两个按键时,对应的两个LED灯会亮起;同时按下三个按键时则三个LED灯同时亮起。
2、涉及技术
2.1、树莓派的输入输出引脚控制
2.2、python 线程的基本操作
3、实现原理
3.1、RGB三色灯有四个引脚,高电平接3.3V,其它三个引脚对应三种色源,对应的引脚输入低电平时灯亮,输入高电平时灯灭。
3.2、轻触开关有两组共4个脚,每组的2根脚是互相联通,电会从这俩脚里流过,按钮的作用就是按下去电路就联通了,否则就断开。
3.3、GPIO有个input模式,如果输入电流到GPIO口,那么编程读取GPIO返回HIGH,如果没有输入电流则返回LOW,从而我们可以检测到按钮的状态变化。
3.4、多线程类似于同时执行多个不同程序,使用线程可以把占据长时间的程序中的任务放到后台去处理。
4、系统组成
![](https://img-blog.csdnimg.cn/20191126212511151.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3Njg4MjA0,size_16,color_FFFFFF,t_70)
系统主要由树莓派、3个轻触开关和3个RGB灯组成,树莓派是整个系统的核心,通过检测按键的开关状态控制相应灯的亮灭。
5、硬件连接
5.1、实物连接图:
5.2、连接原理图:
6、实现步骤
6.1、初始化引脚
设置引脚编号模式为BCM,按键对应引脚为输入模式并使用软件下拉模式,RGB灯相应引脚设为输出模式,并初始化为高电平。
# 采用BCM引脚编号
GPIO.setmode(GPIO.BCM)
# 关闭警告
GPIO.setwarnings(False)
# 设置GPIO输入模式, 使用GPIO内置的下拉电阻, 即开关断开情况下输入为LOW
GPIO.setup(channel_R, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(channel_G, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(channel_Y, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(LED_R,GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(LED_G,GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(LED_Y1,GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(LED_Y2,GPIO.OUT, initial=GPIO.HIGH)
6.2、新建一个线程事件,监听按键状态
# 开关闭合的处理
def on_switch():
GPIO.output(LED, GPIO.LOW)
def off_switch():
GPIO.output(LED, GPIO.HIGH)
def thread():
try:
while True:
# 如果检测到电平RISING, 说明开关闭合
if GPIO.input(channel):
on_switch()
else:
off_switch()
# 可以在循环中做其他检测
time.sleep(0.1) # 10毫秒的检测间隔
except Exception as e:
print(e)
6.3、在主线程里开启三个按键对应的线程
tr=Thread(target=thread_R)
tr.start()
tg=Thread(target=thread_G)
tg.start()
ty=Thread(target=thread_Y)
ty.start()
7、运行结果
7.1、按下一个按钮时,对应的RGB灯点亮
7.2、按下两个按钮时,对应的两个RGB灯点亮
7.3、按下三个按键时,三个RGB灯都点亮
8、实验总结
1、GPIO输入安全电压应该是3.3V,因此按键使用树莓派的3.3V供电口而不是5V;
2、GPIO引脚悬空时,受周遭环境干扰可能产生微弱电流,导致GPIO输入时高时低,因此程序需要开启GPIO口的下拉或上拉模式。