HTML Echarts图形统计实时显示DHT11温度(一):第一阶段效果;
HTML Echarts图形统计实时显示DHT11温度(二):第一阶段前端展示界面;
HTML Echarts图形统计实时显示DHT11温度(三):第一阶段中间件记录;
HTML Echarts图形统计实时显示DHT11温度(四):第一阶段硬件ESP8266、DHT11记录;
HTML Echarts图形统计实时显示DHT11温度(五):第一阶段大数据可视化大屏例子;
未完待续。。。 。。。
下位机 ESP8266读取DHT11 发布MQTT主题
传感器DHT11收集温度信息传输至NODEMCU模组,由NODEMCU模组将数据发送至中间件,再由中间件上传上位机进行可视化、持久化。
一、硬件设备:
1、DHT11;
2、NODEMCU模组;
3、必须使用数据线;
4、选用杜邦线连接 / 可额外集成开发板;
二、开发环境: arduino;
三、硬件介绍:
1、DHT11(图 DHT11.jpg):
温度测量范围:0℃ ~ 50℃ 误差 2℃;
温度分辨率: 1℃;
工作电压: 3.3V ~ 5V;
输出形式: 数字输出;
PCB板尺寸: 32mm*14mm 电源指示灯: 红色; 重量: 约8g;
引脚定义: VCC(火线)外接3.3V ~ 5V; GND(零线);
DAT(数字量输出接单片机IO口)。
注:VCC和GND接反,PCB板会烧坏!
2、NODEMCU: 基于ESP-12E开发的NodeMcu开发板,以WIFI芯片ESP-8266为核心; CH340G、CP210X驱动等;
一、ESP8266读取DHT11
ESP8266 引入 <SimpleDHT.h>库,读取DHT11实时信息
#include <SimpleDHT.h>
//读取DHT11
void getDHT11Msg(){
dhtCount = dhtCount+1;//记录dht读取次数
//发送数据区上界
// start working...
Serial.println("=================================");
Serial.println("Sample DHT11... 第");Serial.println(dhtCount);Serial.println(" 次");
// read without samples.
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print("Read DHT11 temperature="); Serial.print((int)temperature); Serial.println(" *C, ");
Serial.print("Read DHT11 humidity="); Serial.print((int)humidity); Serial.println(" H, ");
currentTemperature = (int)temperature;//记录当前温度
currentHumidity = (int)humidity;//记录当前湿度
}
二、启动OTA模式,对外发送MQTT消息
#include <ArduinoOTA.h>
#include <PubSubClient.h>
//等待,直到连接上服务器
void reconnect() {
while (!client.connected()) {//如果没有连接上
int randnum = random(0, 999);
if (client.connect("esp8266-client"+randnum)) {//接入时的用户名,尽量取一个很不常用的用户名
client.subscribe("subscribeTopic");//接收外来的数据时的intopic
} else {
Serial.print("failed, rc=");//连接失败
Serial.print(client.state());//重新连接
Serial.println(" try again in 5 seconds");//延时5秒后重新连接
delay(5000);
}
}
}
//用于接收服务器接收的数据
void callback(char* topic, byte* payload, unsigned int length) {
load="";
for (int i = 0; i < length; i++) {
load +=(char)payload[i];//串口打印出接收到的数据
}
decodeJson();
}
//解析订阅信息JSON
void decodeJson() {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(load);
Serial.print("decodeJson: ");
Serial.println(load);
OTA = root["OTA"];
OTAS =OTA;
//接收数据json处理区上界
//添加其他自己的JSON收听处理方式就像这样 int Activity=root["ACT"];
//接收数据json处理区下界
}
//OTA模式
void OTAsetup(){
if(OTAS){
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
OTAS=0;
}
}
//发送信息封装
void encodeJson(){
DynamicJsonBuffer jsonBuffer;
JsonObject& root1 = jsonBuffer.createObject();
//发送数据区上界
root1["temperature"] = currentTemperature;
root1["humidity"] = currentHumidity;
root1["readCount"] = dhtCount;
//添加其他要发送的JSON包就像这样下面这句代码
//发送数据区下界
root1.printTo(msg);
}
完整代码: