STM32F107平台上使用DHT11+ESP8266传送温湿度数据到Yeelink平台上

代码框架直接使用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

然后发送数据包:
//前面的v1.1是新版本,网页界面是蓝白色,如在Yeelink上配置设备时界面是绿黑色应该要改成v1.0
POST /v1.1/device/设备号/sensor/传感器号/datapoints HTTP/1.1
Host:api.yeelink.net
Accept: */*
U-ApiKey: //用户的Yeelink密钥,申请账户就可以生成
Content-Length:12 //数字12为{"value": }这一串字符的个数
Content-Type: application/x-www-form-urlencoded
Connection:close

{"value": } //冒号后面写发送的值

发送成功后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文档这种强格式文件中复制数据包出来时,如果出现一样的数据包别人成功自己失败的奇怪错误,可能是字符格式或者编码的问题。



你可能感兴趣的:(嵌入式)