兰州理工大学后花园盐渍土参数-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1840|回复: 2

兰州理工大学后花园盐渍土参数

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

主程序
  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[200];//msgJson数据长度
  31. char msg_buf[200];//
  32. char dataTemplate[] = "{"RH5":%.2f,"T5":%.2f,"EC5":%.2f,"pH5":%.2f}";//char dataTemplate[] = "{"temp":%.2f,"hum":%.2f,"rand":%d,"sin":%.2f,"butt":%2d}";
  33. extern float  T2 = 0.0, RH2 = 0.0, EC2 = 0.0,pH2=0.0, T4 = 0.0, RH4 = 0.0, EC4 = 0.0,pH4=0.0;                                       


  34. void setup() {                                  //里面的函数只执行一次
  35.   JXBSInit();
  36.   debugSerial.begin(9600);
  37.   
  38.   wifiMulti.addAP("CMCC-PbWq","9bf07201");//添加多个wifi网络
  39.   wifiMulti.addAP("4G-UFI-19DE","seuseucyd");
  40.   wifiMulti.addAP("esp8266","esp82661");
  41.   wifiMulti.addAP("4G-UFI-5FD6","onenetesp8266");
  42.         

  43.   WiFi.mode(WIFI_STA);                          //设置wifi模式
  44. // dht.setup(D4, DHTesp::DHT11);                 //温湿度模块DHT11初始化,D4脚位
  45.   connectWifi();                                //链接Wifi函数
  46.   mqttClient.setServer(mqttServer, mqttPort);   //mqttServer是onenet地址,mqtt接口端口mqttPort
  47.   mqttClient.setCallback(receiveCallback);      //设置MQTT订阅回调,函数
  48.   connectMQTTServer();                          //链接MQTT服务器函数
  49.   ticker.attach(1, tickerCount);  
  50. }

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

  60. int tickerCount() {
  61.   count++;
  62. }
  63. void connectMQTTServer() {                     //通过MQTT协议链接Onenet
  64.   String clientId = DEVICE_ID;
  65.   String productId = PRODUCT_ID;
  66.   String apiKey = API_KEY;
  67.   if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
  68. //    Serial.println("MQTT Server Connected.");
  69. //    Serial.println("Server Address: ");
  70. //    Serial.println(mqttServer);
  71. //    Serial.println("ClientId:");
  72. //    Serial.println(clientId);
  73.     subscribeTopic();                          //订阅指定主题
  74.   } else {
  75.     //Serial.print("MQTT Server Connect Failed. Client State:");
  76.    // Serial.println(mqttClient.state());
  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.     //Serial.println("Subscrib Topic:");
  87.     //Serial.println(subTopic);
  88.   } else {
  89.     //Serial.print("Subscribe Fail...");
  90.   }
  91. }

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

  119. ////////////////////////////////////////////////////////////

  120. readJXBS20();
  121. delay(1000);
  122. JXBSListen20();
  123. RH2=RH_2*0.1;   
  124. T2=temper_2*0.1;  

  125. delay(1000);
  126.   
  127. readJXBS21();
  128. delay(1000);
  129. JXBSListen21();  
  130. EC2=EC_2;

  131. delay(1000);
  132.   
  133. readJXBS22();
  134. delay(1000);
  135. JXBSListen22();  
  136. pH2=pH_2*0.01;
  137. ////////////////////////////////////////////////

  138.   
  139.   snprintf(msgJson, 130, dataTemplate,RH2,T2,EC2,pH2);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
  140.   int json_len = strlen(msgJson);                //msgJson的长度
  141.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  142.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  143.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  144.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  145.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  146.   //Serial.print("public message:");Serial.println(msgJson);//向串口发送订阅信息
  147.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  148. // Serial.println(strlen(msgJson));
  149. }

  150. void connectWifi() {                              //wifi连接函数  
  151.   //Serial.print("Connecting...");
  152.   //WiFiManager wifiManager;// 建立WiFiManager对象
  153.   //wifiManager.resetSettings();// 清除ESP8266所存储的WiFi连接信息以便测试WiFiManager工作效果
  154.   //wifiManager.autoConnect("AutoConnectAP");// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称  
  155.   int ii=0;  
  156.   while (wifiMulti.run() != WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
  157.   delay(1000);
  158.   //Serial.print("ii++");Serial.print(" ");
  159.   }
  160.   //Serial.println('\n');                     // WiFi连接成功后
  161.   //Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  162.   //Serial.println(WiFi.SSID());              // 连接的WiFI名称
  163.   //Serial.print("IP address:\t");            // 以及IP
  164.   //Serial.println(WiFi.localIP());           // NodeMCU的IP地址  
  165. }
复制代码
子程序

  1. #define MYADRESS2 0x05  //485地址

  2. //const unsigned char  readcmd20[8]={MYADRESS2,0x03,0x00,0x12,0x00,0x02,0x64,0x0E}; //读取温湿度指令
  3. //const unsigned char  readcmd21[8]={MYADRESS2,0x03,0x00,0x15,0x00,0x01,0x95,0xCE}; //读取电导率指令
  4. //const unsigned char  readcmd22[8]={MYADRESS2,0x03,0x00,0x06,0x00,0x01,0x64,0x0B}; //读取pH指令

  5. //const unsigned char  readcmd20[8]={MYADRESS2,0x03,0x00,0x12,0x00,0x02,0x64,0x3D}; //读取温湿度指令
  6. //const unsigned char  readcmd21[8]={MYADRESS2,0x03,0x00,0x15,0x00,0x01,0x95,0xFD}; //读取电导率指令
  7. //const unsigned char  readcmd22[8]={MYADRESS2,0x03,0x00,0x06,0x00,0x01,0x64,0x38}; //读取pH指令
  8. //
  9. //const unsigned char  readcmd20[8]={MYADRESS2,0x03,0x00,0x12,0x00,0x02,0x65,0xEC}; //读取温湿度指令
  10. //const unsigned char  readcmd21[8]={MYADRESS2,0x03,0x00,0x15,0x00,0x01,0x94,0x2C}; //读取电导率指令
  11. //const unsigned char  readcmd22[8]={MYADRESS2,0x03,0x00,0x06,0x00,0x01,0x65,0xE9}; //读取pH指令
  12. //
  13. //const unsigned char  readcmd20[8]={MYADRESS2,0x03,0x00,0x12,0x00,0x02,0x64,0x5B}; //读取温湿度指令
  14. //const unsigned char  readcmd21[8]={MYADRESS2,0x03,0x00,0x15,0x00,0x01,0x95,0x9B}; //读取电导率指令
  15. //const unsigned char  readcmd22[8]={MYADRESS2,0x03,0x00,0x06,0x00,0x01,0x64,0x5E}; //读取pH指令
  16. //
  17. const unsigned char  readcmd20[8]={MYADRESS2,0x03,0x00,0x12,0x00,0x02,0x65,0x8A}; //读取温湿度指令
  18. const unsigned char  readcmd21[8]={MYADRESS2,0x03,0x00,0x15,0x00,0x01,0x94,0x4A}; //读取电导率指令
  19. const unsigned char  readcmd22[8]={MYADRESS2,0x03,0x00,0x06,0x00,0x01,0x65,0x8F}; //读取pH指令


  20. unsigned int RH_2=0,temper_2=0,EC_2=0,pH_2=0.0,RH_4=0,temper_4=0,EC_4=0,pH_4=0.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. //////////////////////////////////////////////////////////////////////////////////
  29. void readJXBS20()
  30. {Serial.write(readcmd20,8);//发射数据
  31. }

  32. void JXBSListen20()
  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]==MYADRESS2 && com_buf[1]==0x03)
  41.        {RH_2=com_buf[3]*256+com_buf[4];
  42.        temper_2=com_buf[5]*256+com_buf[6];
  43.        if (temper_2>32768){temper_2=temper_2-65536;}
  44.        }  
  45. }  

  46. //---------------------------------------------------
  47. void readJXBS21()
  48. {Serial.write(readcmd21,8);//发射数据  
  49. }

  50. void JXBSListen21()
  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.    {EC_2=com_buf[3]*256+com_buf[4];
  60.    }     
  61. }  
  62. //---------------------------------------------------
  63. void readJXBS22()
  64. {Serial.write(readcmd22,8);//发射数据  
  65. }

  66. void JXBSListen22()
  67. {unsigned char com_num = 0;
  68. while (Serial.available())
  69.     {char inChar = (char)Serial.read();//接收数据
  70.      com_buf[com_num] = inChar;
  71.      com_num++;
  72.      delay(2);
  73.     }
  74. if(com_buf[0]==MYADRESS2 && com_buf[1]==0x03)
  75.    {pH_2=com_buf[3]*256+com_buf[4];
  76.    }     
  77. }
复制代码
实物图
微信图片_20210803102525.jpg
发表于 2021-8-3 15:09 | 显示全部楼层
···于是乎?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 09:33 , Processed in 0.084868 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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