树莓派与双色Led模块的那些事儿


一、简介

  为了实现后续树莓派接收霍尔传感器信号进而实现亮灯,而实现的一个准备工作,强烈建议大家以后买元器件尽量买双份,因为有时候店铺发的器件是坏的,而且还不一定能正确提供对应的资料,重新补发,又需要耽误一两天的时间,所以资金充足的情况下,强烈建议直接买双份。

二、硬件准备

1、树莓派4B * 1

2、KY-011双色LED模块 * 2

   下图就是我买到的坏掉了ky-011,ky-011分为红黄两色,这个坏掉的红灯不亮了,黄灯还是可以正常使用的。
Ky-011

接线引脚

  • (图中左侧)标注‘-’的管脚接GND,中间的管脚接数字IO,(图中右侧)标注"S"的管脚也接数字IO
  • 当中间管脚为高电平,则LED亮灯为红色(R)。
  • 当S管脚为高电平,则LED亮灯为黄色(Y)。
Raspberry Pi KY-011
Pin 6 GND
Pin 11 Y
Pin 13 R

三、软件准备

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)


while True:
	//熄灭
    GPIO.output(11, GPIO.LOW)
    GPIO.output(13, GPIO.LOW)
    time.sleep(1)
    //黄灯亮
    GPIO.output(11, GPIO.HIGH)
    GPIO.output(13, GPIO.LOW)
    time.sleep(1)
    //红灯亮
    GPIO.output(11, GPIO.LOW)
    GPIO.output(13, GPIO.HIGH)
    time.sleep(1)
	//红灯亮 + 黄灯亮 (形成混合色)
    GPIO.output(11, GPIO.HIGH)
    GPIO.output(13, GPIO.HIGH)
    
    
GPIO.cleanup()

实验结果:

黄红交替,自行脑补
在这里插入图片描述

四、准备知识

1、常见的双色Led模块

  常见的双色led模块一般是这种,网上的大部分资料也都是这一种,红绿双色,中间接地。
创乐博双色Led

原理图
配合开关接线,实现开关灯实验。
在这里插入图片描述

#!/usr/bin/env python
import RPi.GPIO as GPIO

BtnPin = 11
Gpin   = 12
Rpin   = 13

def setup():
	GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
	GPIO.setup(Gpin, GPIO.OUT)     # Set Green Led Pin mode to output
	GPIO.setup(Rpin, GPIO.OUT)     # Set Red Led Pin mode to output
	GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Set BtnPin's mode is input, and pull up to high level(3.3V)
	GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=200)

def Led(x):
	if x == 0:
		GPIO.output(Rpin, 1)
		GPIO.output(Gpin, 0)
	if x == 1:
		GPIO.output(Rpin, 0)
		GPIO.output(Gpin, 1)

def Print(x):
	if x == 0:
		print '    ***********************'
		print '    *   Button Pressed!   *'
		print '    ***********************'

def detect(chn):
	Led(GPIO.input(BtnPin))
	Print(GPIO.input(BtnPin))

def loop():
	while True:
		pass

def destroy():
	GPIO.output(Gpin, GPIO.HIGH)       # Green led off
	GPIO.output(Rpin, GPIO.HIGH)       # Red led off
	GPIO.cleanup()                     # Release resource

if __name__ == '__main__':     # Program start from here
	setup()
	try:
		loop()
	except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
		destroy()


2、使用 RPi.GPIO 模块的输出(Output)的基础知识

1、首先对 RPi.GPIO 进行设置(根据这里的描述)

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)

2、设置某个输出针脚状态为高电平:

GPIO.output(12, GPIO.HIGH)
 # 或者
GPIO.output(12, 1)
 # 或者
GPIO.output(12, True)

3、设置某个输出针脚状态为低电平:

GPIO.output(12, GPIO.LOW)
 # 或者
GPIO.output(12, 0)
 # 或者
GPIO.output(12, False)

4、程序结束后进行清理

GPIO.cleanup()

注意,您可以读取使用 input() 函数设置的输出通道的当前状态。例如对输出进行切换:

GPIO.output(12, not GPIO.input(12))

3、GPIO各种操作集合

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) #选择GPIO编码格式 BCM
channel = 1
# 1. 设置GPIO模式
GPIO.setup(channel,GPIO.IN)  #输入模式
GPIO.setup(channel,GPIO.OUT) #输出模式
GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH) #为输出的引脚设置默认值

# 2. 设置GPIO输出状态
chan_list=[11,12]           #双倍同时输出快乐
GPIO.output(chan_list,GPIO.LOW)             #同时输出低电平
GPIO.output(chan_list,(GPIO.HIGH,GPIO.LOW)) #分别输出不同电平
GPIO.output(12,not GPIO.input(12))          #读取一个输出引脚的状态并将其作为输出值

# 3. 读取GPIO当前状态
GPIO.input(channel)        #低电平返回0/GPIO.LOW/False,高电平返回1/GPIO.HIGH/True。
GPIO.setup(channel,GPIO.IN,pull_up_down = GPIO.PUD_UP)  #如果输入引脚处于悬空状态  上拉解决
GPIO.setup(channel,GPIO.IN,pull_up_down = GPIO.PUD_DOWN)#如果输入引脚处于悬空状态  下拉解决

# 4. 轮询读取Gpio
while GPIO.input(channel)==GPIO.LOW:
    time.sleep(0.01)

# 5. 边缘阻塞检测Gpio(会阻塞直到检测到边缘响应,轮询)
# wait_for_edge()被用于阻止程序的继续执行,直到检测到一个边沿。
# GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。
channel = GPIO.wait_for_edge(channel, GPIO.RISING, timeout=5000)
if channel is None:
    print('Time out occurred')
else:
    print('Edgedetectedonchannel',channel)

# 6. 线程回调边缘检测GPIO
# event_detected() 函数 event_detected() 函数被设计用于循环中有其它东西时使用,但不同于轮询的是,它不会错过当 CPU 忙于处理其它事物时输入状态的改变。
#单个回调
def my_callback(channel):
    print('这是一个边缘事件回调函数!')
    print('在通道 %s 上进行边缘检测' % channel)
    print('该程序与您的主程序运行在不同的进程中')
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)  # 在通道上添加上升临界值检测

#多个回调
def my_callback_one(channel):
    print('回调 1')
def my_callback_two(channel):
    print('回调 2')
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

# 在通道上添加上升临界值检测,忽略由于开关抖动引起的小于 200ms 的边缘操作
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)
#或
GPIO.add_event_callback(channel, my_callback, bouncetime=200)

# 取消线程检测
GPIO.remove_event_detect(channel)

猜你喜欢

转载自blog.csdn.net/qq_41071754/article/details/114369219