ESP8266+DHT11+MQTT+WEB-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2700|回复: 4

ESP8266+DHT11+MQTT+WEB

[复制链接]
发表于 2022-3-24 10:35 | 显示全部楼层 |阅读模式
本帖最后由 353529281 于 2022-3-24 10:39 编辑

Arduino部分代码
  1. /*
  2. 2022年3月24日
  3. ESP8266+DHT11+MQTT+WEB
  4. 功能:
  5. ESP8266获取传感器DHT11传递给网页端显示
  6. 材料:
  7. ESP8266
  8. DHT11
  9. MQTT服务器
  10. 注:测试用的MTQQ服务器地址https://www.emqx.com/zh/mqtt/public-mqtt5-broker

  11. 作者:九洲创客
  12. QQ:353529281
  13. */
  14. #include <ESP8266WiFi.h>    //WIFI库
  15. #include <PubSubClient.h>   //MQTT库
  16. #include <Ticker.h>         //定时器库
  17. #include <DHT.h>            //DHT库

  18. //设置DHT引脚
  19. #define DHTPIN D5
  20. #define DHTTYPE DHT11
  21. DHT dht(DHTPIN, DHTTYPE);

  22. // 设置wifi接入信息(请根据您的WiFi信息进行修改)
  23. const char* ssid = "";
  24. const char* password = ";
  25. const char* mqttServer = "broker.emqx.io";

  26. Ticker ticker;
  27. WiFiClient wifiClient;
  28. PubSubClient mqttClient(wifiClient);

  29. int count;    // Ticker计数用变量
  30. float h;    //湿度
  31. float t;    //温度

  32. void setup() {
  33.   Serial.begin(9600);
  34.   
  35.   //设置ESP8266工作模式为无线终端模式
  36.   WiFi.mode(WIFI_STA);
  37.   
  38.   // 连接WiFi
  39.   connectWifi();
  40.   
  41.   // 设置MQTT服务器和端口号
  42.   mqttClient.setServer(mqttServer, 1883);

  43.   // 连接MQTT服务器
  44.   connectMQTTServer();

  45.   // Ticker定时对象
  46.   ticker.attach(1, tickerCount);  

  47.   //DHT对象
  48.   dht.begin();
  49. }

  50. void loop() {
  51.   //DHT温度和温度
  52.   h = dht.readHumidity();
  53.   t = dht.readTemperature();
  54.   if (isnan(h) || isnan(t)) {
  55.     h=0;
  56.     t=0;
  57.   }
  58.   if (mqttClient.connected()) { // 如果开发板成功连接服务器
  59.     // 每隔3秒钟发布一次信息
  60.     if (count >= 3){
  61.       pubMQTTmsg();
  62.       count = 0;
  63.     }   
  64.     // 保持心跳
  65.     mqttClient.loop();
  66.   } else {                  // 如果开发板未能成功连接服务器
  67.     connectMQTTServer();    // 则尝试连接服务器
  68.   }
  69. }

  70. void tickerCount(){
  71.   count++;
  72. }

  73. void connectMQTTServer(){
  74.   // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  75.   String clientId = "esp8266-" + WiFi.macAddress();

  76.   // 连接MQTT服务器
  77.   if (mqttClient.connect(clientId.c_str())) {
  78.     Serial.println("MQTT Server Connected.");
  79.     Serial.println("Server Address: ");
  80.     Serial.println(mqttServer);
  81.     Serial.println("ClientId:");
  82.     Serial.println(clientId);
  83.   } else {
  84.     Serial.print("MQTT Server Connect Failed. Client State:");
  85.     Serial.println(mqttClient.state());
  86.     delay(3000);
  87.   }   
  88. }

  89. // 发布信息
  90. void pubMQTTmsg(){
  91.   
  92.   //发布的主题
  93.   String topicString = "wendu";
  94.   char publishTopic[topicString.length() + 1];  
  95.   strcpy(publishTopic, topicString.c_str());

  96.   // 建立发布信息。信息内容以JSON格式发布。
  97.   String messageString ="{"wendu":"+ String(t)+","shidu": "+String(h)+"}";
  98.   char publishMsg[messageString.length() + 1];   
  99.   strcpy(publishMsg, messageString.c_str());

  100.   // 实现ESP8266向主题发布信息
  101.   if(mqttClient.publish(publishTopic, publishMsg)){
  102.     Serial.println("Publish Topic:");Serial.println(publishTopic);
  103.     Serial.println("Publish message:");Serial.println(publishMsg);   
  104.   } else {
  105.     Serial.println("Message Publish Failed.");
  106.   }
  107. }

  108. // ESP8266连接wifi
  109. void connectWifi(){

  110.   WiFi.begin(ssid, password);

  111.   //等待WiFi连接,成功连接后输出成功信息
  112.   while (WiFi.status() != WL_CONNECTED) {
  113.     delay(1000);
  114.     Serial.print(".");
  115.   }
  116.   Serial.println("");
  117.   Serial.println("WiFi Connected!");  
  118.   Serial.println("");
  119. }
复制代码

Html部分代码(可直接新建文本另存为index.html;复制下面代码保存,双击打开即可。)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.     <head>
  4.     <meta charset="UTF-8">
  5.     <title>ESP8266+MQTT+DHT11+WEB</title>
  6.     <style type="text/css">
  7. div {
  8.         width: 33%;
  9.         height: 300px;
  10.         float: left;
  11.         border: red solid 1px;
  12. }
  13. </style>
  14.     <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js" ></script>
  15.     <script src="https://unpkg.com/mqtt/dist/mqtt.min.js" ></script>
  16.     <script type="text/javascript">
  17.             const options = {
  18.                 clean: true,
  19.                 connectTimeout: 4000,
  20.                 clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
  21.                 username: "",
  22.                 password: ''
  23.             }
  24.                        
  25.                        
  26.                         /******需要修改的订阅主题和MQTT服务器地址****/
  27.                         const toppic="wendu";
  28.             const connectUrl = 'ws://broker.emqx.io:8083/mqtt';
  29.                         /******需要修改的订阅主题和MQTT服务器地址*/
  30.                        
  31.                        
  32.             const client = mqtt.connect(connectUrl, options);

  33.             //当重新连接启动触发回调
  34.             client.on('reconnect', () => {
  35.                 $("#div1").text("正在重连.....");
  36.             });
  37.             //连接断开后触发的回调
  38.             client.on("close",function () {
  39.                 $("#div1").text("客户端已断开连接.....");
  40.             });
  41.             //从broker接收到断开连接的数据包后发出。MQTT 5.0特性
  42.             client.on("disconnect",function (packet) {
  43.                 $("#div1").text("从broker接收到断开连接的数据包....."+packet);
  44.             });
  45.             //客户端脱机下线触发回调
  46.             client.on("offline",function () {
  47.                 $("#div1").text("客户端脱机下线.....");
  48.             });
  49.             //当客户端无法连接或出现错误时触发回调
  50.             client.on("error",(error) =>{
  51.                 $("#div1").text("客户端出现错误....."+error);
  52.             });
  53.             //当客户端发送任何数据包时发出。这包括published()包以及MQTT用于管理订阅和连接的包
  54.             client.on("packetsend",(packet)=>{
  55.                 $("#div1").text("客户端已发出数据包....."+packet);
  56.             });
  57.             //当客户端接收到任何数据包时发出。这包括来自订阅主题的信息包以及MQTT用于管理订阅和连接的信息包
  58.             client.on("packetreceive",(packet)=>{
  59.                 $("#div1").text("客户端已收到数据包....."+packet);
  60.             });

  61.             //成功连接后触发的回调
  62.             client.on("connect",function (connack) {
  63.                 $("#div1").text("成功连接上服务器"+new Date());
  64.                 //订阅某主题
  65.                 /**
  66.                  * client.subscribe(topic/topic array/topic object, [options], [callback])
  67.                  * topic:一个string类型的topic或者一个topic数组,也可以是一个对象
  68.                  * options
  69.                  */
  70.                 client.subscribe(toppic,{qos:0});
  71.                 //每隔2秒发布一次数据
  72.                 //setInterval(publish,2000)
  73.             });

  74.             function publish() {
  75.                 //发布数据
  76.                 /**
  77.                  * client.publish(topic,message,[options], [callback])
  78.                  *
  79.                  * message: Buffer or String
  80.                  * options:{
  81.                  * qos:0, //默认0
  82.                  * retain:false, //默认false
  83.                  * dup:false, //默认false
  84.                  * properties:{}
  85.                  * }
  86.                  * callback:function (err){}
  87.                  */
  88.                 const message = "h5 message "+Math.random()+new Date();
  89.                 client.publish(toppic,message,{qos:0});
  90.                 $("#div2").text("客户端发布了数据:"+message);
  91.             }

  92.             //当客户端接收到发布消息时触发回调
  93.             /**
  94.              * topic:收到的数据包的topic
  95.              * message:收到的数据包的负载playload
  96.              * packet:收到的数据包
  97.              */
  98.             client.on('message', (topic, message,packet) => {
  99.                         $("#div2").text("客户端收到订阅消息,topic="+topic+";消息数据:"+message+";数据包:"+packet);
  100.                         var obj =JSON.parse(message);
  101.                         $("#div3").text("温度:"+obj.wendu+"℃;湿度:"+obj.shidu+"%")
  102.             });
  103.                         ;
  104.             //页面离开自动断开连接
  105.             $(window).bind("beforeunload",()=>{
  106.                 $("#div1").text("客户端窗口关闭,断开连接");
  107.                 client.disconnect();
  108.             })
  109.     </script>
  110.     </head>
  111.     <body>
  112. <div id="div1"></div>
  113. <div id="div2"></div>
  114. <div id="div3"></div>
  115. </body>
  116. </html>
复制代码



发表于 2022-3-24 16:07 | 显示全部楼层
大神,膜拜。刚刚入坑!
发表于 2022-4-29 17:10 | 显示全部楼层
你好,可以分享全部源码或者购买吗
发表于 2022-5-8 01:12 | 显示全部楼层
18行那个DHT.h的库是哪个在哪里下的???
发表于 2022-5-22 11:08 | 显示全部楼层
error: unable to find string literal operator 'operator""wendu' with 'const char [3]', 'unsigned int' arguments
       String messageString ="{"wendu":"+ String(t)+","shidu": "+String(h)+"}";
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:24 , Processed in 0.122641 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表