基于搭配12指神探的传感器扩展版制作的多功能感应及报警系统
该项目使用了树莓派Pico核心芯片RP2040、MicroPython语言、传感器扩展版,实现了多功能感应及报警系统的设计,它的主要功能为:距离检测,光线强度检测,并在LCD屏上显示。
标签
RP2040
2024寒假在家一起练
RPR-0521RS
多功能感应及报警系统
jxwm
更新2024-03-27
北京邮电大学
119

2024年寒假练 基于搭配12指神探的传感器扩展版制作的多功能感应及报警系统

一.项目介绍

本项目依托2024寒假在家一起练,基于RP2040平台,实现了基于搭配12指神探的传感器扩展版制作的多功能感应及报警系统。本项目基于RP2040主控,通过RPR-0521RS传感器检测光线强度,通过蜂鸣器警报,并在LCD屏幕上实时显示测量信息,取得了良好的效果,具有一定的价值。

项目任务:

  • 可检测门窗开关状态
  • 人体经过或靠近检测
  • 可使用蜂鸣器发出警报、成功识别等状态音
  • 可在LCD上显示基本信息如开关状态、人体或物体是否经过、距离远近

二.设计思路

353612500bf9c83c9f56db88bbb53ea.jpg

  • 通过RPR-0521RS传感器检测光线强度
  • 通过蜂鸣器警报
  • 在LCD屏幕上实时显示测量信息、
  • 按钮可以切换两种不同模式或退出

三.硬件介绍

1.带屏12指神探

Probe2040_00.png

这个模块是通过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.传感器扩展版

sensor_board-V1.0_00.png

扩展板搭载了几款常见传感器和功能模块,包括为初学者准备的麦克风、蜂鸣器、、红外收发、霍尔效应开关、加热电阻,为进阶操作准备的温湿度传感器、六轴传感器、接近/环境光/IR传感器、颜色传感器。其中温湿度传感器、六轴传感器、接近传感器、颜色传感器可拆卸为单个模块,通过杜邦线等连接线延伸其使用的空间范围。

image.png

RPR-0521RSR传感器模块是通过IIC驱动,I2C 总线只使用两条总线线路,SDA、SCL。每个连接到总线的设备都有一个独立的地址,主控可以利用这个地址进行不同设备之间的访问。

image.png

蜂鸣器通过GPIO口控制。对IO23口输出PWM波,通过对其设置频率和幅度控制蜂鸣器工作音量的高低和大小。

四.功能介绍

  • 轮盘向左/右波动挑选模式
  • M按键进入模式
  • 模式1:光线过强或距离过近发出警报并同时在LCD上显示
  • 模式2:开门时检测并发出警报
  • 具体使用详见视频

微信图片_20240204135320.jpg

五.主要代码

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
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号