**W806开发板之读取温湿度**

举报
秦玉安 发表于 2021/10/13 15:44:17 2021/10/13
【摘要】 W806开发板之读取温湿度W806开发板之读取温湿度1:环境搭建2:编写驱动文件3:实现现象1:环境搭建编译器:CDK温湿度模块:DHT11引脚接口:PB52:编写驱动文件温湿度头文件如下:#ifndef __DHT11_H#define __DHT11_H#include "wm_hal.h"/**************指定要获取的数据************/typedef enum{...

W806开发板之读取温湿度

image-20211013152057326

1:环境搭建

编译器:CDK

温湿度模块:DHT11

引脚接口:PB5

2:编写驱动文件

温湿度头文件如下:

#ifndef __DHT11_H
#define __DHT11_H
#include "wm_hal.h"
/**************指定要获取的数据************/
typedef enum
{
    TEMPERATURE = 0,        //只获取温度
    HUMIDITY = 1,           //只获取湿度
    ALL = 2                 //温湿度同时获取
}DHT11_MODE;
​
/**************驱动IO宏定义*****************/
#define DATA_LINE_PORT    GPIOB
#define DATA_LINE_PIN     GPIO_PIN_5
​
/**************数据线输出状态宏定义*****************/
#define LINE_HIGH()  HAL_GPIO_WritePin(DATA_LINE_PORT,DATA_LINE_PIN,GPIO_PIN_SET)
#define LINE_LOW()   HAL_GPIO_WritePin(DATA_LINE_PORT,DATA_LINE_PIN,GPIO_PIN_RESET) 
​
#define DHT11_IN                    HAL_GPIO_ReadPin(DATA_LINE_PORT, DATA_LINE_PIN)
​
void DHT11_Init(void);
unsigned short  Read_DHT11_Task(void);
#endif
​

温湿度驱动文件如下:

​
#include "dht11.h"
#include "main_config.h"
extern globalVarInfo gVarInfo;
/*延时函数跟系统时钟有关,自己注意下,这个函数看自己去实现了*/
static void delay_us(uint32_t nTimer)
{
​
}
​
/**
 * 功能:设置数据线为输入
 * 参数:None
 * 返回值:None
 */
static void setLineIn(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIO_CLK_ENABLE();
    GPIO_InitStruct.Pin = DATA_LINE_PIN; 
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;     
    HAL_GPIO_Init(DATA_LINE_PORT, &GPIO_InitStruct);
​
}
/**
 * 功能:设置数据线为输出
 * 参数:None
 * 返回值:None
 */
static void setLineOut(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0}; 
    __HAL_RCC_GPIO_CLK_ENABLE();
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;    
    HAL_GPIO_Init(DATA_LINE_PORT, &GPIO_InitStruct);    
    HAL_GPIO_WritePin(DATA_LINE_PORT,DATA_LINE_PIN,GPIO_PIN_SET);
        
}
​
/**
 * 功能:读取单个字节,整个读取流程需要调用该函数4次
 * 参数:None
 * 返回值:采集到的字节数据
 * 
 */
static unsigned char readByte(void)
{
    unsigned char  i,byte = 0;
    unsigned char  j = 0;
​
    for(i=0;i<8;++i)
    { 
        while(!HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN) && ++j<10)      //等待低电平结束
        {
            delay_us(10);
        }
        j = 0;
        
        delay_us(40);                                                             //延时 用于后续判断
        if(HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN))                   //延时后为高电平则为二进制1
        { 
            byte <<= 1;
            byte |= 0x01;
        }else 
        { 
            byte <<= 1;
        }
​
        while(HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN) && ++j<10)      //等待剩余高电平
        {
            delay_us(10);
        }
    }
    return byte;    
}
//
///**
// * 功能:初始化DHT11 GPIO
// * 参数:None
// * 返回值:采集到的字节数据
// */
void DHT11_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    __HAL_RCC_GPIO_CLK_ENABLE();    
    GPIO_InitStructure.Pin = DATA_LINE_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT; 
    HAL_GPIO_Init(DATA_LINE_PORT,&GPIO_InitStructure);  
​
}
​
/*************************************************************************
 功能:读取DHT11采集到的数据
 * 参数:
 *        mode:返回数据类型 用户可以指定返回温湿度当中的某一个或者所有
 *              返回所有数据时,湿度在高八位,温度在低八位
 * 返回值:采集到的字节数据
 *        
 ************************************************************************/
​
​
​
​
​
unsigned short Read_DHT11_Task(void)
{
    unsigned char i = 0;
    
    unsigned char  Hum_H,Hum_L,Temp_H,Temp_L,CheckByte;     //依次是湿度整数、小数部分、温度整数、小数部分、校验和字节
    
    setLineOut();                                                        //发起读取开始信号
    LINE_LOW();
    HAL_Delay(25);
    LINE_HIGH();
​
    setLineIn();
​
    while(HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN) && ++i<10)   //主机释放总线空闲阶段
    {
        delay_us(10);
    }
    i = 0;
    while(!HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN) && ++i<10)  //传感器响应阶段
    {
        delay_us(10);
    }
    i = 0;
    while(HAL_GPIO_ReadPin(DATA_LINE_PORT,DATA_LINE_PIN) && ++i<10)   //传感器拉高通知主机准备阶段
    {
        delay_us(10);
    }
​
    Hum_H = readByte();                                                    //读取有效湿度值
    Hum_L = readByte();                                                    //湿度小数部分为0
    Temp_H = readByte();                                                   //读取有效温度值 
    Temp_L = readByte();                                                   //温度小数部分为0
    CheckByte = readByte();                                                //校验和                         
​
    
    gVarInfo.tempH= Temp_H;
    gVarInfo.tempL= Temp_L;
    gVarInfo.humiH= Hum_H;     
}
​

把温湿度等传感器数据放入到结构体中去,方便数据读取

#ifndef _MAIN_CONFIG_H_
#define _MAIN_CONFIG_H_
​
#include "wm_hal.h"
​
//全局变量信息
typedef struct globalVarInfo
{
//    float length;
//    unsigned int   mq2;
    unsigned char    tempH;   //温度高位
    unsigned char    tempL;   //温度低位
    unsigned char   humiH;    //湿度高位
    unsigned char   humiL;    //湿度低位
}globalVarInfo ;
​
​
​
#endif

main函数任务实现

void Get_Data_Task(void)
{
    DHT11_Init();
    Read_DHT11_Task();
    printf("temp=%d.%d,humi=%d.%d\r\n",gVarInfo.tempH,gVarInfo.tempL, gVarInfo.humiH,gVarInfo.humiL);   
    
}
​
​
int main(void)
{
    
    unsigned   char   timeCount=0;
    SystemClock_Config(CPU_CLK_160M);
    printf("enter main\r\n");
    hal_ledInit();
        
    UART1_Init();
    FifoInit(pdata, LEN);
    HAL_UART_Receive_IT(&huart1, buf, IT_LEN);      // 只需调用一次,接收够设定的长度,进入中断回调,用户需要在中断回调中取走数据,此处设置了
                                                // 0个字节,即不定长    
    unsigned char temp=16;
    while (1)
    {
        Get_Data_Task();
        HAL_Delay(2000);  /*2秒执行一次获取温湿度数据*/
    }
}
​
void Error_Handler(void)
{
    while (1)
    {
    }
}
​
void assert_failed(uint8_t *file, uint32_t line)
{
    printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}

3:实现现象

打开串口调试助手,查看数据信息,可以看到温度是26.9,湿度是66%,跟现场的小米温湿度实物图,还是存在误差,主要是DHT11的精度差点,不过整个驱动过程都是正确的。

image-20211013153046938

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。