1. 巴法云配置
1–1. 进入巴法云控制台:https://cloud.bemfa.com/tcp/devicemqtt.html
选择MQTT设备云,新建主题,此处的主题是MQ5 ,也可以自定义,代码里的主题名要与这里一致。
1–2. 微信推送消息接口协议
https://cloud.bemfa.com/docs/#/?id=_61-%e6%8e%a5%e5%8f%a3%e5%8d%8f%e8%ae%ae
2. ESP8266 模块代码编写与烧录
详细教程请看太极创客官网:零基础入门学用 Arduino 教程 – 基础知识篇
正常情况下,传感器读数不超过300,根据实际情况修改此数值,当传感器读数超过设定值的时候就会发送消息到微信提醒用户。
完整代码如下:
/*
MQ-5气敏式烟雾传感器模块(甲烷 液化气可燃气体)
*/
// 引入对应的头文件
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ESP8266HTTPClient.h>
//数值类型转换
#include <stdio.h>
#include <stdlib.h>
// 声明对象
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
//********************需要修改的部分*******************//
#define clientId "xxxxxxxxxxxxxxxxx" //用户私钥,巴法云控制台获取
const char* topic = "MQ5"; //主题名字,可在巴法云控制台自行创建,名称随意
const char* topicSet = "MQ5/set"; //自已发布的消息不订阅
const char* mqttServer = "bemfa.com"; //默认,MQTT服务器
const int mqttServerPort = 9501; //默认,MQTT服务器端口
#define Aout A0 // MQ-5 AO 接线 Arduino A0
String messageString = "000"; // 临时变量,存储A0读取的数据
//**************************************************//
/******************************微信消息推送参数************************************************/
String uid = "xxxxxxxxxxxxxxxxx"; // 用户私钥,巴法云控制台获取
String type = "2"; // 1表示是预警消息,2表示设备提醒消息
String device = "燃气传感器设备"; // 设备名称
String msg = "检测到可燃气体浓度超标!!!"; //发送的消息
int delaytime = 60; //为了防止被设备“骚扰”,可设置贤者时间,单位是秒,如果设置了该值,在该时间内不会发消息到微信,设置为0立即推送。
String ApiUrl = "http://api.bemfa.com/api/wechat/v1/"; //默认 api 网址
HTTPClient http; //初始化http
WiFiClient client; //初始化wifi客户端
/******************************************************************************/
// 连接MQTT服务器
void connectMQTTServer(){
if (mqttClient.connect(clientId)) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
subscribeTopic(); // ****订阅主题函数****
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 订阅指定主题
void subscribeTopic(){
// 建立订阅主题
String topicString = topic ;
char subTopic[topicString.length() + 1];
strcpy(subTopic, topicString.c_str());
// 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
if(mqttClient.subscribe(subTopic)){
Serial.println("Subscribe Topic:");
Serial.println(subTopic);
} else {
Serial.print("Subscribe Fail...");
}
}
// 发布信息
void pubMQTTmsg(){
// 建立发布主题
String topicString = topicSet ;
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
// 建立发布信息:设备的状态
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现ESP8266向主题发布信息,并在串口监视器显示出来
if(mqttClient.publish(publishTopic, publishMsg)){
Serial.println("Publish Topic:");
Serial.println(publishTopic);
Serial.println("Publish message:");
Serial.println(publishMsg);
} else {
Serial.println("Message Publish Failed.");
}
//当数据大于300时向微信推送消息
int n = atoi(messageString.c_str()); //string类型转为int类型,需先将string转为const char*
if(n > 300){
doHttpStick();
}
}
//******微信消息推送函数********//
void doHttpStick(){
String postData;
postData = "uid="+uid+"&type=" + type +"&time="+delaytime+"&device="+device+"&msg="+msg;
http.begin(client,ApiUrl); //Specify request destination
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); //Specify content-type header
int httpCode = http.POST(postData); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println(httpCode); //Print HTTP return code
Serial.println(payload); //Print request response payload
http.end(); //Close connection
Serial.println("send success");
}
//******微信消息推送函数********//
//程序入口
void setup() {
//开启串口通讯
Serial.begin(9600);
//定义A0为INPUT模式
pinMode(Aout, INPUT);
// 建立WiFiManager对象
WiFiManager wifiManager;
// 自动连接WiFi,以下语句的参数是连接ESP8266时的WiFi名称
wifiManager.autoConnect("AutoConnectAP");
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println("");
Serial.print("ESP8266 Connected to ");
Serial.println(WiFi.SSID()); // WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // IP
// 设置MQTT服务器和端口号
mqttClient.setServer(mqttServer, mqttServerPort);
// 连接MQTT服务器
connectMQTTServer();
}
//循环执行
void loop() {
if (mqttClient.connected()) { // 如果开发板成功连接服务器
messageString = analogRead(Aout); //读取A0的模拟数据
pubMQTTmsg(); //调用发发布函数
delay(10000); //延时10秒
} else {
connectMQTTServer(); // 如果开发板未能成功连接服务器,则尝试连接服务器
}
}
3. 硬件
传感器: https://item.taobao.com/item.htm?id=20240089178&ns=1&abbucket=17#detail
ESP8266开发板: https://item.taobao.com/item.htm?id=531755241333&ns=1&abbucket=17#detail
接线示意图
按红色,黑色,绿色线接线