内容介绍
内容介绍
2024年寒假练 基于搭配12指神探的传感器扩展版制作的多功能感应及报警系统
一.项目介绍
本项目依托2024寒假在家一起练,基于RP2040平台,实现了基于搭配12指神探的传感器扩展版制作的多功能感应及报警系统。本项目基于RP2040主控,通过RPR-0521RS传感器检测光线强度,通过蜂鸣器警报,并在LCD屏幕上实时显示测量信息,取得了良好的效果,具有一定的价值。
项目任务:
- 可检测门窗开关状态
- 人体经过或靠近检测
- 可使用蜂鸣器发出警报、成功识别等状态音
- 可在LCD上显示基本信息如开关状态、人体或物体是否经过、距离远近
二.设计思路
- 通过RPR-0521RS传感器检测光线强度
- 通过蜂鸣器警报
- 在LCD屏幕上实时显示测量信息、
- 按钮可以切换两种不同模式或退出
三.硬件介绍
1.带屏12指神探
这个模块是通过Type C的USB接口提供供电、下载以及通信的功能,板上有5V转3.3V,最高支持800mA的电压变换器,在12根引脚上也将5V和3.3V引出,方便对其它外设板供电。
主控芯片:采用树莓派Pico核心芯片RP2040
- 双Arm Cortex M0+内核,可以运行到133MHz
- 264KBSRAM,板卡上外扩2MBFlash
- 性能强大、高度灵活的可编程IO(PIO)可用于高速数字接口
- 拥有2个UART、2个SPI、2个I2C、16个PWM通道以及4路12位精度ADC
- 支持MicroPython、C、C++编程
- 拖拽UF2固件至U盘的方式烧录固件,方便快捷
板上功能
- TYPE-C接口用于供电和数据传输
- 一个boot按键用于进入boot模式
- 两个可程控按键和一个拨轮用于自定义功能
- 搭载240*240分辨率的LCD彩屏,通过SPI接口进行通信,控制器为常用的ST7789芯片,例程丰富便于开发
- 扩展接口包含5v、3.3v输出、GND。9个GPIO,可同时使能最多三个通道ADC
2.传感器扩展版
扩展板搭载了几款常见传感器和功能模块,包括为初学者准备的麦克风、蜂鸣器、、红外收发、霍尔效应开关、加热电阻,为进阶操作准备的温湿度传感器、六轴传感器、接近/环境光/IR传感器、颜色传感器。其中温湿度传感器、六轴传感器、接近传感器、颜色传感器可拆卸为单个模块,通过杜邦线等连接线延伸其使用的空间范围。
RPR-0521RSR传感器模块是通过IIC驱动,I2C 总线只使用两条总线线路,SDA、SCL。每个连接到总线的设备都有一个独立的地址,主控可以利用这个地址进行不同设备之间的访问。
蜂鸣器通过GPIO口控制。对IO23口输出PWM波,通过对其设置频率和幅度控制蜂鸣器工作音量的高低和大小。
四.功能介绍
- 轮盘向左/右波动挑选模式
- M按键进入模式
- 模式1:光线过强或距离过近发出警报并同时在LCD上显示
- 模式2:开门时检测并发出警报
- 具体使用详见视频
五.主要代码
1.RPR-0521RS通过I2C协议工作
此处参考https://rohm.eefocus.com/module/forum/thread-617165-1-1.html
# 配置RPR-0521rs传感器
def init():
# 向RPR-0521rs写入配置寄存器
i2c.writeto_mem(RPR0521RS_ADDR, 0x41, b'\xc6')
i2c.writeto_mem(RPR0521RS_ADDR, 0x42, b'\x02')
i2c.writeto_mem(RPR0521RS_ADDR, 0x43, b'\x01')
# 读取传感器数据
def read_sensor_data():
# 读取RPR-0521rs传感器数据ALS
RegVal = i2c.readfrom_mem(RPR0521RS_ADDR, 0x44, 6)
2.使能蜂鸣器
#PWM波控制蜂鸣器工作
mic = machine.PWM(Pin(23))
#设置输出频率控制音调
mic.freq(50)
#设置占空比控制音量
mic.duty_u16(80)
3.全部代码
import uos
import st7789_new as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import framebuf
from machine import Pin, SPI, ADC,PWM,I2C
import time, math,array
from utime import sleep_ms
import struct
from time import sleep
import utime
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
display.fill(st7789.BLACK)
# xAxis = ADC(Pin(28))
# yAxis = ADC(Pin(29))
buttonM = Pin(5,Pin.IN, Pin.PULL_UP) #B
buttonS = Pin(6,Pin.IN, Pin.PULL_UP) #A
buttonL = Pin(7,Pin.IN, Pin.PULL_UP) #A
buttonPRESS = Pin(8,Pin.IN, Pin.PULL_UP) #A
buttonR = Pin(9,Pin.IN, Pin.PULL_UP) #A
RPR0521RS_ADDR = 0x38
# 初始化I2C总线
i2c = I2C(0, sda=Pin(20),scl=Pin(21), freq=100000)
mic = machine.PWM(Pin(23))
# 配置RPR-0521rs传感器
def init():
# 向RPR-0521rs写入配置寄存器
i2c.writeto_mem(RPR0521RS_ADDR, 0x41, b'\xc6')
i2c.writeto_mem(RPR0521RS_ADDR, 0x42, b'\x02')
i2c.writeto_mem(RPR0521RS_ADDR, 0x43, b'\x01')
# 读取传感器数据
def read_sensor_data():
# 读取RPR-0521rs传感器数据ALS
RegVal = i2c.readfrom_mem(RPR0521RS_ADDR, 0x44, 6)
temp1=RegVal[3]<<8
temp2=RegVal[2]
ALS0=temp1+temp2
temp1=RegVal[5]<<8
temp2=RegVal[4]
ALS1=temp1+temp2
temp1=RegVal[1]<<8
temp2=RegVal[0]
PS=temp1+temp2
#转化为光强数据
if(ALS0!=0):
co=ALS1/ALS0
if(co<0.595):
lx=1.682*ALS0-1.877*ALS1
elif(co<1.015):
lx=0.644*ALS0-0.132*ALS1
elif(co<1.352):
lx=0.756*ALS0-0.243*ALS1
elif(co<3.053):
lx=0.766*ALS0-0.25*ALS1
else:
lx=0
else:
lx=0
return PS,lx
def check(PS,ALS):
if PS>100:
#设置输出频率控制音调
mic.freq(800)
#设置占空比控制音量
mic.duty_u16(500)
display.text(font2,"Approaching!! ",0,150,st7789.RED,st7789.WHITE)
elif ALS>500:
#设置输出频率控制音调
mic.freq(500)
#设置占空比控制音量
mic.duty_u16(500)
display.text(font2,"LIGHT!! ",0,150,st7789.RED,st7789.WHITE)
else:
mic.duty_u16(1)
display.text(font2,"SAFE ",0,150,st7789.BLACK,st7789.WHITE)
def check_2(PS,LS):
if PS>100:
#设置输出频率控制音调
mic.freq(800)
#设置占空比控制音量
mic.duty_u16(500)
display.text(font2,"OPEN!! ",0,150,st7789.RED,st7789.WHITE)
time.sleep(0.5)
mic.duty_u16(1)
else:
mic.duty_u16(1)
display.text(font2,"CLOSE!! ",0,150,st7789.BLACK,st7789.WHITE)
def menu():
display.text(font2,"Multifunctional ",0,0,st7789.BLACK,st7789.WHITE)
display.text(font2," Alarm system ",0,30,st7789.BLACK,st7789.WHITE)
display.text(font2," ALS&PS_MODE ",0,60,st7789.BLACK,st7789.BLUE)
display.text(font2," CHECK ",0,90,st7789.BLACK,st7789.GREEN)
display.text(font2," EXIT ",0,120,st7789.BLACK,st7789.YELLOW)
display.text(font2," JXWM ",0,150,st7789.RED,st7789.WHITE)
display.text(font2," ",0,180,st7789.RED,st7789.WHITE)
def choose(buttonValueL):
if (buttonValueL%3==1):
display.fill_circle(220,72,12,st7789.RED)
display.fill_circle(220,102,12,st7789.GREEN)
display.fill_circle(220,132,12,st7789.YELLOW)
if (buttonValueL%3==2):
display.fill_circle(220,72,12,st7789.BLUE)
display.fill_circle(220,102,12,st7789.RED)
display.fill_circle(220,132,12,st7789.YELLOW)
if (buttonValueL%3==0):
display.fill_circle(220,72,12,st7789.BLUE)
display.fill_circle(220,102,12,st7789.GREEN)
display.fill_circle(220,132,12,st7789.RED)
# 主程序
def main():
display.fill(st7789.WHITE)
buttonValueS = 0
buttonValueL = 0
buttonValueR = 0
buttonValueM = 0
menu()
init()
buttonValueM = buttonM.value()
while True:
if buttonL.value() == 0 :
buttonValueL = buttonValueL+1
if buttonR.value() == 0 :
if(buttonValueL>0):
buttonValueL = buttonValueL-1
else:
buttonValueL=0
if buttonM.value() == 0 :
buttonValueM = 1
choose(buttonValueL)
if buttonValueM :
if (buttonValueL%3==1):
display.text(font2," ",0,60,st7789.BLACK,st7789.WHITE)
display.text(font2,"PS= ",0,90,st7789.BLACK,st7789.WHITE)
display.text(font2, "ALS= ", 0, 120,st7789.BLACK,st7789.WHITE)
PS,lx=read_sensor_data()
display.text(font2,"PS="+str(PS),0,90,st7789.BLACK,st7789.WHITE)
display.text(font2, "ALS="+str(lx), 0, 120,st7789.BLACK,st7789.WHITE)
check(PS,lx)
display.text(font2, " MODE1 ", 0, 180,st7789.BLUE,st7789.WHITE)
elif (buttonValueL%3==2):
display.text(font2," ",0,60,st7789.BLACK,st7789.WHITE)
display.text(font2,"PS= ",0,90,st7789.BLACK,st7789.WHITE)
display.text(font2, "ALS= ", 0, 120,st7789.BLACK,st7789.WHITE)
PS,lx=read_sensor_data()
display.text(font2,"PS="+str(PS),0,90,st7789.BLACK,st7789.WHITE)
display.text(font2, "ALS="+str(lx), 0, 120,st7789.BLACK,st7789.WHITE)
check_2(PS,lx)
display.text(font2, " MODE2 ", 0, 180,st7789.GREEN,st7789.WHITE)
elif (buttonValueL%3==0):
menu()
buttonValueM = 0
continue
time.sleep(0.1)
if __name__ == '__main__':
main()
六.活动总结与未来计划
通过对本项目的学习,对I2C又有了进一步的了解,本次项目锻炼了我的编程能力,对嵌入式开发有了新的体会,受益匪浅。未来期望再次参加活动,开拓电子芯片在生活中运用的视野,改变思维模式。
软硬件
团队介绍
BUPT学生一枚
团队成员
T-&10
BUPT业余人士
评论
0 / 100
查看更多
猜你喜欢
基于搭配12指神探的传感器扩展版制作的恒温控制系统该项目使用了树莓派Pico核心芯片RP2040、MicroPython语言、传感器扩展版,实现了PID算法控制的恒温控制系统的设计,它的主要功能为:基于RP2040主控,通过加热电阻控制环境温度,温湿度传感器感应环境温度,用按键控制目标温度,并在LCD屏幕上显示目标温度及实时温度。
jxwm
156
2024年寒假练-基于搭配带屏12指神探的传感器扩展板实现多功能感应及报警系统该项目使用了搭配带屏12指神探的传感器扩展板,实现了多功能感应及报警系统的设计,它的主要功能为:可以检测门窗的开关状态,人体经过或靠近检测,可在LCD屏上显示基本信息并通过蜂鸣器发出报警状态音。此外,本项目还通过PID自动控制算法集成了恒温控制系统,目标温度可以通过按键和拨轮控制。。
student
311
基于搭配12指神探的传感器扩展版制作的恒温控制系统该项目使用了树莓派Pico核心芯片RP2040、传感器扩展版、MicroPython语言,实现了PID算法控制的恒温系统的设计,它的主要功能为:显示当前环境的温度、湿度,可以通过波轮调节目标温度使加热电阻工作。
jjc
49