界面

image.png

协议

image.png
例如在微信温度采集界面点击【10秒】,微信界面发送字符“$TH,1#”至下位机,下位机根据协议打开温湿度传感器开始采集数据,然后向微信返回收集到的数据。
解释协议:打开温湿度传感器开始采集。
然后下位机给微信界面返回数据包$TH,T25.20,H55#,
解释协议:“$TH,T25.20,H55#”,目前温度为25.20,湿度为55。
“$TH,2,#”,匹配失败。

接线图

image.png

代码

  1. /**
  2. * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
  3. * @file 8、远程温湿度采集
  4. * @author liusen
  5. * @version V1.0
  6. * @date 2017.11.14
  7. * @brief AR套件微信实验
  8. * @details
  9. * @par History 见如下说明
  10. *
  11. */
  12. #include "dht11.h"
  13. #include <MsTimer2.h> //定时器库的 头文件
  14. dht11 DHT11;
  15. #define DHT11_Pin 4 // 温湿度传感器管脚
  16. int incomingByte = 0; // 接收到的 data byte
  17. String inputString = ""; // 用来储存接收到的内容
  18. boolean newLineReceived = false; // 前一次数据结束标志
  19. boolean startBit = false; //协议开始标志
  20. String returntemp = ""; //存储返回值
  21. char temp[100] = {0};
  22. /**
  23. * Function setup
  24. * @author liusen
  25. * @date 2017.11.14
  26. * @brief 初始化配置
  27. * @param[in] void
  28. * @retval void
  29. * @par History 无
  30. */
  31. void setup()
  32. {
  33. //初始化温湿度传感器管脚IO口为输出方式
  34. pinMode(DHT11_Pin, OUTPUT);
  35. Serial.begin(9600); //波特率9600 (WIFI通讯设定波特率)
  36. }
  37. /**
  38. * Function loop
  39. * @author liusen
  40. * @date 2017.11.14
  41. * @brief 按照接收的数据根据协议完成相应的功能
  42. * @param[in] void
  43. * @retval void
  44. * @par History 无
  45. */
  46. void loop()
  47. {
  48. while (newLineReceived)
  49. {
  50. int chk = DHT11.read(DHT11_Pin); //读取温湿度传感器管脚的数值
  51. int fTemp = (float)DHT11.temperature; //fTemp赋值为浮点型读取到的温度值
  52. int iHumidity = DHT11.humidity; //iHumidity赋值为读取到的湿度值
  53. if(inputString.indexOf("TH") == -1) //如果要检索的字符串值“TH”没有出现
  54. {
  55. returntemp = "$TH,2#"; //返回不匹配
  56. Serial.print(returntemp); //返回协议数据包
  57. inputString = ""; // clear the string
  58. newLineReceived = false; // 前一次数据结束
  59. break;
  60. }
  61. //解析开关
  62. // $TH,1#
  63. memset(temp, 0x00, sizeof(temp)); //清空temp数组
  64. dtostrf(fTemp, 3, 1, temp); // 相當於 %3.2f
  65. String sTemp = temp; //数组temp中的字符串赋给sTemp
  66. String sHum = "";
  67. sHum += iHumidity;
  68. returntemp = "$TH,T" + sTemp + ",H" + sHum + "#";
  69. Serial.print(returntemp); //返回协议数据包
  70. inputString = ""; // clear the string
  71. newLineReceived = false;
  72. }
  73. }
  74. /**
  75. * Function serialEvent
  76. * @author liusen
  77. * @date 2017.11.14
  78. * @brief 串口接收中断 serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!
  79. * @param[in] void
  80. * @retval void
  81. * @par History 无
  82. */
  83. void serialEvent()
  84. {
  85. while (Serial.available())
  86. {
  87. incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  88. if(incomingByte == '$') //如果串口接收到数据则进入循环
  89. {
  90. startBit= true; //如果到来的字节是'$',开始读取
  91. }
  92. if(startBit == true)
  93. {
  94. inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//
  95. }
  96. if (incomingByte == '#')
  97. {
  98. newLineReceived = true; //如果到来的字节是'#',读取结束
  99. startBit = false;
  100. }
  101. }
  102. }