ESP32-DHT11温湿度数据上传MQTT服务器

ESP32-DHT11温湿度数据上传MQTT服务器

  • 简介
    • ESP32
    • DHT11
  • 实验
    • 实验说明
    • 接线
    • MQTT服务器
      • 建立连接
      • 添加订阅
    • ESP32驱动DHT11
    • ESP32向MQTT服务器发送数据
    • 上传温湿度数据
    • 实验结果

简介

ESP32


在这里插入图片描述

点击图片购买

ESP32 系列模组集成 Wi-Fi、传统蓝牙和低功耗蓝牙功能,具有广泛的用途:Wi-Fi 支持大范围的通信连接,也支持通过路由器直接连接互联网,同时蓝牙可以让用户连接手机或者广播 Bluetooth LE Beacon 以便于信号检测,可快速搭建物联网项目。
本次实验用到是ESP32-WROOM-32的开发板,通过wifi联网后把传感器的数据上传到MQTT服务器。

DHT11


在这里插入图片描述

点击图片购买

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,传感器通过一个电阻式感湿元件和一个NTC测温元件,通过单线制串行接口与单片机连接、开发即可实现稳定可靠的温湿度测量。

实验

MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,本次实验目的为通过ESP32驱动DHT11,并把DHT11的温湿度数据上传到MQTT服务器,实现远程监测。

实验说明

实验需要用到MQTT服务器,自己搭建或者购买只是用于实验的话有点浪费,可以网上找免费开放的MQTT服务器,实验完全够用。本次实验会用到EMQ X Cloud 上的免费MQTT服务器。所以需要电脑安装MQTT X这个软件,同时准备好DHT11和ESP32开发板。

接线

ESP32DHT11
5VV
GNDG
GPIO5D

MQTT服务器

建立连接

首先在电脑端把MQTT服务器连接上,首先下载安装MQTT X传送门,安装好后打开点击软件主页面里的“+”加号
在这里插入图片描述
在这里插入图片描述
可以根据上面的图片配置,

  1. 名称可以随便填个英文名称
  2. Client ID默认不用管
  3. 服务器地址:broker.emqx.io
  4. 端口:1883
  5. 用户名:emqx
  6. 密码:public
  7. 其他参数按图片上配置就好
    填好配置后点击连接

添加订阅

在这里插入图片描述
在这里插入图片描述
添加TEST/DHT11为主题的订阅,填写好后点击确定即可
在这里插入图片描述

界面如上图后就是已经添加好了订阅,上面的订阅主题可以自行更改。
到这一步MQTT X配置完,“放一边备用”。

ESP32驱动DHT11

由于本文的主要目的是把DHT11的数据上传到MQTT服务器,所以驱动DHT11不详细展开,直接调用“DHT Sensor Library For ESPx”这个库,建单了解一下这个库即可。先实现ESP32驱动DHT11,把温湿度从串口打印输出。
以下是调用“DHT Sensor Library For ESPx”库编写的驱动代码

#include <Arduino.h>
#include "DHTesp.h" 

/** Initialize DHT sensor 1 */
DHTesp dht;

int dhtPin = 5;

/** Data from sensor 1 */
TempAndHumidity dhtData;

void setup() {
	Serial.begin(115200);
  
	// Initialize temperature sensor 1
	dht.setup(dhtPin, DHTesp::DHT11);

}

void loop() {
  dhtData = dht.getTempAndHumidity();  // Read values from sensor 1
	Serial.println("Temp: " + String(dhtData.temperature,2) + "'C Humidity: " + String(dhtData.humidity,1) + "%");
  delay(1000);

} 

输出结果
在这里插入图片描述

ESP32向MQTT服务器发送数据

本次实验中ESP32与MQTT服务器通讯用到的“PubSubClient”和“WiFi”这两个库。
代码中定义的wifi和MQTT参数,代码移植需要修改好自己的WIFI参数和MQTT的参数。

const char *ssid="xxxxxxxx";	//WIFI名称
const char *password="xxxxxxxx";	//WIFI密码

const char *mqtt_broker = "xxxxxxxx";     //MQTT地址
const char *topic = "xxxxxxxx";               //MQTT主题
const char *mqtt_username = "xxxxxxxx";             //MQTT用户名
const char *mqtt_password = "xxxxxxxx";           //MQTT用户密码
const int mqtt_port = xxxxxxxx;                     //MQTT端口

上面定义好的wifi名称和密码,通以下WIFI初始化语句连使得ESP32连接WIFI

 WiFi.begin(ssid,password);

“PubSubClient”库里的setServer和connect函数通过输入MQTT服务器地址、端口号和用户账号连接MQTT服务器

client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
client.connect(client_id.c_str(),mqtt_username,mqtt_password);

订阅主题

client.subscribe(topic);  //订阅topic这个主题

再通过publish函数向MQTT服务器响应的主题发送数据

client.publish(topic,"I AM ESP32"); 

向MQTT服务器的"TEST/DHT11"主题

连接成功并把“I AM ESP32”上传到了MQTT服务器的"TEST/DHT11"这个topic。

#include <WiFi.h>
#include <PubSubClient.h>

//WIFI 参数配置
const char *ssid="JS-TEST";
const char *password="YXDZ@2022";

//MQTT 参数配置
const char *mqtt_broker = "broker.emqx.io";     //MQTT地址
const char *topic = "TEST/DHT11";               //MQTT主题
const char *mqtt_username = "emqx";             //MQTT用户名
const char *mqtt_password = "public";           //MQTT用户密码
const int mqtt_port = 1883;                     //MQTT端口

WiFiClient espClient; //创建WIFI对象
PubSubClient client(espClient);


void setup() {
  // put your setup code here, to run once:
  //初始化串口
  Serial.begin(115200);
  //初始化wifi,连接wifi
  WiFi.begin(ssid,password);
  //检测是否连上wifi,如果没连上一直循环,连上了往下运行
  while(WiFi.status()!=WL_CONNECTED)
  {
    delay(500);
    Serial.println("Connecting to WIFI ...");
    }
    Serial.println("Connecting to WIFI network");
    //连接到MQTT服务器
    client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
    //进入循环开始连接MQTT服务器,连上了就退出循环,没连上就一直循环连接
    while(!client.connected())//判断是否连上MQTT服务器
    {
      //client_id赋值加上设备mac
      String client_id = "esp32-client-";
      client_id +=String(WiFi.macAddress());
      Serial.printf("the client %s connects to public mqtt broker\n",client_id.c_str());
      if(client.connect(client_id.c_str(),mqtt_username,mqtt_password))  //连接MQTT服务器
      {
        Serial.println("Public emqx mqtt broker connected");    //连接成功,打印信息
        }
        else
        {
          Serial.print("failed with state");//连接失败
          Serial.print(client.state()); //重新连接
          delay(2000);
          }
      }

  client.publish(topic,"I AM ESP32"); //发送信息到MQTT服务器
  client.subscribe(topic);  //订阅topic这个主题
}


void loop() {
  // put your main code here, to run repeatedly:
  client.loop();
}

MQTT接收情况在这里插入图片描述
"TEST/DHT11"这个topic收到了“I AM ESP32” 并且串口返回了“Public emqx mqtt broker connected”表示成功连接MQTT服务器成功。
接下来把DHT11的温湿度数据也上传到"TEST/DHT11"这个topic。

上传温湿度数据

上面完成了EPS32驱动DHT11的程序并且也完成了ESP32向MQTT服务器发送数据的程序,把DHT11的数据上传到MQTT服务器就相当于把两个程序整合起来。
由于是免费开发的MQTT服务器,需要注意上传数据的频率,如果频繁向服务器上传数据有可能会禁用。所以这边间隔10s上传一次数据。
整合后的代码

#include <Arduino.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <PubSubClient.h>

DHTesp dht11;
int dhtPin = 5;
TempAndHumidity sensorData;

//WIFI 参数配置
const char *ssid="JS-TEST";
const char *password="YXDZ@2022";

//MQTT 参数配置
const char *mqtt_broker = "broker.emqx.io";     //MQTT地址
const char *topic = "TEST/DHT11";               //MQTT主题
const char *mqtt_username = "emqx";             //MQTT用户名
const char *mqtt_password = "public";           //MQTT用户密码
const int mqtt_port = 1883;                     //MQTT端口


WiFiClient espClient; //创建WIFI对象
PubSubClient client(espClient);



void setup() {
  // put your setup code here, to run once:
  //初始化串口
  Serial.begin(115200);
  //初始化DHT11
  dht11.setup(dhtPin, DHTesp::DHT11);
  //初始化wifi,连接wifi
  WiFi.begin(ssid,password);
  //检测是否连上wifi,如果没连上一直循环,连上了往下运行
  while(WiFi.status()!=WL_CONNECTED)
  {
    delay(500);
    Serial.println("Connecting to WIFI ...");
    }
    Serial.println("Connecting to WIFI network");
    //连接到MQTT服务器
    client.setServer(mqtt_broker,mqtt_port);  //MQTT地址,端口号
    client.setCallback(callback);   //连接回传信息
    //进入循环开始连接MQTT服务器,连上了就退出循环,没连上就一直循环连接
    while(!client.connected())//判断是否连上MQTT服务器
    {
      //client_id赋值加上设备mac
      String client_id = "esp32-client-";
      client_id +=String(WiFi.macAddress());
      Serial.printf("the client %s connects to public mqtt broker\n",client_id.c_str());
      if(client.connect(client_id.c_str(),mqtt_username,mqtt_password))  //连接MQTT服务器
      {
        Serial.println("Public emqx mqtt broker connected");    //连接成功,打印信息
        }
        else
        {
          Serial.print("failed with state");//连接失败
          Serial.print(client.state()); //重新连接
          delay(2000);
          }
      }

  client.publish(topic,"ESP32_HDT11"); //发送信息到MQTT服务器
  client.subscribe(topic);  //订阅topic这个主题
}


void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message arrived in topic:");
  Serial.println(topic);  //打印主题名称
  Serial.print("message:");zhuyi
  //打印MQTT返回的信息
  for(int i=0;i<length;i++)
  {
    Serial.print((char)payload[i]);
    }
  Serial.println();
  Serial.println("--------------------");
  
  
  }


void loop() {
  // put your main code here, to run repeatedly:
 // client.loop();
 
  sensorData = dht11.getTempAndHumidity();
  Serial.println("Temp: " + String(sensorData.temperature,2) + "'C Humidity: " + String(sensorData.humidity,1) + "%");
  client.publish(topic,(("Temp: " + String(sensorData.temperature,2) + "'C Humidity: " + String(sensorData.humidity,1) + "%").c_str())); //发送信息到MQTT服务器
  delay(10000);

}

实验结果

在这里插入图片描述
从上面图片中可以看到Arduino IDE的串口打后数据同步发送到了"TEST/DHT11"这个主题上。实验完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/140556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos7系统离线安装tcpdump抓包软件、使用教程

tcpdump 是Linux系统下的一个强大的命令&#xff0c;可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 本教程对tcpdump命令使用进行讲解说明&#xff0c;通…

对话金山云高级副总裁刘涛 | 做大模型公司的助力者

“ AIGC的应用化阶段将很快到来&#xff1b;AGI&#xff0c;已步入助手阶段。” 口述 | 刘涛 整理 | 梦婕&云舒 出品&#xff5c;极新 在10月的最后一天&#xff0c;极新有幸采访到了金山云高级副总裁刘涛。我们深入探讨了“云计算逐鹿 AIGC”的话题。作为中国公有云互…

Redhat Linux v8.2 实时内核环境配置及参数调优

BC-Linux V8.2 实时内核环境配置及参数调优 -------物理机 & 虚拟机 一、前言 本文档包含有关Redhat Linux for Real Time的基本安装和调试信息。许多行业和组织需要极高性能的计算&#xff0c;并且可能需要低且可预测的延迟&#xff0c;尤其是在金融和电信行业中。延迟&…

【MySQL】入门基础

文章目录 1 :peach:数据库基础:peach:1.1 :apple:什么是数据库:apple:1.2 :apple:主流数据库:apple:1.3 :apple:服务器/数据库/表关系:apple:1.4 :apple:MySQL架构:apple:1.5 :apple:SQL分类:apple:1.6 :apple:存储引擎:apple: 2 :peach:库的操作:peach:2.1 :apple:创建数据库:…

Xilinx MIPI4.3——bg<x>_pin<y>_nc

摘要&#xff1a;由于使用的需要&#xff0c;我要在一个bank上面使用4个MIPI D-PHY&#xff1b;如果pin的指定&#xff0c;跨了bytegroup就会出现bg<x>_pin<y>_nc信号&#xff0c;而且如果一个bit slice control被多个byte group 使用会发生报错&#xff1b;所以我…

202311.13 windows通过vscode ssh远程连接到Ubuntu 连接失败 waiting for server log

关闭VScode时没有关闭终端的Ubuntu进程&#xff1f; 导致重启后不能正常连接到Ubuntu了 Windows 系统自带的cmd终端通过ssh 可以连接 应该是vscode里对Ubuntu 的服务器端配置出了问题 参考&#xff1a;记录 VSCode ssh 连接远程服务器时出错及解决方法 在Windows 的vscode里面执…

关于MySQL优化的思考二【性能分析工具、优化原则】

在实际的工作中&#xff0c;我们不免需要对SQL预计进行分析和优化&#xff0c;今天我们就来一起看下相关内容&#xff1a; SQL性能分析 SQL优化原则 1 SQL性能分析 对SQL进行性能分析&#xff0c;主要有&#xff1a; 查看慢SQL 通过profile详情查看 explain执行计划 1.1…

大语言模型可以学习规则11.13

大型语言模型可以学习规则 摘要1 引言2 准备3 从假设到理论3.1 诱导阶段&#xff1a;规则生成和验证3.2 演绎阶段&#xff1a;使用规则库进行显式推理 4 实验评估实验装置4.2 数字推理 5 相关工作 摘要 当提示一些例子和中间步骤时&#xff0c;大型语言模型&#xff08;LLM&am…

Kotlin之控制语句和表达式

原文链接 Kotlin Controls and Expressions 有结果返回的是表达式&#xff0c;没有返回的称之为语句&#xff0c;语句最大的问题是它没有返回值&#xff0c;那么想要保存结果就必然会产生副作用&#xff0c;比如改变变量。很多时候这是不够方便的&#xff0c;并且在多线程条件…

基于springboot实现社区疫情防控平台管理系统项目【项目源码】

基于springboot实现社区疫情防控平台管理系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计&#xff0c;其不仅继承了Spring框架原来有的优秀特性&#xff0c;而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在…

语言大模型的预训练过程——从无尽数据到海量知识

从目前研究结果看&#xff0c;Transformer是足够强大的特征抽取器&#xff0c;通过预训练过程&#xff0c;Transformer学到了什么&#xff1f;知识是如何存取的&#xff1f;我们又如何修正错误知识&#xff1f;本文讲述这方面的研究进展。 1、求知&#xff1a;LLM学到了什么知…

【代码随想录】算法训练计划20

1、654. 最大二叉树 题目&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建…

YOLO目标检测——番茄数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;番茄检测数据集说明&#xff1a;番茄目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

CMake中的字符串操作

如果使用set进行字符串拼接&#xff0c;对应的命令格式如下&#xff1a; set(变量名1 ${变量名1} ${变量名2} ...) 关于上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接&#xff0c;最后将结果存储到第一个参数中&#xff0c;如果第一个参数中原来有数据会对原…

机器自主程度越高人机融合可能会越难

智能算法是指利用人工智能技术来处理和解决问题的算法。这些算法通过模仿人类的思维和学习过程&#xff0c;可以自动从数据中提取知识、推断和决策。尽管智能算法的智能程度可能存在不同的层次&#xff0c;但它们都具有一定的智能特征&#xff0c;并能够完成一些复杂的任务。如…

如何应对网站攻击?F5聚焦网站安全防护

有关数据表明&#xff0c;2023以来全球累计超过1400多万个网站遭受了超过10亿次的网络攻击&#xff0c;几乎每个网站都面临风险。无论是电商、论坛还是官方的平台都不可避免遭遇攻击&#xff0c;黑客则利用网络服务的中断期间从事窃取信息等非法活动。在多种攻击手段中&#xf…

计算机基础知识50

数据的增删改查(insert update delete select) # 用户列表的展示&#xff1a; # 把数据表中得用户数据都给查询出来展示在页面上 1. 查询 from app01 import models models.UserInfo.objects.all() # 查询所有的字段信息和数据 resmodels.UserInfo.objects.first() # 查询…

Arcgis打开报错error code=-15

Provide your license server administrator with the following information: Error Code -15 问题描述 原因 长时间闲置后&#xff0c;license server administrator会关闭服务。再次打开之后会出现这个报错 解决方案 重启或者按下述做法&#xff1a; 打开任务管理器&am…

一文2000字从0到1使用压测神器JMeter进行压力测试!

概 述 Apache JMeter 是 Apache组织开发的基于 Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web应用测试但后来扩展到其他测试领域。它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库&#xff0c; FTP 服…

CC1310F128RSMR Sub-1GHz超低功耗无线微控制器芯片

CC1310F128RSMR QFN-32 Sub-1GHz超低功耗无线微控制器 CC1310F128RSMR是一款低成本、 超低功耗、Sub-1 GHz射频器件&#xff0c;它是Simplel ink微控制器(MCU)平台的一部分。该平台由Wi- Fi组成、蓝牙低功耗&#xff0c;Sub-1 GHz&#xff0c;以太网&#xff0c;Zigbee线程和主…