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

news2024/11/20 18:30:48

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"这个主题上。实验完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转硬件之C51的玩法(一)——破解“口红糖”中的电路

智能玩具&#xff1a;玩具行业的新风口 玩具是儿童的好伙伴&#xff0c;也是成人的乐趣来源。 随着科技的进步和消费的升级&#xff0c;玩具的形式和功能也在不断创新&#xff0c;智能玩具作为玩具行业的新风口&#xff0c;正受到越来越多的关注和喜爱。 什么是智能玩具&…

美颜与性能的平衡:视频直播美颜SDK集成与性能优化指南

目前美颜SDK所遇到的挑战是如何在追求美颜效果的同时保持系统性能的稳定。本文将深入探讨视频直播美颜SDK的集成以及性能优化的关键指南&#xff0c;以帮助开发者找到合适的平衡点。 一、美颜SDK的集成 1.选择适用于直播的美颜SDK 在美颜SDK的众多选择中&#xff0c;要考虑…

redis之org.springframework.data.redis.RedisSystemException: Error in execution

背景 在运行某系统时&#xff0c;在测试类向redis中存入某值&#xff0c;然后取出。 一、遇到的问题 报错&#xff1a; org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: …

【ruoyi】微服务关闭登录验证码

登录本地的nacos服务&#xff0c;修改&#xff1a;配置管理-配置列表-ruoyi-gateway-dev.yml 将验证码的enabled设置成false&#xff0c;即可

【SpringBoot】SpringBoot自动配置底层源码解析

概述 EnableAutoConfiguration源码解析SpringBoot常用条件注解源码解析SpringBoot之Mybatis自动配置源码解析SpringBoot之AOP自动配置源码解析SpringBoot Jar包启动过程源码解析 DeferredImportSelector接口 DeferredImportSelector和ImportSelector的区别在于&#xff1a; …

Python语言:经典案例分析讲解2

例题1&#xff1a;文件的操作 例题2&#xff1a;调用函数求偶数之和 例题3&#xff1a;调用函数并使用递归的方法求斐波那契数前N项之和 题1: 以只写的模式打开文件test.txt&#xff0c;写入"Python"&#xff0c;关闭文件。 代码如下&#xff1a; f open("E:/…

长江存储诉讼镁光侵权的8个专利是什么?

1.事件背景回顾 据《环球时报》周日从美国加州北区地方法院官方网站获悉&#xff0c;中国领先的存储芯片生产商长江存储科技股份有限公司&#xff08;YMTC&#xff09;周四对美国美光科技及其全资子公司美光消费品集团提起诉讼&#xff0c;指控其侵犯了长江存储的八项专利。 …

Hosts File Editor 实用工具

我一般手工编辑hosts文件&#xff0c;我想给hosts文件加一个开关&#xff0c;本想自己实现&#xff0c;但是忽然发现微软已经提供了官方的解决方案&#xff0c;感觉有能人。 对文件的行的修改被抽象成了一个开关。腻害&#xff01;&#xff01;&#xff01;

Hbuilder介绍,uniapp框架

Hbuilder对程序前端页面进行开发&#xff08;包括android&#xff0c;ios&#xff0c;小程序&#xff0c;web等等&#xff09;,其实也就是相当于把android开发进行前后端分离了。方便分工协作。提高开发效率。 用前端框架开发可以实现一次编码&#xff0c;多平台运行。 &…

酷柚易汛ERP - 序列号状态表操作指南

1、应用场景 序列表状态表统计商品的每个序列号目前的状态&#xff08;在库、已出库&#xff09;&#xff0c;每个序列号仅会显示一条记录。 2、主要操作 打开【仓库】-【序列号状态表】&#xff0c;可勾选序列号在库/已出库两种状态查询&#xff0c;其它筛选操作与上文其它…

学会这个样生成性能测试报告,涨薪5k轻轻松松

[文章末尾给大家留下了大量的福利] JMeter 执⾏原理   JMerer 通过线程组来驱动多个&#xff08;也可以理解为LR⼯具⾥⾯的虚拟⽤户&#xff09;运⾏测试脚本对⽬标服务器发起⼤量的⽹络请求&#xff0c;在每个客户端上可以运⾏多个线程组&#xff0c;也就是说⼀个测试计划⾥…

ObRegisterCallbacks()返回0xC0000022(拒绝访问)解决办法

在开发测试环境下&#xff0c;没有打签名的驱动调用ObRegisterCallbacks会返回0xC0000022&#xff08;拒绝访问&#xff09;的错误码。这是由于该函数内部会进行驱动的签名校验。 具体位置在 因此可以用以下代码绕过该检查 // 以下代码放在DriverEntry中 ULONG_PTR pDrvSectio…

微信公众号制作的资源及网站分享!

微信公众号的出现丰富了我们的网络世界&#xff0c;一篇又一篇的或长或短的文章&#xff0c;让我们碎片化的时间有了去处。而且&#xff0c;我们每个人也可以运营一个微信公众号&#xff0c;人人都可以创建属于自己的微信公众号&#xff0c;无论是记录生活还是分享文章或者想要…

使用代理IP时有哪些小技巧?大数据技术人员必看

很多大数据行业和跨境行业的用户都会使用到一个工具&#xff0c;就是代理IP工具&#xff0c;不过很多人对它的研究不深&#xff0c;其实在使用它时是有一些小技巧的&#xff0c;它不仅可以帮助我们隐蔽我们的真实IP地址&#xff0c;实现多账号矩阵运营&#xff0c;同时还能让我…

找工作去哪个网站比较好

吉鹿力招聘网是一个专注于互联网岗位求职招聘的网站&#xff0c;提供海量的互联网人才储备。它主要覆盖了互联网类招聘&#xff0c;包括技术、产品、设计、运营、市场、销售等。吉鹿力招聘网的特点是用户量大&#xff0c;需求旺盛。如果你希望找工作&#xff0c;吉鹿力招聘网是…

关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案

在我输入:zkServer.sh status 之后出现报错码. 报错码&#xff1a; ZooKeeper JMX enabled by default Using config: /opt/software/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Error contacting service. It is probably not runni…

EXIT(1)

EXTI介绍 EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下 那么是否有第二种方式检测按键是否被按下了呢&#xff1f; 通过EXTI 当EXTI检测到按键的电平发生…

找工作的网站都有哪些

吉鹿力招聘网作为一家知名的招聘网站&#xff0c;因其功能完善和用户隐私保护而备受用户青睐。它不仅可以与企业直接沟通&#xff0c;还可以提供在线聊工作的机会。通过吉鹿力招聘网&#xff0c;用户可以自主选择工作地点、时间和工作类型&#xff0c;大大提高了找到合适工作的…

扫码连接WiFi微信小程序项目(带源码下载)

微信小程序扫码连wifi(共享wifi)(WiFi地推项目)&#xff0c;2023年非常火爆全网的项目 下载: 项目源码 效果图如下 一 扫码连接WiFi如何收益 用户扫码连接WiFi时会有4-15秒的广告弹框,有效时间看完后微信会发送给项目负责人0.5-1元的广告费 (如给1元) 项目负责人(团长)(收益2…

AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大

目录 1 2 3 “AI人”并不算是新鲜事&#xff0c;随着AI的发展&#xff0c;AI主播也开始悄悄进入到直播间中。 持续无间断的直播、比人工费便宜等优势&#xff0c;让很多商家选择了AI主播。 AI主播到底好不好用&#xff1f;终于在今年“双11”现出了原形。 1 AI主播没火过半年…