找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: houxf

W806开发板之读取温湿度

[复制链接]

61

主题

5

回帖

195

积分

版主

积分
195
发表于 2024-1-30 15:45:46 | 显示全部楼层 |阅读模式
实现步骤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的精度差点,不过整个驱动过程都是正确的。
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|北京联盛德微电子有限责任公司 ( 京ICP备13053587号-2 )

GMT+8, 2024-3-28 22:14 , Processed in 0.115322 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表