aliyun_mqtt.cpp
本次设计利用ESP8266作为系统主控,利用超声波检测门的状态,利用DHT11检测环境温湿度、烟雾传感器检测空气中的气体浓度,利用火焰报警器模块检测火焰状态,使用OLED进行可视化显示,系统显示传感器数据,以及们的状态等。如果环境中烟雾浓度过高,风扇会进行转动将烟雾进行驱散。
一、硬件设计
1、主控
本次设计利用ESP8266作为系统主控,ESP8266是一款 WIFI开发板,可以利用Arduino IDE进行开发,由于ESP8266开发板对应arduino ide的标号与开发板显示标号有差异,因此为了方便进行开发,我们可以在此前创建一些静态变量完成其映射,参考如下:
,
static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;
2、传感器
本次设计利用的传感器包括烟雾传感器、火焰传感器、DHT11、超声波传感器四个传感器,借助arduino IDE框架,我们可以很轻松地获得这些传感器的驱动文件。
烟雾传感器利用模数转换进行实现,由于ESP8266有且只有一个ADC口,借助该ADC口,我们可以实现烟雾传感器的值获取,值的范围大致在0-1024的区间。
烟雾传感器模块:
火焰传感器有两种输出方式:模拟输出、数字输出,分别叫做 AO(模拟输出)、DO(数字输出),由于上面的烟雾传感器已经使用了ADC口,且ESP8266只有一个ADC口,因此火焰传感器只能使用数字输出口获取数据,当检测到火焰的时候,火焰传感器输出0,当没有检测到火焰的时候,火焰传感器输出1.
火焰传感器模块:
DHT11是一种温湿度传感器,他只有一根数据传输线,使用单总线协议进行传输,借助Arduino IDE软件,我们可以方便地进行传感器数据的读取。
DHT11温湿度模块:
超声波传感器模块使用简单,我们只需要发送10s左右的高电平,然后关闭,统计超声波传感器的 ECHIO端(接收端)的高电平时间,此时我们再根据声音在空气中的传播速度,进行距离的测算,实现非接触式测量。
超声波传感器模块:
3、风扇
风扇一般使用直流电机进行驱动扇叶,直流电机是一种简单的点击器件,我们只要控制其导电方向,就可以实现风扇的正反转,如果直流电机两端电平一致,则电机停止。使用简单方便,如果需要实现不同挡位的电机速度,可以使用PWM进行驱动,改变其占空比,实现直流电机调速。
L298N 是一种双H桥电机驱动模块,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
二、软件设计
1、ESP8266 Arduino IDE 程序设计
ESP8266端作为核心部分,需要负责数据采集、可视化显示、控制器件、上传数据等,对于传感器部分可以借助Arduino IDE中的第三方库方便地完成硬件驱动,可视化器件使用OLED,为了显示中文,本次设计使用了U8G库,控制直流电机非常简单,只是单纯的高低电平,而上传数据到阿里云平台则需要借助 aliyun_mqtt 库这是一个第三方库且并没有上传到Arduino IDE官方,设计的时候我们还需要创建一个.cpp、一个.h文件。下面会附上代码:
#include <Arduino.h> //引入Arduino开发板的基础头文件
//引入连接传感器需要使用的DHT库函数头文件
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <U8g2lib.h> //引入连接OLED显示屏需要使用的U8g2库函数头文件
//引入Arduino底层SPI和I2C通信协议相关的库函数头文件
#include <SPI.h>
#include <Wire.h>
#include <ESP8266WiFi.h> //引入连接WiFi网络需要使用的ESP8266 Arduino开发环境
#include <PubSubClient.h> //引入连接MQTT服务器需要使用的PubSubClient库函数头文件
#include <ArduinoJson.h> //引入使用JSON数据交互需要使用的ArduinoJson库函数头文件
#include "aliyun_mqtt.h" //引入连接阿里云物联网平台所需的MQTT库函数头文件
#include <AliyunIoTSDK.h> //引入阿里云IoT SDK
//配置阿里云环境和WIFI
#define WIFI_SSID "" //自己的WIFI ID
#define WIFI_PASSWD "" //自己的WIFI密码
#define PRODUCT_KEY "" //自己的PRODUCT_KEY
#define DEVICE_NAME "" //自己的DEVICE_NAME
#define DEVICE_SECRET "" //自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai" //自己的REGION_ID
WiFiClient espClient; //创建WIFI连接对象
PubSubClient mqttClient(espClient); //创建MQTT连接对象
//订阅消息的TOPIC
#define ALINK_TOPIC_PROP_SET ""
//发布数据的TOPIC
#define ALINK_TOPIC_PROP_POST ""
//使用U8G2库驱动OLED显示屏
#ifdef U8X8_HAVE_HW_SPI
#endif
#ifdef U8X8_HAVE_HW_I2C
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;
//定义DHT11空气温湿度传感器引脚
#define DHTPIN D4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define Smoke_Pin A0
#define Flame_Pin D3
#d