数据采集时间间隔设定-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 818|回复: 0

数据采集时间间隔设定

[复制链接]
发表于 2021-8-21 22:33 | 显示全部楼层 |阅读模式
  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 "DHTesp.h"                              //温度DHT11模块函数库
  9. #include "FastLED.h"                             //FastLED库用于调用随机函数库
  10. #include <stdlib.h>                              //接收数据的转化
  11. #include <stdio.h>

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

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

  22. #define LED1 D4
  23. #define LED2 D3
  24. #define LVDT_pin A0

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

  30. //////////////////////////////////////////////
  31. int count=0,aa =0,bt=0,ii=0,nn=20,n=5,m=1; //一分钟发nn=20                              //定义参数变量
  32. char msgJson[400];//msgJson数据长度
  33. char msgJson1[400];//msgJson数据长度
  34. char msg_buf[400];//
  35. char msg_buf1[400];//
  36. char dataTemplate1[]  = "{"RH1":%.2f,"T1":%.2f,"RH2":%.2f,"T2":%.2f,"RH3":%.2f,"T3":%.2f,"RH4":%.2f,"T4":%.2f,"RH5":%.2f,"T5":%.2f,"RH6":%.2f,"T6":%.2f}"; //间隔指定时间的数据
  37. char dataTemplate[] = "{"rtRH1":%.2f,"rtT1":%.2f,"rtRH2":%.2f,"rtT2":%.2f,"rtRH3":%.2f,"rtT3":%.2f,"rtRH4":%.2f,"rtT4":%.2f,"rtRH5":%.2f,"rtT5":%.2f,"rtRH6":%.2f,"rtT6":%.2f,"m":%d}"; //rt代表real time 实时数据
  38. 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,T6 = 0.0, RH6 = 0.0,T7 = 0.0, RH7 = 0.0,T8 = 0.0, RH8 = 0.0,T9 = 0.0, RH9 = 0.0;                                       
  39. extern float  T1sum = 0.0, RH1sum = 0.0,T2sum = 0.0, RH2sum = 0.0,T3sum = 0.0, RH3sum = 0.0,T4sum = 0.0, RH4sum = 0.0,T5sum = 0.0, RH5sum = 0.0,T6sum = 0.0, RH6sum = 0.0,T7sum = 0.0, RH7sum = 0.0,T8sum = 0.0, RH8sum = 0.0,T9sum = 0.0, RH9sum = 0.0;                                       
  40. ////////////////////////////////////////////

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

  61. void loop() {                                   //里面的函数无限循环执行
  62.   if (mqttClient.connected()) {                 //如果开发板成功连接服务器                                         
  63.       pubMQTTmsg();                             //调用pubMQTTmsg()函数发送数据到云端
  64.       mqttClient.loop();                        //调用回调函数,接收平台下发的数据
  65.   } else {                                      //如果开发板未能成功连接服务器
  66.     connectMQTTServer();                        //则尝试连接服务器
  67.   }
  68. }

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

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

  110. /////////////////////////////////////////////////////////////
  111. for(ii=1;ii<=n;ii++){                                       
  112. connectMQTTServer();                        //则尝试连接服务器
  113. mqttClient.loop();
  114. ////////////////////////////////////////////////////////////
  115. //---------------1
  116. readJXBS1();delay(500);JXBSListen1();RH1=RH_1*0.01+ii;T1=temper_1*0.01;
  117. //---------------2
  118. readJXBS2();delay(500);JXBSListen2();RH2=RH_2*0.01;   T2=temper_2*0.01;
  119. //---------------3
  120. readJXBS3();delay(500);JXBSListen3();RH3=RH_3*0.01;   T3=temper_3*0.01;
  121. //---------------4
  122. readJXBS4();delay(500);JXBSListen4();RH4=RH_4*0.01;   T4=temper_4*0.01;   
  123. //---------------5
  124. readJXBS5();delay(500);JXBSListen5();RH5=RH_5*0.01;   T5=temper_5*0.01;
  125. //---------------6
  126. readJXBS6();delay(500);JXBSListen6();RH6=RH_6*0.01;   T6=temper_6*0.01;
  127. ////////////////////////////////////////////////////////////
  128. snprintf(msgJson, 400, dataTemplate,RH1,T1,RH2,T2,RH3,T3,RH4,T4,RH5,T5,RH6,T6,m);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson   
  129.   int json_len = strlen(msgJson);                //msgJson的长度
  130.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  131.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  132.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  133.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  134.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  135.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  136. }
  137. //////////////////////////////////////////////////

  138. snprintf(msgJson1, 400, dataTemplate1,RH1,T1,RH2,T2,RH3,T3,RH4,T4,RH5,T5,RH6,T6);
  139.   int json_len1 = strlen(msgJson1);                //msgJson的长度
  140.   msg_buf1[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  141.   msg_buf1[1] = char(json_len1 >> 8);              //数据第二位是要发送的数据长度的高八位
  142.   msg_buf1[2] = char(json_len1 & 0xff);            //数据第三位是要发送数据的长度的低八位
  143.   memcpy(msg_buf1 + 3, msgJson1, strlen(msgJson1)); //从msg_buf的第四位开始,放入要传的数据msgJson
  144.   msg_buf1[3 + strlen(msgJson1)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了  
  145.   mqttClient.publish("$dp", (uint8_t *)msg_buf1, 3 + strlen(msgJson1)); //发送数据到主题$dp
  146.          
  147. }

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

  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(){Serial.write(readcmd1,8);}//发射数据
  30. void JXBSListen1(){unsigned char com_num = 0;
  31. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  32. 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];
  33. if (temper_1>32768){temper_1=temper_1-65536;}}}  
  34. /////////////////////////////////////////// 2 ////////////////////////////////////////
  35. void readJXBS2(){Serial.write(readcmd2,8);}
  36. void JXBSListen2(){unsigned char com_num = 0;
  37. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  38. 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];
  39. if (temper_2>32768){temper_2=temper_2-65536;}}}  
  40. /////////////////////////////////////////// 3 ////////////////////////////////////////
  41. void readJXBS3(){Serial.write(readcmd3,8);}
  42. void JXBSListen3(){unsigned char com_num = 0;
  43. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  44. 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];
  45. if (temper_3>32768){temper_3=temper_3-65536;}}}  
  46. /////////////////////////////////////////// 4 ////////////////////////////////////////
  47. void readJXBS4(){Serial.write(readcmd4,8);}
  48. void JXBSListen4(){unsigned char com_num = 0;
  49. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  50. 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];
  51. if (temper_4>32768){temper_4=temper_4-65536;}}}  
  52. /////////////////////////////////////////// 5 ////////////////////////////////////////
  53. void readJXBS5(){Serial.write(readcmd5,8);}
  54. void JXBSListen5(){unsigned char com_num = 0;
  55. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  56. 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];
  57. if (temper_5>32768){temper_5=temper_5-65536;}}}  
  58. /////////////////////////////////////////// 6 ////////////////////////////////////////
  59. void readJXBS6(){Serial.write(readcmd6,8);}
  60. void JXBSListen6(){unsigned char com_num = 0;
  61. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  62. 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];
  63. if (temper_6>32768){temper_6=temper_6-65536;}}}
  64. /////////////////////////////////////////// 7 ////////////////////////////////////////
  65. void readJXBS7(){Serial.write(readcmd7,8);}
  66. void JXBSListen7(){unsigned char com_num = 0;
  67. while (Serial.available()) {char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  68. 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];
  69. if (temper_7>32768){temper_7=temper_7-65536;}}  }
  70. /////////////////////////////////////////// 8 ////////////////////////////////////////
  71. void readJXBS8(){Serial.write(readcmd8,8);}
  72. void JXBSListen8(){unsigned char com_num = 0;
  73. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  74. 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];
  75. if (temper_8>32768){temper_8=temper_8-65536;}}}
  76. /////////////////////////////////////////// 9 ////////////////////////////////////////
  77. void readJXBS9(){Serial.write(readcmd9,8);}
  78. void JXBSListen9(){unsigned char com_num = 0;
  79. while (Serial.available()){char inChar = (char)Serial.read();com_buf[com_num] = inChar;com_num++;delay(2);}
  80. 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];
  81. if (temper_9>32768){temper_9=temper_9-65536;}}  }
复制代码


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

本版积分规则

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

GMT+8, 2024-11-28 00:50 , Processed in 0.183667 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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