**W806开发板之读取温湿度**
【摘要】 W806开发板之读取温湿度W806开发板之读取温湿度1:环境搭建2:编写驱动文件3:实现现象1:环境搭建编译器:CDK温湿度模块:DHT11引脚接口:PB52:编写驱动文件温湿度头文件如下:#ifndef __DHT11_H#define __DHT11_H#include "wm_hal.h"/**************指定要获取的数据************/typedef enum{...
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的精度差点,不过整个驱动过程都是正确的。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)