美文网首页IOT
Esp8266 D1 Mini检测温湿度(DHT11) 阿里IO

Esp8266 D1 Mini检测温湿度(DHT11) 阿里IO

作者: 坐在坟头数星星 | 来源:发表于2019-07-17 18:05 被阅读0次

    接着上次连接阿里IOT的热情赶紧买了个小模块测试了下,感觉效果还不错,阿里提供的支持还是很方便的。

    材料准备
    • ArduinoIDE

    • Esp8266 D1 Mini (淘宝自行搜索) (10-20之间)别忘记配usb数据线


    • DHT11 模块 (淘宝自行搜索)(几块钱)


    接下来就是轻车熟路的创建产品和设备,有一点需要注意,产品创建要从另个地方创建,原因就是可视化应用时候我们会搜不到设备,这个问题我也没仔细去查找,有知道的告诉。
    上面创建没什么好说的,打开查看项目

    创建产品和上次创建步骤一样没什么特别注意的,接下来创建功能自定义属性

    上面添加了三条属性,要注意 标识符 数据类型 取值范围 单位
     标识符:设备上报数据时所对应的Key值 很重要,不能有中文
     数据类别:设备上报数据是所传输的数据类型
     取值范围:取值范围根据硬件模块设置
     单位:数据单位,可视化可以用到
    1.Humidity        
    2.Temperature
    3.Heat_Index
    
    接下来创建一台设备,这里可以批量创建,步骤3是查看设备的Key
    1.接下来配置下Arduino IDE
    2.添加开发所需要的依赖库
    • 搜索DHT 安装DHT依赖库



      然后到上次阿里云在线开发平台下载mqtt和阿里云的依赖



      下载完成后吧zip里的文件都解压到Arduino的libraries文件夹里。我电脑文件夹在C:\Users\Administrator\Documents\Arduino\libraries

      如果这里没有的也可以放到IDE所在目录的libraries


    搞了这么多是不是可以上代码了?
    是的还有一个小坑,不过问题不大,就是缺下面这个库
    下载Adafruit_Sensor添加到libraries里就好,基佬hub大家都会用吧,就不多说了。
    好了接下来上代码
    #include <ESP8266WiFi.h>
    #include <ArduinoJson.h>
    #include <aliyun_mqtt.h>
    #include <DHT.h>
    
    #define WIFI_SSID "WIFI名"
    #define WIFI_PASSWD "WIFI密码"
    
    #define PRODUCT_KEY "自己设备"
    #define DEVICE_NAME "自己设备"
    #define DEVICE_SECRET "自己设备"
    
    #define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
    #define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
    #define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
    #define ALINK_METHOD_PROP_POST "thing.event.property.post"
    
    //这个是DHT11模块输入的IO口 我这里选择的D7 看自己需求选择
    #define DHTPIN 13   
    #define DHTTYPE DHT11
    
    //这个是指示灯  又需要的可以在阿里云里添加功能
    const int LED = 12;
    
    //默认LED开启的
    int ledState = HIGH;
    //推数据我这选择15秒推一次   我发现推的快了数据还是跑的很快的,毕竟阿里消息数>百万也是要钱的哦
    unsigned long delayTime = 15000;
    unsigned long lastDebounceTime = 0;
    unsigned long lastMqttConnectMs = 0;
    unsigned int postMsgId = 0;
    
    DHT dht(DHTPIN, DHTTYPE);
    WiFiClient espClient;
    PubSubClient mqttClient(espClient);
    
    void initWifi(const char *ssid, const char *password)
    {
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
        Serial.println("WiFi does not connect, try again ...");
        delay(3000);
      }
    
      Serial.println("Wifi is connected.");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void mqttCheckConnect()
    {
      bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
      if (connected) {
        Serial.println("MQTT connect succeed!");
        if (mqttClient.subscribe(ALINK_TOPIC_PROP_SET)) {
          Serial.println("subscribe done.");
        } else {
          Serial.println("subscribe failed!");
        }
      }
    }
    
    //上报检测数据
    void mqttPublish()
    {
      char param[512];
      char jsonBuf[1024];
    
      float h = dht.readHumidity();//湿度
      float t = dht.readTemperature();//温度
      float hic = dht.computeHeatIndex(t, h, false);//热指数
    
      sprintf(param, "{\"LED_STATE\":%d,\"Humidity\":%.2f,\"Temperature\":%.2f,\"Heat_Index\":%.2f}", ledState, isnan(h) ? 0 : h, isnan(t) ? 0 : t, isnan(hic) ? 0 : hic);
      postMsgId += 1;
      sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);
    
      if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf)) {
        Serial.print("Post message to cloud: ");
        Serial.println(jsonBuf);
      } else {
        Serial.println("Publish message to cloud failed!");
      }
    }
    
    void callback(char* topic, byte* payload, unsigned int length)
    {
      if (strstr(topic, ALINK_TOPIC_PROP_SET))
      {
        Serial.print("Set message arrived [");
        Serial.print(topic);
        Serial.print("] ");
        payload[length] = '\0';
        Serial.println((char *)payload);
    
        // Deserialization break change from 5.x to 6.x of ArduinoJson
        DynamicJsonDocument doc(100);
        DeserializationError error = deserializeJson(doc, payload);
        if (error)
        {
          Serial.println("parse json failed");
          return;
        }
    
        JsonObject setAlinkMsgObj = doc.as<JsonObject>();
        // LightSwitch
        int desiredLedState = setAlinkMsgObj["params"]["LED_STATE"];
    
        if (desiredLedState == HIGH || desiredLedState == LOW) {
          ledState = desiredLedState;
    
          const char* cmdStr = desiredLedState == HIGH ? "on" : "off";
          Serial.print("Cloud command: Turn ");
          Serial.print(cmdStr);
          Serial.println(" the light.");
        }
      }
    }
    
    void setup() {
      Serial.begin(115200);
      Serial.println("Hacklab MQTT LED demo starts.");
    
      pinMode(LED, OUTPUT);
      dht.begin();
    
      initWifi(WIFI_SSID, WIFI_PASSWD);
      mqttClient.setCallback(callback);
    
      lastMqttConnectMs = millis();
      mqttCheckConnect();
      mqttPublish();
    }
    
    void loop() {
    
      if (millis() - lastMqttConnectMs >= delayTime) {
        lastMqttConnectMs = millis();
        mqttCheckConnect();
      }
    
      if (!mqttClient.loop()) {
        Serial.println("The MQTT client is disconnected!");
      }
    
      if (millis() - lastDebounceTime >= delayTime) {
        if (ledState == HIGH) {
          Serial.println("Turn on light locally.");
        } else {
          Serial.println("Turn off light locally.");
        }
    
        lastDebounceTime = millis();
    
        mqttPublish();
        Serial.println(lastDebounceTime);
      }
    
      digitalWrite(LED, ledState);
    }
    
    好了烧录到8266打开串口波特率115200就可以看到数据已经上报了,之后可以做数据可视化。
    可视化根据官方文档做还是很简单的,自己动手实现下吧。

    相关文章

      网友评论

        本文标题:Esp8266 D1 Mini检测温湿度(DHT11) 阿里IO

        本文链接:https://www.haomeiwen.com/subject/vmoqlctx.html