收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
+ [3.4 OLED显示屏软件设计](#34_OLED_141)
+ [3.5 数据上传至云平台](#35__147)
+ - [3.5.1 MQTT协议介绍](#351_MQTT_150)
- [3.5.2 ESP8266采集的数据上传至巴法云](#352_ESP8266_153)
+ [3.6 微信小程序端环境监测设计](#36__159)
+ - [3.6.1 小程序首页界面](#361__160)
- [3.6.2 小程序连接MQTT服务端并显示环境数据](#362_MQTT_165)
+ [3.7 预警消息的微信推送](#37__171)
+ - [3.7.1 预警消息接收端配置](#371__172)
- [3.7.2 预警消息发送端配置](#372__183)
+ [3.8 远程视频监控设计](#38__187)
+ - [3.8.1 内网视频监控](#381__190)
- [3.8.2 内网穿透的实现](#382__204)
- [3.8.3 微信小程序端远程监控](#383__231)
三、系统的软件设计
3.1 系统软件整体设计
本系统所使用的两个开发板为ESP8266-NodeMCU和ESP32-CAM模块,非常方便的一点是,这两个开发板的程序编写以及程序编译烧入都可以使用Arduino IDE软件完成。
通过程序控制,能够实现系统的初始化和MCU对各个检测家庭环境的传感器的数据采集,以及WiFi模块的初始化。采集的数据可以实时的显示在OLED屏幕上,MCU通过分析部分传感器返回的环境参数能够判断当前环境是否存在安全问题,能够起到家庭安防的作用,对安防警报信息能够及时通过声光报警和远程微信预警信息通知给人们。并且用户可以随时随地的通过微信实时查看视频监控。
(1)ESP8266的程序流程图如下图所示
(2)ESP32-CAM模块程序流程图:
3.2 各个传感器软件设计
3.2.1 温湿度传感器数据采集
DHT11的软件设计流程图如下图所示:
DHT11接收到主机(MCU)发送的启动信号后,DHT11立即从低功率模式切换到高速模式。主机启动信号结束后,DHT11发送响应信号,发送40位数据并触发信号采集。信号发送时序图如下图所示
(1)DHT11数据格式。DHT11发送的一次数据由5个字节构成,分为整数部分和小数部分,高位在前(左)。数据的格式如下:
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+ 8bit校验位。校验位为前四个字节相加结果的末8位。
(2)驱动程序。温度与湿度的获取是在主程序中通过使用dht11库文件获取,库文件包含一个dht11.h文件和一个dht11.cpp文件。在dht11.cpp通过uint8_t bytes[5]语句定义了一个含有5个元素的字节数组,该数组用来存放dht11按照时序传递的数据。根据DHT11的DATA引脚的电平时序变化判断出要准备接收40位bit,在接收数据时只对高电平持续时间进行计时,高电平持续26 ~ 27us表示数据“0”,而高电平持续68 ~ 74us表示数据“1”,“0”和“1”的时序图如图4.5。由于68us~74us为一个时间范围,存在一定的误差,若延时太短,无法判断当前是处于数据“0”的时隙还是数据“1”的时隙;如果延时太长,则会错过下一位数据前的开始时隙,从而后续数据无法被检测,因此在程序中将高电平持续时间大于40us作为对有效高电平进行的判断的依据。
dh11.h 的代码 ↓
#ifndef dht11\_h
#define dht11\_h
#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#define DHT11LIB\_VERSION "0.4.1"
#define DHTLIB\_OK 0
#define DHTLIB\_ERROR\_CHECKSUM -1
#define DHTLIB\_ERROR\_TIMEOUT -2
class dht11
{
public:
int read(int pin);
double humidity;
double temperature;
};
#endif
dh11.cpp 的代码 ↓
#include "dht11.h"
// Return values:
// DHTLIB\_OK
// DHTLIB\_ERROR\_CHECKSUM
// DHTLIB\_ERROR\_TIMEOUT
int dht11::read(int pin)
{
// BUFFER TO RECEIVE
uint8\_t bytes[5];//定义一个含有5个元素的字节数组
uint8\_t cnt = 7;//二进制1左移的位数
uint8\_t idx = 0;//字节数组编号
// EMPTY BUFFER 清空
for (int i=0; i< 5; i++) bytes[i] = 0;
// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
// ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
// READ OUTPUT - 40 bytes => 5 BYTES or TIMEOUT
for (int i=0; i<40; i++){
loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
unsigned long t = micros();
loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
if ((micros() - t) > 40) bytes[idx] |= (1 << cnt);
if (cnt == 0){ // 这时就要接收下一个字节的数据了
cnt = 7; // 重置cnt
idx++; // bytes数组下表++,切换存放数据的bytes数组元素
}
else cnt--; //
}
// WRITE TO RIGHT VARS
// as bytes[1] and bytes[3] are allways zero they are omitted in formulas.
humidity = bytes[0];
temperature = bytes[2]+int(bytes[3])/10.0;
uint8\_t sum = bytes[0] + bytes[1] + bytes[2] + bytes[3];
if (bytes[4] != sum&0xFF) return DHTLIB_ERROR_CHECKSUM; // 校验
return DHTLIB_OK;
}
//
// END OF FILE
//
3.2.2 烟雾传感器的数据采集
MQ-2烟雾传感器软件设计流程图如下图所示:
ESP8266-NodeMCU开发板对MQ-2烟雾传感器的数据采集方式较为简便,不需要使用驱动程序。烟雾传感器包含数字开关量输出和模拟电压量的输出,在主程序中调用analogRead(A0)函数读取其模拟引脚A0的数值即可。
3.2.3 火焰检测的软件设计
火焰检测软件设计流程图如下图所示:
ESP8266-NodeMCU通过读取DO引脚的电平高低就可以判断出附近是否有火焰。
3.2.4 超声波测距传感器的数据采集
判断房门是否被打开的程序流程图如下图所示:
使用软件进行编程,实现超声波测距传感器的测距功能,测得的距离是传感器到房门的距离,对测得的距离的大小进行检测,以此判断门是否被打开了。
根据时序图(如下),超声波测距传感器的触发方式为10微秒以上的高电平脉冲,在程序中实现10微秒以上的高电平脉冲则是使用digitalWrite函数和微秒级延时函数delayMicroseconds,对超声波测距传感器的trig引脚写入12微秒的高电平脉冲,然后使用pulseIn函数检测echo引脚返回的高电平的持续时间,该时间就是从超声波发出到碰到物体返回的时间,该时间乘以声速的结果就是要测距离的2倍。
3.2.5 人体红外检测软件设计
人体红外检测的程序流程图如下图所示:
ESP8266-NodeMCU连接HC-SR312,在主程序中通过digitalRead函数读取HC-SR312的OUT引脚电平值,读取OUT引脚电平值的程序存放在hongwai函数中。由于HC-SR312有2秒的延时时间,所以每隔2秒对OUT引脚的数据采集一次。
3.3 声光报警模块软件设计
声光报警的子程序流程图如下图所示:
声光报警的实现是使用程序控制蜂鸣器发出响声和点亮LED灯,两个是同时工作的。声光报警的软件设计主要是根据室内烟雾浓度是否超过阈值、是否检测到火焰、有无人员闯入、房门是否被打开这些条件进行判断。
声光报警的程序封装为函数,在需要报警的程序段调用该函数即可完成本地的声光报警。
3.4 OLED显示屏软件设计
此设计选用的0.96寸OLED屏是使用SSD1306芯片驱动4线IIC接口来实现屏幕的点亮。OLED的驱动主要是通过使用U8g2库来完成,U8g2是一个用于屏幕显示的单色图形库,兼容大部分的主流的单色OLED和LCD显示屏,在Arduino IDE的库管理器中进行安装。
OLED四线IIC接口与MCU通信的时序图如下图4.12所示
屏幕上的显示内容为MCU获取到的温湿度、烟雾、明火、人体感应、家门开关状态这些环境数据。为了保证整体主程序的模块化,通过自定义的显示函数OLEDDispaly(String temp, String rh, String gas, String fire, String human)来驱动屏幕显示环境数据。
主程序中对OLED屏幕的显示控制主要包括以下的内容。首先通过构造器对进行初始化,包括显示的缓冲区大小、通信协议、屏幕显示方向等。然后确定U8g2绘制模式,为了使环境数据的变换能够及时的在显示屏上显示出来,采用了U8g2库中的Full screen buffer mode(全屏缓存模式),该显示模式有固定的U8g2库函数调用顺序,顺序颠倒或者错误调用都不能正常驱动屏幕进行显示。使用该显示模式的程序控制过程:调用u8g2.clearBuffer清除内存中的数据缓冲区,为了使屏幕显示出相关信息,通过u8g2.setFont设置字符集,类似与编码格式;依据屏幕像素点阵的X轴和Y轴布局,使用u8g2.setCursor设置要绘制内容的起始坐标位置;利用u8g2.print函数指明屏幕上要显示的内容信息,写入缓冲区;最后调用u8g2.sendBuffer将缓冲区中的字符内容显示到屏幕上。
3.5 数据上传至云平台
云平台作为环境监测与家庭安防系统数据处理和下放的枢纽,连接着下位机ESP8266与上位机微信小程序终端,整个系统的正常运转和云平台的可靠性与否息息相关。考虑到完全自主设计云服务器的开发难度大、周期长、成本较高,因此选择使用专门的物联网云服务平台—— 巴法云 作为本系统云平台进行开发。
巴法云还提供了微信消息推送的API接口,可以在本系统中得到很好的应用,能够进行安防报警信息的实时推送。
3.5.1 MQTT协议介绍
MQTT规范的中文版本说明了MQTT是一种以用户端为基础的发布/订阅方式的信息传送协议。其设计思路是轻巧、开放、简单、规范、易于实施。这些特性使其成为许多情况下的最佳选项,尤其是在诸如机器与机器之间的通讯(M2M)和IoT等有限的环境中。
相对于HTTP等协议, MQTT在网络上的数据传输性能更好。另外,本协议的一个重要特征就是可以很容易地在客户端上实现。MQTT是目前国际上应用最广泛的物联网技术。在汽车网络、智能家居、即时聊天、工业互联网等方面,已经得到了广泛的应用。MQTT协议为设备提供了稳定、可靠和易于使用的通信基础。
3.5.2 ESP8266采集的数据上传至巴法云
数据上传至巴法云程序流程图如下图所示
巴法云中的MQTT设备云作为MQTT服务端,ESP8266-NodeMCU作为MQTT客户端可以向MQTT服务端特定主题发布消息和订阅某一主题。
ESP8266的Arduino开发环境里有多个MQTT库,最为流行的莫属 PubSubClient 库,ESP8266客户端的配置依托于PubSubClient库进行建立。在ESP8266上仅用一个MQTT客户端,使用代码 PubSubClient mqttclient(wifiClient) 初始化一个PubSubClient对象mqttclient。使用setServer函数设置MQTT服务器地址和端口号,用connect函数将客户端与服务端连接。
将ESP8266-NodeMCU采集到的各项传感器数据上传到巴法云MQTT服务端的实现是往所建立的MQTT主题发布消息,发布消息用到PubSubClient库中的publish函数。由于存在多个传感器,每个传感器的数据单独使用一个publish函数发布消息的话会占用太多程序资源,且显得程序过于冗杂,所以将所有要上传的数据放在一条字符串类型消息中进行发布,为了之后便于区分每个数据的所属者,需将数据进行简单的封装,就是将消息的格式设定为 “#data1#data2#data3…”,使用了“#”对各项数据进行“分割”,之后提取数据时对消息字符串按“#”分割后保存在数组中,即可按数组下标提取对应数据。
3.6 微信小程序端环境监测设计
3.6.1 小程序首页界面
小程序的首页界面是用来显示家庭中的各项环境参数,有温度、湿度、天然气含量、人体感应、家门开关状态、火焰检测,还显示了当前设备是否在线。
文件结构
index.wxml界面文件是界面布局的程序,该文件中的代码是对界面进行渲染,界面中对应数据的显示是在index.js逻辑文件中进行设置。
3.6.2 小程序连接MQTT服务端并显示环境数据
微信小程序获取巴法云数据的流程图如下图所示
在小程序获取数据之前需要判断当前设备是否在线,主要是检测MQTT服务端的主题是否有客户端定订阅,调用了巴法云获取设备状态的API接口。通过wx.request函数发起https网络请求,若请求成功,使用success回调函数接收服务端返回的json对象数据,解析json数据,对json对象中的“status”成员的值进行判断,若“status”的值为“online”,表示设备在线,若值为“offline”,则表示设备已离线。
在小程序端配置MQTT客户端,为了能够接收数据需要订阅ESP8266发布消息的对应主题,只要ESP8266一旦发布消息,小程序就能够及时的接收到消息。为了能够在小程序端建立一个MQTT客户端,使用了MQTT.js这个开源库,由于本设计使用的MQTT协议相对简单,实际使用的是对MQTT.js进行裁剪后的库,名为mqtt.min.js库。
调用mqtt.min.js库中的mqtt.connect连接巴法云MQTT服务端,使用subscribe函数订阅ESP8266发布消息的主题,使用on方法进行“message”事件绑定,“message”事件是定义在mqtt.min.js库中的,每当有新消息发布,“message”事件就会被触发,同时会运行message函数获取新发布的消息,这个消息就是所有的传感器的数据,由于消息的格式设定为了“#data1#data2#data3…”,使用split函数对消息字符串按照“#”进行分割即可分别获取对应传感器的数据。
3.7 预警消息的微信推送
3.7.1 预警消息接收端配置
采用本地声光报警虽然能起到对到盗贼等陌生人的警示惊动的作用,但家中没有人还是不能对家庭安全提供切实的保障。采用微信消息形式的远程报警可以说是一种有效的方式。微信消息推送的功能是基于巴法云物联网云平台所提供的微信推送API接口实现的,接收端的配置流程如下:
(1)注册企业微信。 (2)获取企业ID。在“我的企业”选项栏中找到企业生成的企业ID,将该企业ID保存并填入到巴法云微信推送的配置界面中。
(3)在企业微信中新建一个应用。打开“应用管理”,在最下面找到“创建应用”,点击创建应用。
(4)对要创建的应用设置名称和logo。
(5)创建完成后,进入创建的应用详情页,可以获取到应用ID(agentid),应用密钥Secret(secret),将密钥保存下来。
(6)打开巴法云的微信消息推送的配置界面,将前面获得的企业ID、应用ID、应用密钥Secret填入到对应的位置,完成巴法云端的配置。
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
图片转存中…(img-fdEdnKoI-1715802716638)]
[外链图片转存中…(img-QZWf7CGl-1715802716638)]
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!