ESP32采集温湿度-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1602|回复: 0

ESP32采集温湿度

[复制链接]
发表于 2021-9-28 21:48 | 显示全部楼层 |阅读模式
本帖最后由 王大富 于 2021-10-6 22:07 编辑

开发板网址:https://www.arduino.cn/package_esp32_dev_index.json
开发板库中找:esp32
注意esp32的wifi直接用通用的WiFi.h库
主程序
  1. #include <WiFi.h>
  2. #include <DNSServer.h>                           //WiFiManager库要用的
  3. #include <PubSubClient.h>                        //MQTT协议中的库
  4. #include <ArduinoJson.h>                         //调用Json数据库
  5. #include <Wire.h>
  6. #include "DHTesp.h"                              //温度DHT11模块函数库
  7. #include "FastLED.h"                             //FastLED库用于调用随机函数库
  8. #include <stdlib.h>                              //接收数据的转化
  9. #include <stdio.h>

  10. #include "JXBS.h"                                //土壤湿度库
  11. #define debugSerial Serial



  12. ////////////////////////////////////////////////////////
  13. #define PRODUCT_ID "450485"                      //Onenote产品名(需修改)
  14. #define API_KEY    "qcUpl=nNTa1G4ueHll=6tEpyzyw="//"CDglbagwPMllUURDk9mO=qKTozU="//产品密钥(需修改)
  15. #define DEVICE_ID  "757291565"                   //设备名(需修改),与开发板没有关系,由平台生成的
  16. const char* mqttServer = "183.230.40.39";        //onenet地址(不修改)
  17. const uint16_t mqttPort = 6002;                  //mqtt接口端口(不修改)
  18. #define TOPIC      "ceshitopic1"                 //订阅主题
  19. ////////////////////////////////////////////////////////////

  20. #define LED1 D4
  21. #define LED2 D3
  22. #define LVDT_pin A0


  23. DHTesp dht;                                      //温度
  24. WiFiClient wifiClient;                           //
  25. PubSubClient mqttClient(wifiClient);             //

  26. //////////////////////////////////////////////
  27. int count=0,aa =0,bt=0,ii=0,nn=5,n=20,m=1; //一分钟发nn=20                              //定义参数变量
  28. char msgJson[1000];//msgJson数据长度
  29. char msgJson1[1000];//msgJson数据长度
  30. char msg_buf[1000];//
  31. char msg_buf1[1000];//
  32. char dataTemplate0[] = "{"rtRH1":%.2f,"rtT1":%.2f,"rtRH2":%.2f,"rtT2":%.2f,"rtRH3":%.2f,"rtT3":%.2f,"rtRH4":%.2f,"rtT4":%.2f,"rtRH5":%.2f,"rtT5":%.2f,"m":%d}"; //rt代表real time 实时数据
  33. char dataTemplate1[] = "{"RH1":%.2f,"T1":%.2f,"RH2":%.2f,"T2":%.2f,"RH3":%.2f,"T3":%.2f,"RH4":%.2f,"T4":%.2f,"RH5":%.2f,"T5":%.2f}"; //间隔指定时间的数据


  34. extern float  Temp1=0.0, RH1=0.0,Temp2=0.0,RH2=0.0,Temp3=0.0,RH3=0.0,Temp4=0.0,RH4=0.0,Temp5=0.0,RH5=0.0;                                    
  35.                  
  36. ///////////////////////////////////////////////  
  37. const char* ssid = "esp8266";
  38. const char* password =  "esp82661";
  39. /////////////////////////////////////////////////



  40. void setup() {                                  //里面的函数只执行一次
  41.   JXBSInit();
  42.   debugSerial.begin(9600);
  43.       
  44.   WiFi.mode(WIFI_STA);                          //设置wifi模式
  45.   WiFi.begin(ssid, password);
  46.   connectWifi();                                //链接Wifi函数
  47.   mqttClient.setServer(mqttServer, mqttPort);   //mqttServer是onenet地址,mqtt接口端口mqttPort
  48.   mqttClient.setCallback(receiveCallback);      //设置MQTT订阅回调,函数
  49.   connectMQTTServer();                          //链接MQTT服务器函数
  50. }

  51. void loop() {                                   //里面的函数无限循环执行
  52.   if (mqttClient.connected()) {                 //如果开发板成功连接服务器                                         
  53.       pubMQTTmsg();                             //调用pubMQTTmsg()函数发送数据到云端
  54.       mqttClient.loop();                        //调用回调函数,接收平台下发的数据
  55.   } else {                                      //如果开发板未能成功连接服务器
  56.     connectMQTTServer();                        //则尝试连接服务器
  57.   }
  58. }

  59. int tickerCount() {count++;}

  60. void connectMQTTServer() {                     //通过MQTT协议链接Onenet
  61.   String clientId = DEVICE_ID;
  62.   String productId = PRODUCT_ID;
  63.   String apiKey = API_KEY;
  64.   if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
  65.     subscribeTopic();                          //订阅指定主题
  66.   } else {
  67.     delay(3000);
  68.   }
  69. }
  70.                                                
  71. void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
  72.   String topicString = "temperature"+ WiFi.macAddress();
  73.   char subTopic[topicString.length() + 1];
  74.   strcpy(subTopic, topicString.c_str());       //                                                
  75.   if (mqttClient.subscribe(subTopic)){         //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  76.   } else {
  77.   }
  78. }
  79. ///////////////////////////////////
  80. void receiveCallback(char* topic, byte* payload, unsigned int length) {//反调函数用于接收平台下发的消息              
  81.   for (int i = 0; i < length; i++){  //按字符一个一个输出
  82.   }
  83.   payload[length] = '\0'; // 添加一个空值使其转化为字符数组
  84.   String payload1=(char *)payload;
  85.   m = atoi((char *)payload);//将字符数组转化为整型数组
  86.   n=nn*m;
  87.   if (payload1 == "21"){//测试下发数据,如果收到的信息以“21”为开始
  88.     digitalWrite(LED1, HIGH);  // 点亮LED。
  89.   } else if (payload1 == "20"){
  90.     digitalWrite(LED1, LOW);  //熄灭LED。
  91.   }   
  92. }                                                                 
  93. ////////////////////////////////////////
  94.                                                                           
  95. void pubMQTTmsg() {                              //onenet数据点上传系统主题
  96.   String topicString = "$dp";
  97.   char publishTopic[topicString.length() + 1];
  98.   strcpy(publishTopic, topicString.c_str());     //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,json数据转换为数组

  99. /////////////////////////////////////////////////////////////
  100. for(ii=1;ii<=n;ii++){                                       
  101. connectMQTTServer();mqttClient.loop();                        //则尝试连接服务器

  102. //////////////////////////////////////////////////////////////
  103. ////---------------1
  104. readJXBS1();delay(500);JXBSListen1();RH1=RH_1*0.01;   Temp1=temper_1*0.01; connectMQTTServer();mqttClient.loop();
  105. //---------------2
  106. readJXBS2();delay(500);JXBSListen2();RH2=RH_2*0.01;   Temp2=temper_2*0.01; connectMQTTServer();mqttClient.loop();
  107. //---------------3
  108. readJXBS3();delay(500);JXBSListen3();RH3=RH_3*0.01;   Temp3=temper_3*0.01; connectMQTTServer();mqttClient.loop();
  109. //---------------4
  110. readJXBS4();delay(500);JXBSListen4();RH4=RH_4*0.01;   Temp4=temper_4*0.01;  connectMQTTServer();mqttClient.loop();
  111. //---------------5
  112. readJXBS5();delay(500);JXBSListen5();RH5=RH_5*0.01;   Temp5=temper_5*0.01; connectMQTTServer();mqttClient.loop();
  113. //---------------6
  114. //readJXBS6();delay(500);JXBSListen6();RH6=RH_6*0.01;   T6=temper_6*0.01; connectMQTTServer();mqttClient.loop();
  115. ////---------------7
  116. //readJXBS7();delay(500);JXBSListen7();RH7=RH_7*0.01;   T7=temper_7*0.01; connectMQTTServer();mqttClient.loop();
  117. ////---------------8
  118. //readJXBS8();delay(500);JXBSListen8();RH8=RH_8*0.01;   T8=temper_8*0.01; connectMQTTServer();mqttClient.loop();
  119. ////---------------9
  120. //readJXBS9();delay(500);JXBSListen9();RH9=RH_9*0.01;   T9=temper_9*0.01; connectMQTTServer();mqttClient.loop();
  121. ////---------------10
  122. //readJXBS10();delay(500);JXBSListen10();RH10=RH_10*0.01; T10=temper_10*0.01; connectMQTTServer();mqttClient.loop();

  123. //////////////////////////////////////////////////////////////  
  124. snprintf(msgJson, 800, dataTemplate0,RH1,Temp1,RH2,Temp2,RH3,Temp3,RH4,Temp4,RH5,Temp5,m);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson   
  125.   
  126.   int json_len = strlen(msgJson);                //msgJson的长度
  127.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  128.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  129.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  130.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  131.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  132.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  133. }
  134. //////////////////////////////////////////////////
  135. snprintf(msgJson1, 800, dataTemplate1,RH1,Temp1,RH2,Temp2,RH3,Temp3,RH4,Temp4,RH5,Temp5);
  136.   int json_len1 = strlen(msgJson1);                //msgJson的长度
  137.   msg_buf1[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  138.   msg_buf1[1] = char(json_len1 >> 8);              //数据第二位是要发送的数据长度的高八位
  139.   msg_buf1[2] = char(json_len1 & 0xff);            //数据第三位是要发送数据的长度的低八位
  140.   memcpy(msg_buf1 + 3, msgJson1, strlen(msgJson1)); //从msg_buf的第四位开始,放入要传的数据msgJson
  141.   msg_buf1[3 + strlen(msgJson1)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了  
  142.   mqttClient.publish("$dp", (uint8_t *)msg_buf1, 3 + strlen(msgJson1)); //发送数据到主题$dp
  143.          
  144. }

  145. void connectWifi() {                              //wifi连接函数   
  146.   int ii=0;  
  147.   while (WiFi.status()!= WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
  148.   delay(1000);
  149.   }
  150.   Serial.println('\n');                     // WiFi连接成功后
  151.   Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  152.   Serial.println(WiFi.SSID());              // 连接的WiFI名称
  153.   Serial.print("IP address:\t");            // 以及IP
  154.   Serial.println(WiFi.localIP());           // NodeMCU的IP地址  
  155. }
复制代码
子程序

  1. #define MYADRESS1 0x01  //485地址
  2. #define MYADRESS2 0x02  //485地址
  3. #define MYADRESS3 0x03  //485地址
  4. #define MYADRESS4 0x04  //485地址
  5. #define MYADRESS5 0x05  //485地址
  6. #define MYADRESS6 0x06  //485地址
  7. #define MYADRESS7 0x07  //485地址
  8. #define MYADRESS8 0x08  //485地址
  9. #define MYADRESS9 0x09  //485地址
  10. #define MYADRESS10 0x0A  //485地址

  11. const unsigned char  readcmd1[8]={MYADRESS1,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B}; //读取温湿度指令
  12. const unsigned char  readcmd2[8]={MYADRESS2,0x03,0x00,0x00,0x00,0x02,0xC4,0x38}; //读取温湿度指令
  13. const unsigned char  readcmd3[8]={MYADRESS3,0x03,0x00,0x00,0x00,0x02,0xC5,0xE9}; //读取温湿度指令
  14. const unsigned char  readcmd4[8]={MYADRESS4,0x03,0x00,0x00,0x00,0x02,0xC4,0x5E}; //读取温湿度指令
  15. const unsigned char  readcmd5[8]={MYADRESS5,0x03,0x00,0x00,0x00,0x02,0xC5,0x8F}; //读取温湿度指令
  16. const unsigned char  readcmd6[8]={MYADRESS6,0x03,0x00,0x00,0x00,0x02,0xC5,0xBC}; //读取温湿度指令
  17. const unsigned char  readcmd7[8]={MYADRESS7,0x03,0x00,0x00,0x00,0x02,0xC4,0x6D}; //读取温湿度指令
  18. const unsigned char  readcmd8[8]={MYADRESS8,0x03,0x00,0x00,0x00,0x02,0xC4,0x92}; //读取温湿度指令
  19. const unsigned char  readcmd9[8]={MYADRESS9,0x03,0x00,0x00,0x00,0x02,0xC5,0x43}; //读取温湿度指令
  20. const unsigned char  readcmd10[8]={MYADRESS10,0x03,0x00,0x00,0x00,0x02,0xC5,0x70}; //读取温湿度指令



  21. unsigned int RH_1=0,temper_1=0,RH_2=0,temper_2=0,RH_3=0,temper_3=0,RH_4=0,temper_4=0,RH_5=0,temper_5=0;  //湿度
  22. unsigned int RH_6=0,temper_6=0,RH_7=0,temper_7=0,RH_8=0,temper_8=0,RH_9=0,temper_9=0,RH_10=0,temper_10=0;  //湿度

  23. void JXBSInit()
  24. {Serial.begin(9600);}

  25. unsigned char com_buf[48]; //接收数据缓存变量
  26. bool rec_flag=false;
  27. bool rec_flag1=false;
  28. bool receive_success_flag=false;
  29. bool receive_success_flag1=false;

  30. ////////////////////////////////////////// 1 ////////////////////////////////////////
  31. void readJXBS1(){Serial.write(readcmd1,8);}//发射数据
  32. void JXBSListen1(){unsigned char com_num = 0;
  33. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}

  34. if(com_buf[0]==MYADRESS1 && com_buf[1]==0x03){temper_1=com_buf[3]*256+com_buf[4];RH_1=com_buf[5]*256+com_buf[6];
  35. if (temper_1>32768){temper_1=temper_1-65536;}}}  
  36. /////////////////////////////////////////// 2 ////////////////////////////////////////
  37. void readJXBS2(){Serial.write(readcmd2,8);}
  38. void JXBSListen2(){unsigned char com_num = 0;
  39. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  40. if(com_buf[0]==MYADRESS2 && com_buf[1]==0x03){temper_2=com_buf[3]*256+com_buf[4];RH_2=com_buf[5]*256+com_buf[6];
  41. if (temper_2>32768){temper_2=temper_2-65536;}}}  
  42. /////////////////////////////////////////// 3 ////////////////////////////////////////
  43. void readJXBS3(){Serial.write(readcmd3,8);}
  44. void JXBSListen3(){unsigned char com_num = 0;
  45. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  46. if(com_buf[0]==MYADRESS3 && com_buf[1]==0x03){temper_3=com_buf[3]*256+com_buf[4];RH_3=com_buf[5]*256+com_buf[6];
  47. if (temper_3>32768){temper_3=temper_3-65536;}}}  
  48. /////////////////////////////////////////// 4 ////////////////////////////////////////
  49. void readJXBS4(){Serial.write(readcmd4,8);}
  50. void JXBSListen4(){unsigned char com_num = 0;
  51. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  52. if(com_buf[0]==MYADRESS4 && com_buf[1]==0x03){temper_4=com_buf[3]*256+com_buf[4];RH_4=com_buf[5]*256+com_buf[6];
  53. if (temper_4>32768){temper_4=temper_4-65536;}}}  
  54. /////////////////////////////////////////// 5 ////////////////////////////////////////
  55. void readJXBS5(){Serial.write(readcmd5,8);}
  56. void JXBSListen5(){unsigned char com_num = 0;
  57. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  58. if(com_buf[0]==MYADRESS5 && com_buf[1]==0x03){temper_5=com_buf[3]*256+com_buf[4];RH_5=com_buf[5]*256+com_buf[6];
  59. if (temper_5>32768){temper_5=temper_5-65536;}}}  
  60. /////////////////////////////////////////// 6 ////////////////////////////////////////
  61. void readJXBS6(){Serial.write(readcmd6,8);}
  62. void JXBSListen6(){unsigned char com_num = 0;
  63. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  64. if(com_buf[0]==MYADRESS6 && com_buf[1]==0x03){temper_6=com_buf[3]*256+com_buf[4];RH_6=com_buf[5]*256+com_buf[6];
  65. if (temper_6>32768){temper_6=temper_6-65536;}}}
  66. /////////////////////////////////////////// 7 ////////////////////////////////////////
  67. void readJXBS7(){Serial.write(readcmd7,8);}
  68. void JXBSListen7(){unsigned char com_num = 0;
  69. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  70. if(com_buf[0]==MYADRESS7 && com_buf[1]==0x03){temper_7=com_buf[3]*256+com_buf[4];RH_7=com_buf[5]*256+com_buf[6];
  71. if (temper_7>32768){temper_7=temper_7-65536;}}  }
  72. /////////////////////////////////////////// 8 ////////////////////////////////////////
  73. void readJXBS8(){Serial.write(readcmd8,8);}
  74. void JXBSListen8(){unsigned char com_num = 0;
  75. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  76. if(com_buf[0]==MYADRESS8 && com_buf[1]==0x03){temper_8=com_buf[3]*256+com_buf[4];RH_8=com_buf[5]*256+com_buf[6];
  77. if (temper_8>32768){temper_8=temper_8-65536;}}}
  78. /////////////////////////////////////////// 9 ////////////////////////////////////////
  79. void readJXBS9(){Serial.write(readcmd9,8);}
  80. void JXBSListen9(){unsigned char com_num = 0;
  81. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  82. if(com_buf[0]==MYADRESS9 && com_buf[1]==0x03){temper_9=com_buf[3]*256+com_buf[4];RH_9=com_buf[5]*256+com_buf[6];
  83. if (temper_9>32768){temper_9=temper_9-65536;}}  }
  84. ///////////////////////////////////////////10///////////////////////////////////////
  85. void readJXBS10(){Serial.write(readcmd10,8);}
  86. void JXBSListen10(){unsigned char com_num = 0;
  87. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  88. if(com_buf[0]==MYADRESS10 && com_buf[1]==0x03){temper_10=com_buf[3]*256+com_buf[4];RH_10=com_buf[5]*256+com_buf[6];
  89. if (temper_10>32768){temper_10=temper_10-65536;}}  }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-1 04:36 , Processed in 0.071325 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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