基于HAL库,返回DHT11传感器读取到的温湿度浮点型数据
时间: 2024-05-03 22:16:36 浏览: 72
好,以下是基于HAL库的DHT11温湿度传感器读取代码:
```
#include "dht11.h"
#include "stm32f1xx_hal.h"
/* 定义DHT11数据引脚 */
#define DHT11_PIN GPIO_PIN_5
#define DHT11_GPIO_PORT GPIOA
/* 定义DHT11读取数据的超时时间 */
#define DHT11_MAX_WAIT 100
/* 定义DHT11返回数据的位数 */
#define DHT11_DATA_BIT_NUM 40
/* DHT11读取数据函数 */
int DHT11_Read_Data(float *temp, float *humi)
{
uint8_t buf[5] = {0};
uint8_t i, j;
uint8_t res;
uint8_t chksum;
/* 发送起始信号 */
HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_PIN, GPIO_PIN_SET);
HAL_Delay(40);
HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN);
/* 等待DHT11响应 */
for (i = 0; i < DHT11_MAX_WAIT; i++) {
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_RESET) {
break;
}
HAL_Delay(1);
}
/* 检查响应是否正常 */
if (i == DHT11_MAX_WAIT) {
return -1;
}
/* 等待DHT11发送数据 */
for (i = 0; i < DHT11_MAX_WAIT; i++) {
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET) {
break;
}
HAL_Delay(1);
}
/* 检查发送是否正常 */
if (i == DHT11_MAX_WAIT) {
return -2;
}
/* 接收DHT11发送的数据 */
for (i = 0; i < DHT11_DATA_BIT_NUM; i++) {
/* 等待数据发送 */
for (j = 0; j < DHT11_MAX_WAIT; j++) {
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_RESET) {
break;
}
HAL_Delay(1);
}
/* 接收数据 */
for (j = 0; j < DHT11_MAX_WAIT; j++) {
if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_PIN) == GPIO_PIN_SET) {
break;
}
HAL_Delay(1);
}
/* 计算数据位 */
if (j < DHT11_MAX_WAIT) {
buf[i / 8] <<= 1;
if (j > 25) {
buf[i / 8] |= 1;
}
}
}
/* 计算校验和 */
chksum = buf[0] + buf[1] + buf[2] + buf[3];
/* 检查校验和 */
if (chksum != buf[4]) {
return -3;
}
/* 计算温度 */
*temp = buf[2] + (buf[3] & 0x0f) * 0.1;
/* 计算湿度 */
*humi = buf[0] + (buf[1] & 0x0f) * 0.1;
return 0;
}
```
在代码中,首先定义了DHT11数据引脚、DHT11读取数据的超时时间和DHT11返回数据的位数等参数。然后在DHT11_Read_Data函数中,通过HAL库的GPIO操作,依次发送起始信号、等待DHT11响应、等待DHT11发送数据、接收DHT11发送的数据,并计算温度和湿度。最后返回0表示读取成功,返回其他值表示读取失败。
阅读全文