Bootstrap

HTML Echarts图形统计实时显示DHT11温度(四)

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);
}

完整代码:

传感器DHT11收集温度信息传输至NODEMCU模组,由NODEMCU模组将数据发送至中间件MQTT

;