本帖最后由 _深蓝_ 于 2024-9-26 21:32 编辑
行空板扩展板制作电子保安保卫小区安全 提升业主生活体验
一、项目背景
满怀报负的我们从小离开家门,背着沉重的行囊走上求学的道路,还有的小伙伴走向了复杂的社会,在平淡的生活中拼搏、挥洒汗水,到了晚年落叶归根,回到儿时的那个家,享受天伦之乐。而包容的城市里,小区便是我们老年的归宿,不希望多么奢华,只想平平淡淡,安安全全,有求必应、事事顺心的小区环境。随着城市化进程的加快,小区规模不断扩大,传统的人工巡逻与监控方式已难以满足现代小区对安全、便捷及高效管理的需求。因此,开发一套集自动化、智能化于一体的电子保安系统显得尤为重要。该系统不仅能够减轻物业管理人员的工作负担,还能有效提升小区的安全防范能力,为我们业主创造一个更加安全、舒适的生活环境。
二、项目设计
1.使用硬件
行空板购买链接
扩展板购买链接
小车(包括电机和车轮,车身使用盒子暂代)
语音合成模块购买链接
温湿度模块购买链接
超声波传感器 wiki百科
模拟火焰传感器 wiki百科
2.使用思维导图展示项目设计
3.项目硬件设计
- 电机:搭配定制巡逻小车,实现小区内的自动化巡逻。
- 温湿度传感器:选用高精度温湿度传感器,实时监测小区内环境变化。
- 超声波传感器:安装于巡逻小车前端,用于避障检测,防止碰撞。
- 模拟火焰传感器:部署于小区关键区域,如儿童游乐区,检测明火。
- 语音合成设备:集成于巡逻小车或中控系统,用于发出安全警告与求助回应。
- 喷灌系统:根据温湿度传感器数据,自动启动灌溉与降温增湿功能。
- 物联网通信模块:支持Wi-Fi的物联网通信,确保数据实时上传至门卫中控大屏。
三、电路连接
电路图如下图所示
1.超声波传感器echo接收管脚接P12,trig发送管脚接P11。
2.DHT11温湿度传感器接管脚P7 。
3.模拟火焰传感器接管脚P3。
4.语音合成模块解行空板I2C接口。
四、编程实现
1.自动化巡逻系统
以上程序实现“电子保安”按照规划的路线巡逻。
2.环境监测与灌溉降温系统
使用siot物联网系统,将采集的环境温湿度上传到大屏系统,后台操作人员或者门卫根据采集的温湿度指导园艺工人进行灌溉,降温和增湿。
3.安全预警系统
如果电子保安即将撞人,语音合成提醒,你快撞到我了,请慢走。
如果模拟火焰检测有明火,合成语音提醒3遍警告、警告、禁止玩火。
4.紧急求助响应系统
本系统使用行空板的按钮,给小区用户交互提供可能,大屏系统会显示用户的求助位置并安排服务解决,用于有紧急求助的住户。
5.物联网通讯与数据展示系统
以上内容用于后台技术人员或者门卫看到的大屏,用于监控小区内部的温湿度,是否有夜间施工噪声,以及紧急求助的接口与内容。
6.人工遥控操作电子保安巡逻
可以使用扩展板带的红外接收器,使用遥控器人工手动操作电子保安的巡逻或者调试。
完整的主程序截图如下
函数与主程序折叠后得结构如下
载入模块如下图所示
五、小车制作
由于材料的限制,本人使用药盒作为小车的车身,各种传感器用m3的螺丝直接固定到药盒上了。
六、siot效果与大屏展示
七、不足和改进
1.由于激光切割和3D打印的限制,制作的小车不太美观。
2.没有加入摄像头,简化了本项目的编程,未使用多线程让摄像头的数据上传到大屏上。
3.在测试电机时,使用9v的电池,却带动不了药盒的小车。电机不动,后期解决一下,或者换其他体积小一点的电机。
4.对于多样的传感器,仅仅加入了温湿度、超声波和模拟火焰传感器,复现的同学可以加入空气质量传感器,烟雾传感器,pm2.5传感器等等。
八、附件
代码:
- # -*- coding: UTF-8 -*-
-
- # MindPlus
- # Python
- import siot
- import time
- from unihiker import GUI
- from unihiker import Audio
- from pinpong.board import Board
- from pinpong.board import DHT11
- from pinpong.board import IRRecv
- from pinpong.board import Board,Pin
- from pinpong.board import SR04_URM10
- from pinpong.extension.unihiker import *
- from pinpong.libs.dfrobot_speech_synthesis import DFRobot_SpeechSynthesis_I2C
-
- # 自定义函数
- def ZuoZhuan_ShiJian(time):
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog(512)
- p_p6_out.write_digital(1)
- p_p16_pwm.write_analog(512)
- time.sleep(time)
- def YouZhuan_ShiJian(time):
- p_p5_out.write_digital(1)
- p_p8_pwm.write_analog(512)
- p_p6_out.write_digital(0)
- p_p16_pwm.write_analog(512)
- time.sleep(time)
- def XunLuoFangAn2():
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- def XunLuoFangAn1():
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(15)
- ZuoZhuan_ShiJian(3)
- ZhiXianXingShi_SuDu(0.5)
- time.sleep(10)
- def ZhiXianXingShi_SuDu(velocity):
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog((1023 * velocity))
- p_p6_out.write_digital(0)
- p_p16_pwm.write_analog((1023 * velocity))
-
- # 事件回调函数
- def button_click1():
- print("button_click1")
- siot.publish_save(topic="siot/求助报警", data="1号楼附近请求支援。")
- def button_click2():
- print("button_click2")
- siot.publish_save(topic="siot/求助报警", data="2号楼附近请求支援。")
- def button_click3():
- print("button_click3")
- siot.publish_save(topic="siot/求助报警", data="3号楼附近请求支援。")
- def button_click5():
- print("button_click5")
- siot.publish_save(topic="siot/求助报警", data="5号楼附近请求支援。")
- def button_click6():
- print("button_click6")
- siot.publish_save(topic="siot/求助报警", data="6号楼附近请求支援。")
- def button_click7():
- print("button_click7")
- siot.publish_save(topic="siot/求助报警", data="7号楼附近请求支援。")
- def button_click8():
- print("button_click8")
- siot.publish_save(topic="siot/求助报警", data="8号楼附近请求支援。")
- def on_message_callback(client, userdata, msg):
- print(msg.topic)
- print(msg.payload.decode())
- if (msg.topic == "siot/回复"):
- message.config(text=msg.payload.decode())
- def event(data):
- my_variable = hex(data)
- my_variable = 0.8
- if (my_variable == "0xfd807f"):
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog((1023 * velocity))
- p_p6_out.write_digital(0)
- p_p16_pwm.write_analog((1023 * velocity))
- elif (my_variable == "0xfd906f"):
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog((1023 * velocity))
- p_p6_out.write_digital(0)
- p_p16_pwm.write_analog((1023 * velocity))
- elif (my_variable == "0xfd20df"):
- p_p5_out.write_digital(1)
- p_p8_pwm.write_analog((1023 * velocity))
- p_p6_out.write_digital(0)
- p_p16_pwm.write_analog((1023 * velocity))
- elif (my_variable == "0xfd609f"):
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog((1023 * velocity))
- p_p6_out.write_digital(1)
- p_p16_pwm.write_analog((1023 * velocity))
- else:
- p_p5_out.write_digital(0)
- p_p8_pwm.write_analog(0)
- p_p6_out.write_digital(1)
- p_p16_pwm.write_analog(0)
-
-
- Board().begin()
- siot.init(client_id="7513374100360746",server="192.168.99.45",port=1883,user="siot",password="dfrobot")
- u_gui=GUI()
- u_audio = Audio()
- siot.connect()
- p_p3_analog=Pin(Pin.P3, Pin.ANALOG)
- siot.set_callback(on_message_callback)
- p_p5_out=Pin(Pin.P5, Pin.OUT)
- p_p8_pwm=Pin(Pin.P8, Pin.PWM)
- p_p6_out=Pin(Pin.P6, Pin.OUT)
- p_p16_pwm=Pin(Pin.P16, Pin.PWM)
- sonar1 = SR04_URM10(Pin((Pin.P11)),Pin((Pin.P12)))
- dht1 = DHT11(Pin((Pin.P7)))
- p_gravitysynthesis = DFRobot_SpeechSynthesis_I2C()
- p_gravitysynthesis.begin(p_gravitysynthesis.V2)
- p_gravitysynthesis.set_voice(1)
- p_gravitysynthesis.set_speed(5)
- p_gravitysynthesis.set_tone(5)
- p_gravitysynthesis.set_sound_type(p_gravitysynthesis.FEMALE3)
- p_gravitysynthesis.set_digital_pron(p_gravitysynthesis.AUTOJUDGED)
- siot.getsubscribe(topic="siot/回复")
- # 设置行空板显示的内容,如温湿度、火情等,求助等。
- a1=u_gui.draw_text(text="电子保安小区情况一览",x=10,y=0,font_size=15, color="#0000FF")
- temp=u_gui.draw_text(text="当前温度:",x=0,y=30,font_size=15, color="#0000FF")
- humi=u_gui.draw_text(text="当前湿度:",x=0,y=60,font_size=15, color="#0000FF")
- fire=u_gui.draw_text(text="火情:",x=0,y=90,font_size=15, color="#0000FF")
- message=u_gui.draw_text(text="信息:",x=0,y=120,font_size=15, color="#0000FF")
- safe=u_gui.draw_text(text="有事按所在楼按钮",x=10,y=160,font_size=15, color="#0000FF")
- rect=u_gui.draw_rect(x=5,y=150,w=300,h=250,width=1,color="#0000FF")
- number=u_gui.add_button(text="1号楼",x=5,y=200,w=40,h=30,onclick=button_click1)
- number=u_gui.add_button(text="2号楼",x=50,y=200,w=40,h=30,onclick=button_click2)
- number=u_gui.add_button(text="3号楼",x=100,y=200,w=40,h=30,onclick=button_click3)
- number=u_gui.add_button(text="5号楼",x=150,y=200,w=40,h=30,onclick=button_click5)
- number=u_gui.add_button(text="6号楼",x=5,y=240,w=40,h=30,onclick=button_click6)
- number=u_gui.add_button(text="7号楼",x=50,y=240,w=40,h=30,onclick=button_click7)
- number=u_gui.add_button(text="8号楼",x=100,y=240,w=40,h=30,onclick=button_click8)
-
- while True:
- # 使用无线遥控器可以手动控制电子保安行动。
- ir1 = IRRecv(Pin((Pin.P14)),event)
- # 监测环境温度和湿度,指导园艺工人灌溉。
- temp.config(text="当前温度: {:.4}℃".format(dht1.temp_c()))
- humi.config(text=(str("当前湿度: %3.1f"%(dht1.humidity())) + str("%")))
- # 显示火情
- fire.config(text=(str("火情: ") + str((400 <= p_p3_analog.read_analog()))))
- siot.publish_save(topic="siot/湿度", data=dht1.humidity())
- siot.publish_save(topic="siot/温度", data=dht1.temp_c())
- siot.publish_save(topic="siot/噪声", data=u_audio.sound_level())
- print((str("距离:") + str(sonar1.distance_cm())))
- print((str("模拟火焰:") + str(p_p3_analog.read_analog())))
- # 发现火情,语音合成设备发出警告,禁止明火。
- if (100 <= p_p3_analog.read_analog()):
- for index in range(3):
- siot.publish_save(topic="siot/求助报警", data="存在火情、警告中...")
- p_gravitysynthesis.speak("警告、警告,禁止玩火。")
- if (sonar1.distance_cm() <= 20):
- for index in range(3):
- p_gravitysynthesis.speak("你快撞到我了,请慢走。")
- time.sleep(1)
复制代码
|