界面
协议
例如在微信温度采集界面点击【10秒】,微信界面发送字符“$TH,1#”至下位机,下位机根据协议打开温湿度传感器开始采集数据,然后向微信返回收集到的数据。
解释协议:打开温湿度传感器开始采集。
然后下位机给微信界面返回数据包$TH,T25.20,H55#,
解释协议:“$TH,T25.20,H55#”,目前温度为25.20,湿度为55。
“$TH,2,#”,匹配失败。
接线图
代码
/**
* @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
* @file 8、远程温湿度采集
* @author liusen
* @version V1.0
* @date 2017.11.14
* @brief AR套件微信实验
* @details
* @par History 见如下说明
*
*/
#include "dht11.h"
#include <MsTimer2.h> //定时器库的 头文件
dht11 DHT11;
#define DHT11_Pin 4 // 温湿度传感器管脚
int incomingByte = 0; // 接收到的 data byte
String inputString = ""; // 用来储存接收到的内容
boolean newLineReceived = false; // 前一次数据结束标志
boolean startBit = false; //协议开始标志
String returntemp = ""; //存储返回值
char temp[100] = {0};
/**
* Function setup
* @author liusen
* @date 2017.11.14
* @brief 初始化配置
* @param[in] void
* @retval void
* @par History 无
*/
void setup()
{
//初始化温湿度传感器管脚IO口为输出方式
pinMode(DHT11_Pin, OUTPUT);
Serial.begin(9600); //波特率9600 (WIFI通讯设定波特率)
}
/**
* Function loop
* @author liusen
* @date 2017.11.14
* @brief 按照接收的数据根据协议完成相应的功能
* @param[in] void
* @retval void
* @par History 无
*/
void loop()
{
while (newLineReceived)
{
int chk = DHT11.read(DHT11_Pin); //读取温湿度传感器管脚的数值
int fTemp = (float)DHT11.temperature; //fTemp赋值为浮点型读取到的温度值
int iHumidity = DHT11.humidity; //iHumidity赋值为读取到的湿度值
if(inputString.indexOf("TH") == -1) //如果要检索的字符串值“TH”没有出现
{
returntemp = "$TH,2#"; //返回不匹配
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false; // 前一次数据结束
break;
}
//解析开关
// $TH,1#
memset(temp, 0x00, sizeof(temp)); //清空temp数组
dtostrf(fTemp, 3, 1, temp); // 相當於 %3.2f
String sTemp = temp; //数组temp中的字符串赋给sTemp
String sHum = "";
sHum += iHumidity;
returntemp = "$TH,T" + sTemp + ",H" + sHum + "#";
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
}
}
/**
* Function serialEvent
* @author liusen
* @date 2017.11.14
* @brief 串口接收中断 serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!
* @param[in] void
* @retval void
* @par History 无
*/
void serialEvent()
{
while (Serial.available())
{
incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
if(incomingByte == '$') //如果串口接收到数据则进入循环
{
startBit= true; //如果到来的字节是'$',开始读取
}
if(startBit == true)
{
inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//
}
if (incomingByte == '#')
{
newLineReceived = true; //如果到来的字节是'#',读取结束
startBit = false;
}
}
}