项目功能规划
引脚分配图
1.播放音频模块
封装了一个 playAudio(file_path) 函数,传入一个参数file_path表示音频文件路径
playAudio.py
import os
priority = 0
# 播放音频的函数,传入一个参数file_path表示音频文件路径
def playAudio(file_path):
global priority
if priority > 0:
pass
else:
# 给播放的音频设置优先级,提示戴口罩的音频优先级最低
if file_path == "./audio/temperature.mp3":
priority = 2
elif file_path == "./audio/highTemp.mp3":
priority = 1
try:
# omxplayer命令的输出都放进/dev/null中,避免打印到屏幕上
os.system("omxplayer -o local {path} > /dev/null".format(path=file_path))
priority = 0
except:
print('播放音频文件失败!')
2.控制Led模块
封装了一个 turnOnLed() 函数,用于点亮led,一个 turnOffLed() 函数,用于熄灭led
led.py
# coding=utf-8
import RPi.GPIO as GPIO
led_pin = 26 # led正极所接引脚
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT, initial=GPIO.LOW) # 将GPIO26设置为输出模式,初始状态为低电平
# 点亮led的函数
def turnOnLed():
GPIO.output(led_pin, GPIO.HIGH)
# 熄灭led的函数
def turnOffLed():
GPIO.output(led_pin, GPIO.LOW)
3. 控制舵机模块
封装了一个 openGate() 函数,模拟打开闸机,一个 closeGate() 函数,模拟关闭闸机
controlServo.py
import RPi.GPIO as GPIO
from time import sleep
servo_pin = 18 # 舵机信号线接树莓派GPIO18
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(servo_pin, GPIO.OUT, initial=False)
p = GPIO.PWM(servo_pin, 50) # 初始频率为50HZ
# 旋转角度转换到PWM占空比
def angleToDutyCycle(angle):
return 2.5 + angle / 180.0 * 10
# 舵机转到0度模拟开闸机
def openGate():
p.start(angleToDutyCycle(0))
sleep(0.5)
p.ChangeDutyCycle(0) # 清空占空比,防止舵机抖动
# 舵机转90度模拟关闸机
def closeGate():
p.start(angleToDutyCycle(90))
sleep(0.5)
p.ChangeDutyCycle(0) # 清空占空比,防止舵机抖动
4. 控制蜂鸣器(有源)模块
封装了一个 beep() 函数,控制蜂鸣器,发出“滴”的一声(在刷卡的时候发出)
controlBuzzer.py
# encoding=utf-8
import RPi.GPIO as GPIO
import time
trig_pin=24
vcc_pin = 23 # 用GPIO23当作电源
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(trig_pin,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(vcc_pin, GPIO.OUT, initial=GPIO.HIGH)
# 控制蜂鸣器,发出“滴”的一声
def beep():
GPIO.output(trig_pin,GPIO.LOW)
time.sleep(0.1)
GPIO.output(trig_pin,GPIO.HIGH)
5. 检测是否有人接近模块(效果不好,舍弃)
这里我们用到是HC--SR501人体感应模块
我这里
电源 --- 物理引脚02
信号输出 --- 物理引脚12(GPIO18)
接地 --- 物理引脚14
一部分功能:
①全自动感应:当有人进入其感应范围则输入高电平,人离开感应范围则自动延时关闭高电平,输出低电平
②感应范围:小于120度锥角,7米以内
③具有感应封锁时间 ( 默认设置 :2.5S 封锁时间 ) :感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号
这个是可以调节的,参考博客
④感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出0-3 次,一分钟后进入待机状态
① 这里我封装了一个detectPerson()方法,有人接近返回True,没人返回False
考虑到它的感应封锁时间,用的时候可以每隔3s测一次
detectPerson.py
import RPi.GPIO as GPIO
from time import sleep
signal_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(signal_pin, GPIO.IN)
# 用于检测有没有人接近,有返回True,没有返回False
def detectPerson():
signal = GPIO.input(signal_pin)
if signal == GPIO.HIGH:
return True
else:
return False
② 缺点
- 容易受各种热源、光源干扰,所以测量精度一般
- 环境温度和人体温度接近时,探测和灵敏度明显下降,有时造成短时失灵