敦煌混凝土温湿度监测-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1810|回复: 3

敦煌混凝土温湿度监测

[复制链接]
发表于 2021-8-7 04:23 | 显示全部楼层 |阅读模式
本帖最后由 王大富 于 2021-8-9 22:11 编辑

主程序
  1. #include <ESP8266WiFi.h>                         //esp8266wifi模块库
  2. #include <ESP8266WiFiMulti.h>                    //自动链接最强wifi库
  3. #include <DNSServer.h>                           //WiFiManager库要用的
  4. #include <PubSubClient.h>                        //MQTT协议中的库
  5. #include <Ticker.h>                              //时间记录库
  6. #include <ArduinoJson.h>                         //调用Json数据库
  7. #include <Wire.h>
  8. //#include <WiFiManager.h>                         //WiFiManager库
  9. #include "DHTesp.h"                              //温度DHT11模块函数库
  10. #include "FastLED.h"                             //FastLED库用于调用随机函数库
  11. #include <stdlib.h>                              //接收数据的转化
  12. #include <stdio.h>

  13. #include "JXBS.h"                                //土壤湿度库
  14. #define debugSerial Serial1


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


  21. #define LED1 D2
  22. #define LED2 D3
  23. #define LVDT_pin A0

  24. ESP8266WiFiMulti wifiMulti;                      //自动链接wifi
  25. DHTesp dht;                                      //温度
  26. WiFiClient wifiClient;                           //
  27. PubSubClient mqttClient(wifiClient);             //
  28. Ticker ticker;                                   //用于记录时间

  29. int count=0,aa =0,bt=0;                               //定义参数变量
  30. char msgJson[400];//msgJson数据长度
  31. char msg_buf[400];//
  32. char dataTemplate[] = "{"RH1":%.2f,"T1":%.2f,"RH2":%.2f,"T2":%.2f,"RH3":%.2f,"T3":%.2f,"RH4":%.2f,"T4":%.2f,"RH5":%.2f,"T5":%.2f, "RH6":%.2f,"T6":%.2f,"RH7":%.2f,"T7":%.2f,"RH8":%.2f,"T8":%.2f,"RH9":%.2f,"T9":%.2f}";
  33. extern float  T1 = 0.0, RH1 = 0.0,T2 = 0.0, RH2 = 0.0,T3 = 0.0, RH3 = 0.0,T4 = 0.0, RH4 = 0.0,T5 = 0.0, RH5 = 0.0;                                       
  34. extern float  T6 = 0.0, RH6 = 0.0,T7 = 0.0, RH7 = 0.0,T8 = 0.0, RH8 = 0.0,T9 = 0.0, RH9 = 0.0;

  35. void setup() {                                  //里面的函数只执行一次
  36.   JXBSInit();
  37.   debugSerial.begin(9600);
  38.   
  39.   wifiMulti.addAP("CMCC-PbWq","9bf07201");//添加多个wifi网络
  40.   wifiMulti.addAP("4G-UFI-19DE","seuseucyd");
  41.   wifiMulti.addAP("esp8266","esp82661");
  42.   wifiMulti.addAP("4G-UFI-5FD6","onenetesp8266");
  43.   wifiMulti.addAP("MERCURY_6A1A","datalogging");
  44.       
  45.   WiFi.mode(WIFI_STA);                          //设置wifi模式
  46. // dht.setup(D4, DHTesp::DHT11);                 //温湿度模块DHT11初始化,D4脚位
  47.   connectWifi();                                //链接Wifi函数
  48.   mqttClient.setServer(mqttServer, mqttPort);   //mqttServer是onenet地址,mqtt接口端口mqttPort
  49.   mqttClient.setCallback(receiveCallback);      //设置MQTT订阅回调,函数
  50.   connectMQTTServer();                          //链接MQTT服务器函数
  51.   ticker.attach(1, tickerCount);  
  52. }

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

  62. int tickerCount() {
  63.   count++;
  64. }
  65. void connectMQTTServer() {                     //通过MQTT协议链接Onenet
  66.   String clientId = DEVICE_ID;
  67.   String productId = PRODUCT_ID;
  68.   String apiKey = API_KEY;
  69.   if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
  70. //    Serial.println("MQTT Server Connected.");
  71. //    Serial.println("Server Address: ");
  72. //    Serial.println(mqttServer);
  73. //    Serial.println("ClientId:");
  74. //    Serial.println(clientId);
  75.     subscribeTopic();                          //订阅指定主题
  76.   } else {
  77.     //Serial.print("MQTT Server Connect Failed. Client State:");
  78.    // Serial.println(mqttClient.state());
  79.     delay(3000);
  80.   }
  81. }
  82.                                                
  83. void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
  84.   String topicString = "temperature"+ WiFi.macAddress();
  85.   char subTopic[topicString.length() + 1];
  86.   strcpy(subTopic, topicString.c_str());       //                                                
  87.   if (mqttClient.subscribe(subTopic)){         //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  88.     //Serial.println("Subscrib Topic:");
  89.     //Serial.println(subTopic);
  90.   } else {
  91.     //Serial.print("Subscribe Fail...");
  92.   }
  93. }

  94. void receiveCallback(char* topic, byte* payload, unsigned int length) {//反调函数用于接收平台下发的消息
  95.   //Serial.print("Message Received [");
  96. // Serial.print(topic);
  97.   //Serial.print("]");               
  98.   for (int i = 0; i < length; i++){  //按字符一个一个输出
  99.    // Serial.print((char)payload[i]);
  100.   }
  101.   //Serial.println("");
  102. // Serial.print("Message Length(Bytes)");
  103. // Serial.println(length);
  104.   payload[length] = '\0'; // 添加一个空值使其转化为字符数组
  105.   String payload1=(char *)payload;
  106.   int aNumber = atoi((char *)payload);//将字符数组转化为整型数组
  107.   //analogWrite(LED2, aNumber);  
  108.   if (payload1 == "21"){//测试下发数据,如果收到的信息以“1”为开始
  109.     //digitalWrite(LED2, HIGH);  // 点亮LED。
  110.   //  Serial.println("LED ON");
  111.   } else if (payload1 == "20"){
  112.    // digitalWrite(LED2, LOW);  //熄灭LED。
  113.    // Serial.println("LED OFF");
  114.   }   
  115. }                                                                 
  116.                                                                            
  117. void pubMQTTmsg() {                              //onenet数据点上传系统主题
  118.   String topicString = "$dp";
  119.   char publishTopic[topicString.length() + 1];
  120.   strcpy(publishTopic, topicString.c_str());     //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,json数据转换为数组

  121. ////////////////////////////////////////////////////////////
  122. //---------------1
  123. readJXBS1();
  124. delay(500);
  125. JXBSListen1();
  126. RH1=RH_1*0.01;   
  127. T1=temper_1*0.01;  
  128. //---------------2
  129. readJXBS2();
  130. delay(500);
  131. JXBSListen2();
  132. RH2=RH_2*0.01;   
  133. T2=temper_2*0.01;  
  134. //---------------3
  135. readJXBS3();
  136. delay(500);
  137. JXBSListen3();
  138. RH3=RH_3*0.01;   
  139. T3=temper_3*0.01;  
  140. //---------------4
  141. readJXBS4();
  142. delay(500);
  143. JXBSListen4();
  144. RH4=RH_4*0.01;   
  145. T4=temper_4*0.01;  
  146. //---------------5
  147. readJXBS5();
  148. delay(500);
  149. JXBSListen5();
  150. RH5=RH_5*0.01;   
  151. T5=temper_5*0.01;  

  152. //---------------6
  153. readJXBS6();
  154. delay(500);
  155. JXBSListen6();
  156. RH6=RH_6*0.01;   
  157. T6=temper_6*0.01;  
  158. //---------------7
  159. readJXBS7();
  160. delay(500);
  161. JXBSListen7();
  162. RH7=RH_7*0.01;   
  163. T7=temper_7*0.01;  
  164. //---------------8
  165. readJXBS8();
  166. delay(500);
  167. JXBSListen8();
  168. RH8=RH_8*0.01;   
  169. T8=temper_8*0.01;  
  170. //---------------9
  171. readJXBS9();
  172. delay(500);
  173. JXBSListen9();
  174. RH9=RH_9*0.01;   
  175. T9=temper_9*0.01;

  176. ////////////////////////////////////////////////

  177.   
  178.   snprintf(msgJson, 400, dataTemplate,RH1,T1,RH2,T2,RH3,T3,RH4,T4,RH5,T5,RH6,T6,RH7,T7,RH8,T8,RH9,T9);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
  179.   int json_len = strlen(msgJson);                //msgJson的长度
  180.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  181.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  182.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  183.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  184.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  185.   //Serial.print("public message:");Serial.println(msgJson);//向串口发送订阅信息
  186.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  187. // Serial.println(strlen(msgJson));
  188. }

  189. void connectWifi() {                              //wifi连接函数  
  190.   //Serial.print("Connecting...");
  191.   //WiFiManager wifiManager;// 建立WiFiManager对象
  192.   //wifiManager.resetSettings();// 清除ESP8266所存储的WiFi连接信息以便测试WiFiManager工作效果
  193.   //wifiManager.autoConnect("AutoConnectAP");// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称  
  194.   int ii=0;  
  195.   while (wifiMulti.run() != WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
  196.   delay(1000);
  197.   //Serial.print("ii++");Serial.print(" ");
  198.   }
  199.   //Serial.println('\n');                     // WiFi连接成功后
  200.   //Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  201.   //Serial.println(WiFi.SSID());              // 连接的WiFI名称
  202.   //Serial.print("IP address:\t");            // 以及IP
  203.   //Serial.println(WiFi.localIP());           // NodeMCU的IP地址  
  204. }
复制代码
子程序

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



  19. 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;  //湿度
  20. 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;  //湿度

  21. void JXBSInit()
  22. {Serial.begin(9600);}

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

  28. ////////////////////////////////////////// 1 ////////////////////////////////////////
  29. void readJXBS1()
  30. {Serial.write(readcmd1,8);//发射数据
  31. }

  32. void JXBSListen1()
  33. {unsigned char com_num = 0;
  34. while (Serial.available())
  35.    {char inChar = (char)Serial.read();
  36.     com_buf[com_num] = inChar;
  37.     com_num++;
  38.     delay(2);
  39.    }
  40.     if(com_buf[0]==MYADRESS1 && com_buf[1]==0x03)
  41.        {temper_1=com_buf[3]*256+com_buf[4];
  42.        RH_1=com_buf[5]*256+com_buf[6];
  43.        if (temper_1>32768){temper_1=temper_1-65536;}
  44.        }  
  45. }  
  46. /////////////////////////////////////////// 2 ////////////////////////////////////////
  47. void readJXBS2()
  48. {Serial.write(readcmd2,8);//发射数据
  49. }

  50. void JXBSListen2()
  51. {unsigned char com_num = 0;
  52. while (Serial.available())
  53.    {char inChar = (char)Serial.read();
  54.     com_buf[com_num] = inChar;
  55.     com_num++;
  56.     delay(2);
  57.    }
  58.     if(com_buf[0]==MYADRESS2 && com_buf[1]==0x03)
  59.        {temper_2=com_buf[3]*256+com_buf[4];
  60.        RH_2=com_buf[5]*256+com_buf[6];
  61.        if (temper_2>32768){temper_2=temper_2-65536;}
  62.        }  
  63. }  
  64. /////////////////////////////////////////// 3 ////////////////////////////////////////
  65. void readJXBS3()
  66. {Serial.write(readcmd3,8);//发射数据
  67. }

  68. void JXBSListen3()
  69. {unsigned char com_num = 0;
  70. while (Serial.available())
  71.    {char inChar = (char)Serial.read();
  72.     com_buf[com_num] = inChar;
  73.     com_num++;
  74.     delay(2);
  75.    }
  76.     if(com_buf[0]==MYADRESS3 && com_buf[1]==0x03)
  77.        {temper_3=com_buf[3]*256+com_buf[4];
  78.        RH_3=com_buf[5]*256+com_buf[6];
  79.        if (temper_3>32768){temper_3=temper_3-65536;}
  80.        }  
  81. }  
  82. /////////////////////////////////////////// 4 ////////////////////////////////////////
  83. void readJXBS4()
  84. {Serial.write(readcmd4,8);//发射数据
  85. }

  86. void JXBSListen4()
  87. {unsigned char com_num = 0;
  88. while (Serial.available())
  89.    {char inChar = (char)Serial.read();
  90.     com_buf[com_num] = inChar;
  91.     com_num++;
  92.     delay(2);
  93.    }
  94.     if(com_buf[0]==MYADRESS4 && com_buf[1]==0x03)
  95.        {temper_4=com_buf[3]*256+com_buf[4];
  96.        RH_4=com_buf[5]*256+com_buf[6];
  97.        if (temper_4>32768){temper_4=temper_4-65536;}
  98.        }  
  99. }  
  100. /////////////////////////////////////////// 5 ////////////////////////////////////////
  101. void readJXBS5()
  102. {Serial.write(readcmd5,8);//发射数据
  103. }

  104. void JXBSListen5()
  105. {unsigned char com_num = 0;
  106. while (Serial.available())
  107.    {char inChar = (char)Serial.read();
  108.     com_buf[com_num] = inChar;
  109.     com_num++;
  110.     delay(2);
  111.    }
  112.     if(com_buf[0]==MYADRESS5 && com_buf[1]==0x03)
  113.        {temper_5=com_buf[3]*256+com_buf[4];
  114.        RH_5=com_buf[5]*256+com_buf[6];
  115.        if (temper_5>32768){temper_5=temper_5-65536;}
  116.        }  
  117. }  

  118. /////////////////////////////////////////// 6 ////////////////////////////////////////
  119. void readJXBS6()
  120. {Serial.write(readcmd6,8);//发射数据
  121. }

  122. void JXBSListen6()
  123. {unsigned char com_num = 0;
  124. while (Serial.available())
  125.    {char inChar = (char)Serial.read();
  126.     com_buf[com_num] = inChar;
  127.     com_num++;
  128.     delay(2);
  129.    }
  130.     if(com_buf[0]==MYADRESS6 && com_buf[1]==0x03)
  131.        {temper_6=com_buf[3]*256+com_buf[4];
  132.        RH_6=com_buf[5]*256+com_buf[6];
  133.        if (temper_6>32768){temper_6=temper_6-65536;}
  134.        }  
  135. }

  136. /////////////////////////////////////////// 7 ////////////////////////////////////////
  137. void readJXBS7()
  138. {Serial.write(readcmd7,8);//发射数据
  139. }

  140. void JXBSListen7()
  141. {unsigned char com_num = 0;
  142. while (Serial.available())
  143.    {char inChar = (char)Serial.read();
  144.     com_buf[com_num] = inChar;
  145.     com_num++;
  146.     delay(2);
  147.    }
  148.     if(com_buf[0]==MYADRESS7 && com_buf[1]==0x03)
  149.        {temper_7=com_buf[3]*256+com_buf[4];
  150.        RH_7=com_buf[5]*256+com_buf[6];
  151.        if (temper_7>32768){temper_7=temper_7-65536;}
  152.        }  
  153. }

  154. /////////////////////////////////////////// 8 ////////////////////////////////////////
  155. void readJXBS8()
  156. {Serial.write(readcmd8,8);//发射数据
  157. }

  158. void JXBSListen8()
  159. {unsigned char com_num = 0;
  160. while (Serial.available())
  161.    {char inChar = (char)Serial.read();
  162.     com_buf[com_num] = inChar;
  163.     com_num++;
  164.     delay(2);
  165.    }
  166.     if(com_buf[0]==MYADRESS8 && com_buf[1]==0x03)
  167.        {temper_8=com_buf[3]*256+com_buf[4];
  168.        RH_8=com_buf[5]*256+com_buf[6];
  169.        if (temper_8>32768){temper_8=temper_8-65536;}
  170.        }  
  171. }

  172. /////////////////////////////////////////// 9 ////////////////////////////////////////
  173. void readJXBS9()
  174. {Serial.write(readcmd9,8);//发射数据
  175. }

  176. void JXBSListen9()
  177. {unsigned char com_num = 0;
  178. while (Serial.available())
  179.    {char inChar = (char)Serial.read();
  180.     com_buf[com_num] = inChar;
  181.     com_num++;
  182.     delay(2);
  183.    }
  184.     if(com_buf[0]==MYADRESS9 && com_buf[1]==0x03)
  185.        {temper_9=com_buf[3]*256+com_buf[4];
  186.        RH_9=com_buf[5]*256+com_buf[6];
  187.        if (temper_9>32768){temper_9=temper_9-65536;}
  188.        }  
  189. }
复制代码


发表于 2021-8-7 09:21 | 显示全部楼层
这是拿论坛当GitHub用?
 楼主| 发表于 2021-8-7 22:53 | 显示全部楼层
frankhan747 发表于 2021-8-7 09:21
这是拿论坛当GitHub用?

小白一个,记录一下,如有打扰,实在抱歉。

点评

不是不是,只是单纯地好奇  发表于 2021-8-8 08:33
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 09:22 , Processed in 0.075208 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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