代码框架直接使用STM32CubeMX生成,项目主要内容就是搞清DHT11接收数据的时序,接收到数据以后用ESP8266作为客户端往Yeelink服务器上发数据包。
1.DHT11
看懂传感器手册,接收数据就一根线,要注意根据手册里的协议配置接收端口的输入输出,协议里有用到10us级别的延时,一开始我想配置1us的时间中断来实现延时,结果发现好像是中断响应太快,中断出不来了,就配置成10us一次中断,成功读出了数据。
RH是数据接收前的协议流程,COM是开始真正的数据接收部分,变量都是全局unsigned char变量,代码是根据现成的51单片机例程改的:
void RH(void)
{
DHT_Set_Output();
//延时18ms
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14,GPIO_PIN_RESET);
delay_ms(18);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14,GPIO_PIN_SET);
//延时20us
delay_10us(2);
//设置引脚为输入模式
DHT_Set_Input();
if(!(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14)))
{
U8FLAG=2;
while((!(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14))) && U8FLAG++);
U8FLAG=2;
while((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14)) && U8FLAG++);
//开始接收数据
COM();
U8RH_data_H_temp = U8comdata;
COM();
U8RH_data_L_temp = U8comdata;
COM();
U8T_data_H_temp = U8comdata;
COM();
U8T_data_L_temp = U8comdata;
COM();
U8checkdata_temp = U8comdata;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14,GPIO_PIN_SET);
//数据校验
U8temp=(U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp + U8RH_data_L_temp);
if(U8temp == U8checkdata_temp)
{
U8RH_data_H = U8RH_data_H_temp;
U8RH_data_L = U8RH_data_L_temp;
U8T_data_H = U8T_data_H_temp;
U8T_data_L = U8T_data_L_temp;
U8checkdata = U8checkdata_temp;
}
}
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14))) && U8FLAG++);
delay_10us(3);
U8temp=0;
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14))
{
U8temp=1;
}
U8FLAG=2;
while((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_14))&&U8FLAG++);
if(U8FLAG==1)
break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
2.Yeelink申请账号,增加设备,在设备上增加传感器,温湿度一般是数值型
3.ESP8266
用串口发送AT指令配置好模块:
AT+CWMODE=3
AT+RST
AT+CWJAP="无线热点名称","密码"
AT+CIPMUX=0
AT+CIPMODE=1
AT+CIPSTART="TCP","42.96.164.52",80 //Yeelink服务器地址和端口号(最近可能改了)
AT+CIPSEND
发送成功后ESP8266会在串口返回一组以0结尾并且不带其他错误指示的数据包,在Yeelink平台上可以发现数据已经变化。
4.注意事项
1. 用STM32F107VC读传感器数据时,DHT11的数据传输协议里需要微秒级别的延时,用TIM6分频成1us中断一次来延时无法做到,只能分频成10us一次,好在协议里最小的延时是几十微秒,够用了。
2. Yeelink平台注册后点击右上角头像-->用户中心,进入用户界面,要注意界面UI是蓝白色还是绿黑色的(不知道是浏览器问题还是什么,有时候不同人直接点进去是不一样的),蓝白色是v1.1版,绿黑是v1.0版,在发数据包时要注意,不然你的数据成功传上去后改变的是另一个版本界面里的显示值,不知道还以为没上传成功。(建议用v1.1版)。
3. 命令和数据包格式里要有回车,用电脑发串口数据给模块时可以用键盘输入回车,用开发板发ESP8266无线模块数据时,要注意windows系统下回车符为\r\n。
4. GET数据包最后要有两行回车,在开发板程序里也就是在数据包最后加上\r\n\r\n。(不然会有httpv1.1 Bad request错误)。
5. 如果从尤其像word文档这种强格式文件中复制数据包出来时,如果出现一样的数据包别人成功自己失败的奇怪错误,可能是字符格式或者编码的问题。