0
点赞
收藏
分享

微信扫一扫

【重温设计模式】中介者模式及其Java示例

基于AI技术的多功能消防机器人演示效果

竞赛-基于AI技术的多功能消防机器人视频演示

前言:

        随着“自动化、智能化”成为数字时代发展的关键词,机器人逐步成为社会经济发展的重要主体之一,“机器换人”成为发展的全新趋势和时代潮流。在可预见的将来,消防机器人的功能将日益完善,在较多危险区域完全可以代替消防员,实现“机器换人”,减少甚至避免消防员的伤亡。消防机器人的出现无疑给消防行业带来了救赎。但同时也应该看到,我国对于消防机器人的研究相较国外同行已远远落后,存在技术上的差异和代沟。我国从八十年代末期才开始对消防机器人进行研究,相比于其他国家起步较晚。现行我国虽已有了消防机器人,但数据显示我国消防机器人的研究仍处在初级阶段,还有许多问题亟待解决。例如,现行消防机器人在市场上并没有得到实际的推广,且他的使用对象大多都是我们的消防部队,并且都是消防人员到达火灾现场后才开始使用的,但消防事故灾情复杂、消防机器人灭火救援难度极大,出于这些局限性,本团队进行了讨论,针对现行传统消防机器人所存在的问题,提出了新的看法和解决方案。火灾事故频发的一大要因便是缺少事前的预防措施,都是火灾发生后的事后救济。要想更好的解决火灾问题,最好的方法就是从火灾根源下手,从源头阻断火情的蔓延。因此,我们的项目主要针对室内领域使用,这能更好的防止火灾根源的蔓延和火势的扩大,进而执行巡逻灭火工作,阻断火情的发生,起到火灾预防的作用。

关键词: 消防机器人  室内  多功能  预防

目录:

一、绪论

        火灾是生活中最常见和最容易发生的灾害,火灾的发生对社会有很大的伤害,危害性是人类无法估计的。我国近年来频繁发生火灾等安全事故,截至2021年我国共接报火灾数量74.8万起,同比增长196.83%,造成直接经济损失67.5亿元,同比增长68.33%。因此消防机器人的出现,无疑保障了人们的人身安全和财产安全。且当前科技发展速度越来越快,智能机器人运用范围也越来越普及。近年来,我国消防机器人的研制工作得到了政府有关部门的支持,因此在消防事业发展过程中机器人的发展前景非常广阔。我国研制和开发消防机器人提高了我国消防现代化的水平,为减少日常生活中的细微细节酿成的大火造成的人身伤亡,但我国消防机器人在室内无线智能领域与技术发达国家还存在着差距,因此消防机器人的提升空间巨大

二、系统方案

2.1项目简介:

        在人们的日常生活和工作中,由于人们消防意识淡薄、先进消防技术匮乏、人为制造火情等,导致安全事故频发,一次又一次的威胁着人们的生命健康安全,因此消防机器人的出现正是解决这一现状的利器。消防机器人在我国虽历经几十年的改革和进步,总体上已达到了世界先进水平,但是也存在一定的局限性。即适用于家庭内部使用的消防机器人少之又少,基本上处于空缺状态。现在的消防机器人的使用对象大多是消防部队,并且受时间限制,仅仅是在火灾已经发生之后消防部队赶到火灾现场才能够使用。为了克服现行消防机器人不适用室内内部使用这一局限性,我们项目在现行消防灭火机器人的基础上研发一种功能全面、使用领域针对于室内,针对问题的发生根源进一步进行预防工作的基于AI技术的多功能消防机器人。

2.2 实现路径:

        基于AI技术的多功能消防机器人能够在火灾发生之前快速反应,机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机中的微信小程序,实现与用户远程监视功能,用户同时也能通过手机与电脑远程下发命令来操控机器人来实现交互功能,硬件上主要采用了STM32单片机,WIFI模块,火焰传感器,烟雾传感器,温湿度传感器模块,K210摄像头,蜂鸣器报警模块,激光雷达模块,高压水泵,软件上主要采用微信小程序和阿里云服务器,MQTT通信协议,只要有安全隐患的存在机器人就会第一时间将危险信息发送到产品用户的微信小程序中以警醒产品用户有危险发生。

        本项目的消防机器人主要应用于如家庭、工作场所等室内领域,是基于stm32单片机和物联网云平台阿里云实施的灭火报警助手项目,能够预防火灾发生,并提供安全保障进行火灾的定位和灭火,这体现了智能消防的效能,也是保障人类人身、财产权得以行稳致远行使的得力助手。

三、功能特色

3.1 项目功能:

        机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机和电脑中,实现与用户远程监视功能,同时用户也能通过手机与电脑远程下发命令来操控机器人来实现交互功能,硬件上主要采用了STM32单片机,WIFI模块,火焰传感器,烟雾传感器,温湿度传感器模块,K210摄像头,蜂鸣器报警模块,高压水泵,激光雷达定位系统,软件上主要采用微信小程序和阿里云服务器,web网页,MQTT通信协议。

        机器人通过各个模块来判断当前环境是否有安全隐患的存在,使机器人能够检测到不良环境时将第一时间将危险信息发送到产品用户的微信小程序中以警醒产品用户有危险发生,轻松实现室内智能安防,使用户的财产与生命安全得到保障,达到财产损失预防、安全预防。

3.2 项目特色:

        在功能上,本项目产品不同于市面上必须由人工在附近辅助控制的消防机器人,机器人通过超声波模块进行巡逻避障,通过k210摄像头AI识别等各个传感器模块来记录和识别该报警器位置附近是否有烟雾出现、火灾发生、有毒气体泄漏,来进行扬声器报警。检测到火焰和高温区域时,机器人停止移动,指向火焰源,开启灭火工作,直到火焰熄灭。并通过雷达扫描构造附件场景进行确定位置,从而获取到较为准确的火灾信息,在wifi模块中使用MQTT通信协议与OneNET互联网平台和TCP端口进行连接,将STM32单片机、微信小程序建立通信,可实现用户的实时监控,在距离上信息传输不受限制。同时用户还能获取到室内的温度、火焰信息、易燃气体与烟雾、各个模块接收到的安全情况等信息,也可通过微信小程序等来给机器人下达指令,从而进行实时操控。

        在硬件上,基于STM32搭载UCOSIII实时操作系统,为各个模块的工作提供了有力的保障。使用防火涂层板搭建机器人,起到机器人自身防火作用。并且使用PCB板将各个模块电路集成在一起,不仅节省了机器人硬件使用空间,并且避免了线路连接繁杂的问题,起到机器人侦察小巧灵敏的作用。

四、实现原理:

AI技术的多功能消防智能机器人实现功能如下:

        机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机中的微信小程序,实现与用户远程监视功能,用户同时也能通过手机与电脑远程下发命令来操控机器人来实现交互功能,硬件上主要采用了STM32单片机,WIFI模块,火焰传感器,烟雾传感器,温湿度传感器模块,K210摄像头,蜂鸣器报警模块,激光雷达模块,高压水泵,软件上主要采用微信小程序和阿里云服务器,MQTT通信协议。

        图1.基于AI技术的多功能消防机器人技术图 

        机器人通过各个模块来判断当前环境是否有安全隐患的存在,使机器人能够检测到不良环境时将第一时间将危险信息发送到产品用户的手机中以警醒产品用户有危险发生,轻松实现室内智能安防,使用户的财产与生命安全得到保障,达到财产损失预防、安全预防。

4.1 wifi模块

        ATK-ESP8266WiFi模块是ALIENTEK 推出的一款高性能的 UART-WiFi(串口-无线 WIFI)模块,ATK-ESP8266 板载 ai-thinker 公司的 ESP8266 模块,该模块通过 FCC,CE 认证。ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,可以很方便的与产品进行连接。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口-WIFI 数据传输方案,方便设备使用互联网传输数据

4.2 五路火焰传感器

        在机器人循迹打开摄像头的过程中,通过温湿度传感器感应温度与湿度的高低,让机器人进一步的往温度高的范围循迹,通过打开火焰传感器感应火焰,进一步确认火源方向,从而达到了辅助K210摄像头能够精确的识别到火焰图像的作用。

4.3 K210摄像头

        KPU 是 K210 内部一个神经网络处理器,它可以在低功耗的情况下实现卷积神经网络计算, 实时获取被检测目标的大小、坐标和种类,对人脸或者物体进行检测和分类。

        Yolov3算法已有开源的软件可以直接使用,即通过Mx-yolov3软件实现,大大方便了我们开发者的编写程序的过程,实现方便简单。

        首先第一步需要将火焰图片上传到机器学习的目录中,第二步处理图片大小为224x244(减小图片像素以方便机器学习)

 图2.火焰训练图片目录

图3.深度学习目标识别训练软件

        图4.在训练软件中框选出训练目标为火焰 

        通过Mx-yolov3软件环境框选出我们要识别的目标(火焰),框选的图片越多机器学习程度就越高,火焰识别也会越精确。训练好之后会生成模型文件,最后将模型文件上传到K210摄像头的SD卡中,通过K210的MaixPy IDE编译环境通过Python编程语言对模型文件进行使用,将代码下载到K210摄像头中,从而实现K210摄像头对火焰进行高精度识别。

4.4 温湿度传感器

        利用探头作为测温元件,将温度和湿度信号采集出来,经过稳压滤波、运算放大、非线性校正、V/I转换、恒流及反向保护等电路处理后,转换成与温度和

        湿度成线性关系的电流信号或电压信号输出,也可以直接通过主控芯片进行485或232等接口输出。

4.5 蜂鸣器模块

        1、蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。

        2、无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。

        3、有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。

4.6 激光雷达模块

        激光雷达定位系统模块RPLIDAR A1M8 360度激光扫描测距雷达是由SLAMTEC公司开发的低成本二维激光雷达(LIDAR)解决方案。它可以实现在二维平面的12米半径范围内进行360度全方位的激光测距扫描,并产生所在空间的平面点云地图信息。这些云地图信息可用于地图测绘、机器人定位导航、物体/环境建模等实际应用中。RPLIDAR采用由SLAMTEC研发的低成本的激光三角测距系统,在各种室内环境以及无日光直接照射的室外环境下均表现出色。在机器人的应用中通过RPLIDAR A1的通讯接口(串口/RX,TX)获取RPLIDAR的扫描测距数据。RPLIDAR A1采用了激光三角测距技术,配合SLAMTEC研发的高速的视觉采集处理机构,可进行每秒高达8000次以上的测距动作。每次测距过程中,RPLIDAR A1将发射经过调制的红外激光信号,该激光信号在照射到目标物体后产生的反光将被RPLIDAR A1的视觉采集系统接受。经过嵌入在RPLIDAR A1内部的DSP处理器实时解算,被照射到的目标物体与RPLIDAR A1的距离值以及当前的夹角信息将从通讯接口中输出。

图5.RPLIDAR A1工作原理示意图

        在电机机构的驱动下RPLIDAR A1的测距核心将进行顺时针旋转,从而实现对360度全方位环境的扫描测距检测,来实现机器人的导航与定位、障碍物检测、环境扫描与地图测绘。   

图6.为激光雷达定位系统RPLIDAR A1扫描所得环境示意图 

4.7 超声波模块

        TRIG引脚负责发送超声波脉冲串。此引脚应设置为高电平10μs,此时HC-SR04将以40 kHZ发出8个周期的声波脉冲。发出声波爆发后,ECHO引脚将变为高电平。 ECHO引脚是数据引脚 - 用于进行距离测量。发送超声波脉冲串后, ECHO引脚将变为高电平,它将保持高电平,直到检测到超声波脉冲串为止,此时它将变为低电平。就是TRIG引脚给一个持续10us的高电平,触发超声波模块自动发送8个40khz的方波,发出声波后,ECHO引脚会被拉高,待接收到之后,ECHO引脚拉低,我们只要测出ECHO引脚从拉高到拉低的时间就可以知道距离了。

4.8 stm32单片机控制

        

        STM32系列单片机由ST公司生产的专为要求高性能、低成本、低功耗的嵌入式应用设计的ARMCortex-M3内核。本系统采用的STM32属于互联型产品,具有以下标准功能:72MHZ主频,56k字节Flash,64字节SRAM,2个看门狗,多个16位定时器,80%的引脚可以作为通用/O口,以及USART、SPI等通信外设。因此,本系统采用STM32F103作为总控制器。主要从各个模块中获取信息,对获取的信息进行编码,根据需要将编码的信息通过网络发送给服务器,再通过服务器将数据分发给客户端能够控制整个系统功能的正常运行。(本项目单片机主要使用STM32F103C8TC最小系统板,通过Keil5环境进行代码编译下载)

4,9 微信小程序远程通信

        为实现机器人与用户的人机交互本项目主要采用微信小程序开发软件与前端web网页作为上位机下发控制机器人命令,微信小程序的编程主要使用的是js/vue编程语言,上位机与下位机的通信主要运用了阿里云服务器与MQTT网络协议和OneNET物联网平台。

        首先需要在阿里云服务器中先部署好MQTT网络协议,下位机上发数据作为双向数据传输在32单片机中运用WIFI模块获取网络,通过OneNET物联网连接上MQTT网络协议中的IP地址\TCP端口和订阅设备的具体地址(这里地址指的是MQTT网络协议中的自定义的设备目录地址,订阅设备是作为stm32单片机与微信小程序接受数据与发送数据的中转站),32单片机通过已连接好的WIFI模块中的串口发送数据,从而发送到MQTT网络协议的订阅设备地址中,能够将下位机的温湿度、安全信息、空气质量、蜂鸣器报警信息发送到上位机(用户客户端/微信小程序/web网页)。上位机的双向数据传输,需要在微信小程序中安装好MQTT网络协议插件,同样也是通过访问MQTT网络协议中的IP地址与端口连接好下位机已连接的订阅设备地址来获取32单片机中WIFI向订阅设备地址发送的数据,同时通过用户界面控制向MQTT网络发送控制命令,实现用户与机器人的交互功能。

图7.微信小程序登录和控制与显示界面

五、项目框图

5.1 硬件框图

5.2 软件框图 

六、源码展示: 

6.1 K210摄像头源代码

##在导入新的模型时,仅需要增加kpu.load函数,anchor数据,kpu.init_yolo2函数,kpu.run_yolo2函数即可##
"""
需要修改的部分介绍
1,kpu.load函数:将模型进行导入
参数一:模型文件路径,模型地址默认加上/sd/,即sd卡根目录下的hhh.kmodel文件路径为/sd/hhh.kmodel

2,anchor:anchor中的数据为模型训练物体识别生成的Anchors数据

3,kpu.init_yolo3:初始化yolo3卷积网络
参数一kpu.load函数返回值。
参数二:当k210获取到的图片和模型相似度大于参数二时,则认为是该模型,取值0~1。
参数三:box_iou 门限, 为了防止同一个物体被框出多个框,当在同一个物体上框出了两个框,这两个框的交叉区域占两个框总占用面积的比例 如果小于这个值时, 就取其中概率最大的一个框
参数四:为anchor中数据长度/2。
参数五:anchor

4,kpu.run_yolo3函数:用于对比模型和图片
参数一:kpu.load函数返回值
参数二:摄像头获取到的图片

5,classess变量:当一个模型中存在多个种类时,该变量用于存储不同的种类名称,存储顺序要与在yolo3中获取种类名称的顺序相同
例:在yolo3中获取的种类名称为close,open所以classess变量为classes=['fire'],之后通过classess[i.classid()]输出对应的种类
"""
import sensor,image,lcd,time
import KPU as kpu
from machine import UART
from fpioa_manager import fm

fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)

uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)

sensor.set_windowing((224, 224))
sensor.set_brightness(2)

sensor.run(1)
clock = time.clock()
classes = ['fire']
task = kpu.load("/sd/fire.kmodel")
anchor = (1.048, 1.5335, 1.5987, 2.0913, 1.674, 2.8035, 2.2209, 2.6764, 2.2859, 3.2013)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            a=img.draw_rectangle(i.rect())
            a = lcd.display(img)
            for i in code:
                lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
                lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
                if(classes[i.classid()] == 'fire' and i.value()>=0.5):
                    uart_A.write(b'4')
                    time.sleep_ms(20)
    else:
        a = lcd.display(img)
a = kpu.deinit(task)

6.2 微信小程序源码 

<template name="09f318ce">
  <view class="_div data-v-4e39f484">
    <view class="_div data-v-4e39f484 header">
      <view wx:if="{{isLogin}}" class="_div data-v-4e39f484">
        <view class="_div data-v-4e39f484 header-title">请登录</view>
        <view class="_div data-v-4e39f484 header-info">Please Login Your Account</view>
      </view>
      <view wx:else class="_div data-v-4e39f484">
        <view class="_div data-v-4e39f484 header-title">请注册</view>
        <view class="_div data-v-4e39f484 header-info">Please Register Your Account</view>
      </view>
    </view>
    <view class="_div data-v-4e39f484 body">
      <view class="_div data-v-4e39f484 login-form">
        <van-field placeholder="请输入用户名" value="{{inputUserName}}" bindchange="handleProxy" data-eventid="{{'0'}}" data-comkey="{{$k}}" class="_van-field data-v-4e39f484"></van-field>
        <van-field type="password" placeholder="请输入密码" value="{{inputPassWord}}" bindchange="handleProxy" data-eventid="{{'1'}}" data-comkey="{{$k}}" class="_van-field data-v-4e39f484"></van-field>
        <view wx:if="{{!isLogin}}" class="_div data-v-4e39f484">
          <van-field placeholder="请输入找回密码绑定手机号" value="{{inputContect}}" bindchange="handleProxy" data-eventid="{{'2'}}" data-comkey="{{$k}}" class="_van-field data-v-4e39f484"></van-field>
        </view>
      </view>
      <van-button slot="button" round block color="#1296db" bindtap="handleProxy" data-eventid="{{'3'}}" data-comkey="{{$k}}" class="_van-button data-v-4e39f484">
        {{isLogin?"登录":"注册"}}
      </van-button>
      <view class="_div data-v-4e39f484 other-option">
        <view bindtap="handleProxy" data-eventid="{{'4'}}" data-comkey="{{$k}}" class="_div data-v-4e39f484"><label class="_span data-v-4e39f484">{{isLogin?"注册账户":"登录账户"}}</label></view> <label style="margin: 0 30px" class="_span data-v-4e39f484">|</label>
        <view bindtap="handleProxy" data-eventid="{{'5'}}" data-comkey="{{$k}}" class="_div data-v-4e39f484"><label class="_span data-v-4e39f484">忘记密码</label></view>
      </view>
      <view class="_div data-v-4e39f484 copyright-wrapper"><label class="_span data-v-4e39f484 copyright">Power By XBMZDX-DZSJ</label></view>
      <view class="_div data-v-4e39f484">
        <van-dialog use-slot title="找回密码校验" show="{{showFindPW}}" show-cancel-button transition="fade" bindconfirm="handleProxy" bindcancel="handleProxy" data-eventid="{{'7'}}" data-comkey="{{$k}}" class="_van-dialog data-v-4e39f484">
          <van-field label="手机号" title-width="60px" placeholder="请输入找回密码绑定手机号" value="{{inputContect}}" bindchange="handleProxy" data-eventid="{{'6'}}" data-comkey="{{$k}}" class="_van-field data-v-4e39f484"></van-field>
        </van-dialog>
        <van-dialog use-slot title="重置密码" show="{{showResetPW}}" show-cancel-button transition="fade" bindconfirm="handleProxy" bindcancel="handleProxy" data-eventid="{{'9'}}" data-comkey="{{$k}}" class="_van-dialog data-v-4e39f484">
          <van-field label="用户名" title-width="60px" value="{{inputUserName}}" readonly class="_van-field data-v-4e39f484"></van-field>
          <van-field type="password" label="新密码" title-width="60px" placeholder="请输入新密码" value="{{inputPassWord}}" bindchange="handleProxy" data-eventid="{{'8'}}" data-comkey="{{$k}}" class="_van-field data-v-4e39f484"></van-field>
        </van-dialog>
        <van-toast id="van-toast" class="_van-toast data-v-4e39f484"></van-toast>
      </view>
    </view>
  </view>
</template>

 6.3 一号单片机源代码(主要用于网络通信)

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "stdio.h"
#include "Beep.h"
//网络设备
#include "esp8266.h"
//网络协议层
#include "onenet.h"


u8 Laji=9;												//垃圾类型
u8 Ljtzt=1;               //垃圾桶工作状态
u8 Yhljt_Status;				//有害垃圾桶舵机状态
u8 Khsljt_Status;				//可回收垃圾桶状态
u8 Ycljt_Status;				//厨余垃圾桶状态
u8 BEE;				//BEEP工作状态

 int main(void)
 {	
	 
	const char *topics[] = {"home/garden/sub2"};
	const char	devPubTopic[] = {"home/garden/fountain2"};
	char PUB_BUF[256];
	unsigned short timeCount = 0;			//发送间隔变量
	unsigned char *dataPtr = NULL;
	Usart1_Init(115200);													//debug串口调试助手
	delay_init();	    	 																		//延时函数初始化	  
	LED_Init();		  																					//初始化与LED连接的硬件接口
	UsartPrintf(USART1, " LED初始化成功\n");

	delay_ms(20);
	UsartPrintf(USART1, "串口1调试成功\n");
	Usart2_Init(115200);													//esp8266串口调试
	UsartPrintf(USART1, "串口2调试成功\n");
	ESP8266_Init();																		//初始化ESP8266
	UsartPrintf(USART1, "ESP8266初始化成功\n");
	

	 	while(OneNet_DevLink())			//接入OneNET
		/*********灯闪烁表示接入成功***********/
		UsartPrintf(USART1, "OneNet接入成功\n");
		GPIO_ResetBits(GPIOC,GPIO_Pin_13); 
		delay_ms(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		delay_ms(500);
		GPIO_ResetBits(GPIOC,GPIO_Pin_13); 
		delay_ms(500);		
		GPIO_SetBits(GPIOC,GPIO_Pin_13);//LED1输出低
		
	  OneNet_Subscribe(topics, 1);

	while(1)
	{	

			
		/************************************************************/
		
		if(++timeCount >=80)									//发送间隔3s
		{
			UsartPrintf(USART_DEBUG, "OneNet_Publish\r\n");
			sprintf(PUB_BUF,"{\"Ljtzt\":%d,\"Beep_Status\":%d,\"Yhljt_Status\":%d,\"Khsljt_Status\":%d,\"Ycljt_Status\":%d,\"Laji\":%d}",Ljtzt,BEE,Yhljt_Status,Khsljt_Status,Ycljt_Status,Laji);
			OneNet_Publish(devPubTopic, PUB_BUF);						//将PUB_BUF数据发送到MQTT服务器中
			timeCount = 0;
			
			ESP8266_Clear();																	//清空ESP8266缓存
		 }
		
		dataPtr = ESP8266_GetIPD(3);
		if(dataPtr != NULL)
			OneNet_RevPro(dataPtr);
 	  } 
 }

6.4 二号单片机源代码(主要用于外设控制) 

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "oled.h"  	 
#include "stdio.h"
#include "pwm_config.h"
#include "hc.h"
#include "obj_duo.h"
#include "fire.h"
u8 xunluo = 0;
float length;
float length1;
float length2;
float Length;
int time = 0;
int sb = 0;
u8 distan;//激光雷达测距
 int main(void)
 {	

	float length;      																			//超声波测距
	Usart1_Init(115200);													//debug串口调试助手
	Usart2_Init(115200);													//k210摄像头
	delay_init();	    	 																		//延时函数初始化	  
	LED_Init();		  																					//初始化与LED连接的硬件接口
	pwm_config();																				//PWM初始化
	UsartPrintf(USART1, " PWM初始化成功\n");
	Hcsr04Init();                                			      //超声波初始化
	UsartPrintf(USART1, "超声波初始化成功\n");
	 SB_Init();
	delay_ms(20);
	UsartPrintf(USART1, "串口1调试成功\n");
//	TIM3_Int_Init(1999,7199); 						//中断定时器3初始化
	
	GENERAL_TIM_Init();
	UsartPrintf(USART1, "舵机初始化成功\n");
//	 fire1();
//	 fire2();
//	 fire3();
//	 fire4();
//	 fire5();
	 UsartPrintf(USART1, "五路火焰传感器初始化成功\n");
//		LED1=!LED1;
//		delay_ms(500);
//		LED1=!LED1;
//		delay_ms(500);
//		LED1=!LED1;	
//		delay_ms(500);		
		GPIO_SetBits(GPIOC,GPIO_Pin_13);//LED1输出低
		UsartPrintf(USART1,"距离为:%.3fcm\n",length);
		LED1=!LED1;
		delay_ms(500);
		LED1=!LED1;
		delay_ms(500);
		LED1=!LED1;	
		delay_ms(500);		
		LED1=!LED1;
		delay_ms(500);
		LED1=!LED1;
		delay_ms(500);
		LED1=!LED1;	
		delay_ms(500);		
		TIM_SetCompare1(GENERAL_TIM , 15);
		delay_ms(500);		
		xunluo = 0;
		while(1)
		{
					LED1=1;
					Speed_control(0,0,0,0);	
					
					if(FIRE1==1)
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										pwm_left(200);
										delay_ms(80);	
										UsartPrintf(USART1,"2");
					}
					if(FIRE2==1)
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										pwm_left(200);
										delay_ms(30);	
										UsartPrintf(USART1,"2");
					}
					if(FIRE3==1 )
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										UsartPrintf(USART1,"2");
										sb=1;
					}
					if(FIRE4==1 )
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										pwm_right(200);
										delay_ms(100);	
										UsartPrintf(USART1,"2");
					}
					if(FIRE5==1 )
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										pwm_right(200);
										delay_ms(150);	
										UsartPrintf(USART1,"2");
										
					}
					if(YAN6==0 )
					{
										LED1=0;
										delay_ms(100);	
										xunluo = 0;
										UsartPrintf(USART1,"3");
										
					}
					
					if(sb)
					{
								SB1 = 0;
								
					}
					

					
			while(xunluo)
			{	
						time++;
						SB1 = 1;
								length = Hcsr04GetLength();
			//					UsartPrintf(USART1,"距离为:%.3fcm\n",length);
						if(FIRE1==1||FIRE2==1||FIRE3==1||FIRE4==1||FIRE5==1||YAN6==0)
						{
								xunluo = 0;
								break;
						}
						pwm_straight(200);
						if(time == 50)
						{
									UsartPrintf(USART1,"1");
									time =0;
						}
						if(length<50||distan<50)
						{
									Speed_control(0,0,0,0);	
									delay_ms(200);
									pwm_back(200);
									delay_ms(300);
									Speed_control(0,0,0,0);	
									delay_ms(200);
							
									TIM_SetCompare1(GENERAL_TIM , 25);																				//超声波转向左边
									delay_ms(100);
									delay_ms(100);	
									delay_ms(100);	
									delay_ms(300);	
									
									length1 = Hcsr04GetLength();				
									delay_ms(20);
									length1 = Hcsr04GetLength();																															//获取左边距离
				//					UsartPrintf(USART1,"距离111为:%.3fcm\n",length1);
					
									TIM_SetCompare1(GENERAL_TIM , 5);																						//超声波转向右边
									delay_ms(100);	
									delay_ms(100);	
									delay_ms(100);	
									delay_ms(300);	
									length2 = Hcsr04GetLength();
									delay_ms(20);
									length2 = Hcsr04GetLength();																															//获取右边距离
			//						UsartPrintf(USART1,"距离222为:%.3fcm\n",length2);
							
									TIM_SetCompare1(GENERAL_TIM , 15);																				//转向原位
									delay_ms(100);				
									delay_ms(100);	
									delay_ms(300);	
									length2 = Hcsr04GetLength();					
									if(length1>length2)
									{
													pwm_right(200);
													delay_ms(1200);
									}
									else 
									{
													pwm_left(200);
													delay_ms(1200);
									}
									length = 100;
						}
					

		

			} 
			
			
		}
}


七、实物展示 

八、成本核算:

名称

规格

数量

价格/元

总价/元

K210摄像头

1

380/个

380

稳压模块

2

26/个

52

温湿度传感器

1

12/个

12

超声波传感器

1

13/个

13

五路火焰传感器

1

32/个

32

烟雾传感器模块

1

40/个

40

车模

1

290/个

290

DHT11模块

1

10/个

10

STM32C8T6单片机

2

21/个

42

HC-SR04模块

1

12/个

12

OLED显示屏

1

20/个

20

水泵

1

23/个

23

激光雷达

1

600/个

600

源码资料链接 :

毕设&大创&立项&竞赛-基于AI技术的多功能消防机器人(完整工程资料源码).rar_MSPM0资源-CSDN文库

资源详情:

 PCB原理图:

用户使用手册: 

总结: 

        当前科技发展速度越来越快,智能机器人运用范围也越来越普及。且近年来,我国消防机器人的研制工作得到了政府有关部门的支持,因此在消防事业发展过程中机器人的发展前景非常广阔。我国研制和开发消防机器人提高了我国消防现代化的水平,为减少日常生活中的细微细节酿成的大火造成的人身伤亡,但我国消防机器人在室内无线智能领域与技术发达国家还存在着差距,因此消防机器人的提升空间巨大。

        火灾是生活中最常见和最容易发生的灾害,火灾的发生对社会有很大的伤害,危害性是人类无法估计的。我国近年来频繁发生火灾等安全事故,截至2021年我国共接报火灾数量74.8万起,同比增长196.83%,造成直接经济损失67.5亿元,同比增长68.33%。因此消防机器人的出现,无疑保障了人们的人身安全和财产安全,因此未来消防机器人的市场需求前景广阔。

举报

相关推荐

0 条评论