【得捷电子Follow me第1期】+5.扩展项目:基于PicoW的入侵检测报警器
[复制链接]
本帖最后由 qinyunti 于 2023-4-10 16:08 编辑
78afb5e5d54b7e4804f394c1dc8f64a1
前言
前面各篇我们通过各模块玩转了PicoW,进行了LED,蜂鸣器,OLED,网络等相关的测试,
其中也有一些比较有意思的玩法,比如使用蜂鸣器演奏”两只老虎”等。
这一篇我们基于以上外设再实现一个综合的Demo:基于PicoW的入侵检测监视器。
概要设计
总体框图如下
通过TOF模块检测到人员接近,
然后将GPS的位置时间和人员接近信息通过WIFI上报给服务端,
同时通过声光的OLED,BEEP,LED等进行告警指示。
实现
TOF人员接近检测
用的TOF模块型号为HLK-LD116S-24G
检测到人员移动时会输出高,否则输出低。
使用GPIO18作为IO输入,检测TOF的输出
测试代码如下
from machine import Pin
import time
led = Pin("LED",Pin.OUT)
tof = Pin(18,Pin.IN)
led.value(0)
while True:
time.sleep(0.1)
print(tof.value())
测试如下
LED指示
当检测到人员接近时,LED点亮用于告警指示,否则熄灭。
测试代码如下
from machine import Pin
import time
led = Pin("LED",Pin.OUT)
tof = Pin(18,Pin.IN)
led.value(0)
while True:
time.sleep(0.1)
print(tof.value())
if(tof.value()):
led.value(1)
else:
led.value(0)
测试用手接近时,LED点亮,移开时熄灭。
蜂鸣器告警
当检测到人员接近时,蜂鸣器鸣叫告警,否则不鸣叫。
测试代码如下
from machine import Pin
import time
from machine import PWM
led = Pin("LED",Pin.OUT)
tof = Pin(18,Pin.IN)
pwm = PWM(Pin(16))
pwm.freq(1000)
led.value(0)
while True:
time.sleep(0.1)
print(tof.value())
if(tof.value()):
led.value(1)
pwm.duty_u16(1000)
else:
led.value(0)
pwm.duty_u16(0)
OLED显示
当检测到人员接近时,OLED显示告警信息。
测试代码如下
from machine import Pin
import time
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C
WIDTH = 128
HEIGHT = 64
i2c = I2C(0)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
led = Pin("LED",Pin.OUT)
tof = Pin(18,Pin.IN)
pwm = PWM(Pin(16))
pwm.freq(1000)
led.value(0)
pwm.duty_u16(0)
while True:
time.sleep(0.1)
print(tof.value())
if(tof.value()):
led.value(1)
pwm.duty_u16(1000)
oled.fill(0)
oled.text("Warning!Intruder!",5,20)
oled.show()
else:
led.value(0)
pwm.duty_u16(0)
oled.fill(0)
oled.text("Safety!",5,20)
oled.show()
检测到尤文接近时显示arning!Intruder!,否则显示Safety!
网络上报
当检测到人员接近时,OLED将检测到的状态,GPS位置,当前时间等信息上报服务端。
测试
完整代码如下
from machine import Pin
import time
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C
from micropyGPS import MicropyGPS
from machine import UART
import network
import socket
ssid = 'qiqiqiqi'
password = 'cqmygysdss'
host='192.168.31.236' #服务器IP地址
port = 10000 #服务器端口
my_gps = MicropyGPS()
WIDTH = 128
HEIGHT = 64
i2c = I2C(0)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
led = Pin("LED",Pin.OUT)
tof = Pin(18,Pin.IN)
pwm = PWM(Pin(16))
pwm.freq(1000)
led.value(0)
pwm.duty_u16(0)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# 网络连接
# Wait for connect or fail
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
raise RuntimeError('network connection failed')
else:
print('connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
#建立Socket连接
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#Socket属性
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
while True:
time.sleep(0.1)
#print(tof.value())
if uart0.any():
stat = my_gps.update(uart0.read(1).decode('utf-8')) # Note the conversion to to chr, UART outputs ints normally
if stat:
print('Latitude:', my_gps.latitude_string())
print('Longitude:', my_gps.longitude_string())
print('Speed:', my_gps.speed_string('kph'), 'or', my_gps.speed_string('mph'), 'or', my_gps.speed_string('knot'))
print('Date (Long Format):', my_gps.date_string('long'))
print('Date (Short D/M/Y Format):', my_gps.date_string('s_dmy'))
print('timestamp (Short [H,M,S] Format):', my_gps.timestamp)
sstr = 'Warning!Intruder!' + my_gps.latitude_string() + my_gps.longitude_string() + my_gps.date_string('s_dmy') + '\r\n'
s.sendto(sstr,(host,port))
stat = None
if(tof.value()):
led.value(1)
pwm.duty_u16(1000)
oled.fill(0)
oled.text("Warning!Intruder!",5,20)
oled.show()
else:
led.value(0)
pwm.duty_u16(0)
oled.fill(0)
oled.text("Safety!",5,20)
oled.show()
总结
以上我们先进行了概要设计,然后根据模块划分对各模块进行测试,最后综合实现设计目标。
从整个过程来看,由于之前对每个模块都进行过了充分的测试,所以本篇实际就是’组装’的过程,
有了设计框图,按照概要设计进行实现,比较顺利。
本次活动非常有意义,熟悉了PicoW的相应的开发,进行了各个模块的驱动,
并实现了一些有意思的测试最终实现了一个综合的Demo,收获满满。
最后有一点小小的建议,可以再丰富一点免费的外设模块,这样可以发挥更多的创意。
|