一、实验准备

1.材料准备

(1)nodemcu开发板
(2)dth11温湿度传感器
(3)杜邦线三根
(4)安卓数据线一根

2.软件准备

(1)Arduino编译器

二、硬件知识了解

我先首先需要了解nodemcu开发板和温度传感器的一些知识,如下图
IMG_20210731_180301.jpg

其中左边右边的一排是引脚,其中GND是地线负极,3V是正极,RX,TX是负责通信的,D1-D5是不同数据传输端口。
下列是dth11温度传感器引脚对应的示意。
请输入图片描述

其中GND是用于对接电源的正极,VCC用于对接电源的负极,而其中DATA引脚用于传输数据使用。

三、实战操作

(1).硬件相连
我们首先需要使用杜邦线将nodemcu开发板的GND引脚与dth11温度传感器的GND引脚相连,然后将开发板的3v引脚与dth11的VCC对接,然后将开发板D4引脚与dth11的data引脚对接,开发板与温度传感器的对接就结束了
24ldqv8sv6bz39zzurt9ebmnd_0.jpg

(2).我们需要安装CH340G usb驱动
因为我们电脑无法识别这个开发板,我们需要下载对应的驱动插上电源后电脑才可以识别此驱动,才可以找到开发板暴漏的端口信息。
下载地址如下 http://www.wch.cn/downloads/CH341SER_EXE.html

(3).打开Arduino软件,添加esp8266模块
打开工具->开发板->开发板管理->输入esp8266,然后下载 by ESP8266 Community版本的
99c0310c62d0f7654221d937ae7b5866dd9999a5dfab1035538173b464b9caccQzpcVXNlcnNcc2FuZmVuZ1xBcHBEYXRhXFJvYW1pbmdcRGluZ1RhbGtcMzk1ODU0MzE5X3YyXEltYWdlRmlsZXNcMTYyNzcyNzY0MjU3Nl8xMEU3Q0ZGQy1CNjAzLTRlNzQtQkMxNy1FMjNGRkRCMDEwNEYucG5n.png

(4).安装PubSubClient和dht库
PubSubClient主要是链接mqtt,发布订阅mqtt的库,而dht是关于根据dth温度传感器读取实时温度的库,
打开工具->管理库->分别输入PubSubClient 和 dht,下载PubSubClient。我们PubSubClient 选择 by Nick O'Leary这个版本的,而dht选择 Adafruit版本的
ef0e0dda4f707a9e6e12154c307c5f15d2644b244332c8cbdf3b1a152b63a2a9QzpcVXNlcnNcc2FuZmVuZ1xBcHBEYXRhXFJvYW1pbmdcRGluZ1RhbGtcMzk1ODU0MzE5X3YyXEltYWdlRmlsZXNcMTYyNzcyNzkzMTQ0MV82MTAxMUZFNy04NDVCLTRmNWQtOUYyRC04M0FBOTQ1QUQxRjYucG5n.png
安装完之后我们还需要将此安装包解压放到库文件中要不是下面程序会运行错误
https://blog.dtse.ha.cn/usr/uploads/2021/07/3579755700.zip

(5).编写代码
其中我们需要配置wifi名称 wifi密码,物联网认证平台用户名以及密码以及链接地址,以及湿度和温度传输消息队列的通道

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN D4                                        //DHT11连接的哪个管脚
#define STASSID "数信智能"                                //wifi名称
#define STAPSK  "dima04dima10"                           //wifi密码
#define USERNAME "sanfeng"                               //物联网平台认证用户名
#define PASSWORD  "123456"                               //物联网平台认证密码
#define mqtt_server "p3f9a2fe.cn-shenzhen.emqx.cloud"    //物联网平台服务器地址
#define humidity_topic "testtopic/humidity"              //湿度传输的消息队列
#define temperature_topic "testtopic/temperature"        //温度传输的消息队列
#define DHTTYPE DHT11                                    // DHT 11


WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);                               //设置DHT参数(参数在上边有定义)

//启动程序                                                  
void setup() {
    Serial.begin(9600);                                  //使用9600波特率(根据开发板的比特率查看)
    Serial.println(ESP.getFullVersion());           
    //连接wifi
    setup_wifi();         
    client.setServer(mqtt_server, 15839);
    dht.begin();
}

//连接wifi在setup中调用
void setup_wifi() {
    delay(10);
    WiFi.mode(WIFI_STA);
    //连接wifi(参数在上面有定义)
    WiFi.begin(STASSID, STAPSK);
    //判断wifi状态
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
}

// 重新连接物联网平台
void reconnect() {
    // 循环,直到重新连接
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        if (client.connect("nodeMcuDHT11",USERNAME,PASSWORD)) {
            Serial.println("connected");
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

//检测
bool checkBound(float newValue, float prevValue, float maxDiff) {
    return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}

//设置发送上一条消息的时间
long lastMsg = 0;
//记录上一条温度数据
float temp = 0.0;
//记录上一条湿度数据
float hum = 0.0;
float diff = 1.0;

void loop() {
    // 判断物联网平台是否连接成功
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
    // 获取现在的时间
    long now = millis();
    if (now - lastMsg > 30000) {
        // 两次测量之间等待30秒
        lastMsg = now;
        // 获取现在的温度
        float newTemp = dht.readTemperature();
        // 获取现在的湿度
        float newHum = dht.readHumidity();
        // 在窗口打印温度,并且将温度传输到消息队列中
        if (checkBound(newTemp, temp, diff)) {
            temp = newTemp;
            Serial.print("New temperature:");
            Serial.println(String(temp).c_str());
            client.publish(temperature_topic, String(temp).c_str(), true);
        }
        // 在窗口打印湿度,并且将湿度传输到消息队列中
        if (checkBound(newHum, hum, diff)) {
            hum = newHum;
            Serial.print("New humidity:");
            Serial.println(String(hum).c_str());
            client.publish(humidity_topic, String(hum).c_str(), true);
        }
    }
}

(6).实战
然后我们将安卓数据线跟开发板进行连接,然后我们可以在电脑的设备管理器中的端口中看到CH340,如果可以看到说明电脑已经检测到开发板的连接了。
fdb15ff1458ac7790c4a938713a01c6967c9513c7bc2a3ad1787be18b36c91ddQzpcVXNlcnNcc2FuZmVuZ1xBcHBEYXRhXFJvYW1pbmdcRGluZ1RhbGtcMzk1ODU0MzE5X3YyXEltYWdlRmlsZXNcMTYyNzcyODQ1NDA5N184RTE1RUE2OC03M0E0LTRlOTYtODlDRi1CN0NERkRFQjhGOUYucG5n.png

此时我们点击工具选择COM3端口。并且开发板选择nodemcu1.0开发板
选择完之后我们就可以烧录我们的程序到开发板了。

(7).错误解决
如果出现 fatal error: Adafruit_Sensor.h: No such file or directory这个错误
我们需要将这个文件复制到库libalrys文件列表下
https://blog.dtse.ha.cn/usr/uploads/2021/07/449105554.zip

(8).效果
最总我们烧录成功之后我们就可以在物联网平台上看到室内实时的温度湿度情况啦
bd1a7b6a210bb352ace4e132c283c85a26ad8bad153095764a8b55a6cc7cf144QzpcVXNlcnNcc2FuZmVuZ1xBcHBEYXRhXFJvYW1pbmdcRGluZ1RhbGtcMzk1ODU0MzE5X3YyXEltYWdlRmlsZXNcMTYyNzcyOTIwNTczMF9BNzZGMjcwMS0yMkRDLTQwNTUtODBCRC0zM0I3RTA1Q0NERDEucG5n.png

Last modification:July 31st, 2021 at 07:12 pm
如果觉得我的文章对你有用,请随意赞赏