由 WangChong 贡献,Ai-Thinker 进行整理
实验所需元件清单:
| DHT11 | 1 |
|---|---|
| Ai-m61-32s | 1 |
实验现象: 通过串口Ai-m61-32s将湿温度数据发送给上位机。 
时序及代码如下:
1- 初始化DHT11, 数据线由MCU控制由高电平变为低,并且保持至少18ms, 之后MCU控制由低变为高,并且保持20-40us 
代码如下:
c
// 初始化GPIO引脚
gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, DHT_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
// 发送开始信号
bflb_gpio_set(gpio, DHT_PIN);
bflb_mtimer_delay_ms(50);
bflb_gpio_reset(gpio, DHT_PIN);
bflb_mtimer_delay_ms(20);
bflb_gpio_set(gpio, DHT_PIN);
bflb_mtimer_delay_us(30);2- 接收来自DHT11的应答
代码如下
c
// 读取DHT11的响应
while (bflb_gpio_read(gpio, DHT_PIN) == 1)
{
}
while (bflb_gpio_read(gpio, DHT_PIN) == 0)
{
}
while (bflb_gpio_read(gpio, DHT_PIN) == 1)
{
}3- 数据读取, After above DHT will send 40 bits data which are including 16 bits 湿度数据,16 bits 温度数据和8bits的校验数据。 
代码如下:
c
// 读取温湿度数据 共 40bits
// 8bit湿度整数数据+8bit湿度小数数据
// +8bi温度整数数据+8bit温度小数数据
// +8bit校验和
uint8_t data[5] = {0};
for (int i = 0; i < 5; i++)
{
data[i] = 0;
for (int j = 0; j < 8; j++)
{
while (bflb_gpio_read(gpio, DHT_PIN) == 0)
{
}
bflb_mtimer_delay_us(30);
if (bflb_gpio_read(gpio, DHT_PIN) == 1)
{
data[i] |= (1 << (7 - j));
while (bflb_gpio_read(gpio, DHT_PIN) == 1)
{
}
}
}
}4-转换结果
c
// 关闭GPIO
bflb_gpio_deinit(gpio, DHT_PIN);
// 解析数据
uint8_t humidity_integer = data[0];
uint8_t humidity_decimal = data[1];
uint8_t temperature_integer = data[2];
uint8_t temperature_decimal = data[3];
// 计算小数部分
float humidity = humidity_integer + (humidity_decimal / 10.0);
float temperature = temperature_integer + (temperature_decimal / 10.0);
// 数据有效
LOG_I("Humidity: %.1f%%\n", humidity);
LOG_I("Temperature: %.1fC\n", temperature);完整代码如下:
c
#include "DHT11.h"
#include "bflb_gpio.h"
#include "bflb_mtimer.h"
#include "log.h"
#define DHT_PIN 33
struct bflb_device_s *gpio;
void DHT_START()
{
// 初始化GPIO引脚
gpio = bflb_device_get_by_name("gpio");
bflb_gpio_init(gpio, DHT_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
// 发送开始信号
bflb_gpio_set(gpio, DHT_PIN);
bflb_mtimer_delay_ms(50);
bflb_gpio_reset(gpio, DHT_PIN);
bflb_mtimer_delay_ms(20);
bflb_gpio_set(gpio, DHT_PIN);
bflb_mtimer_delay_us(30);
// 切换为输入模式并等待DHT11的响应
bflb_gpio_init(gpio, DHT_PIN, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN);
// 读取DHT11的响应
while (bflb_gpio_read(gpio, DHT_PIN) == 1) {
}
while (bflb_gpio_read(gpio, DHT_PIN) == 0) {
}
while (bflb_gpio_read(gpio, DHT_PIN) == 1) {
}
// 读取温湿度数据 共 40bits
// 8bit湿度整数数据+8bit湿度小数数据
// +8bi温度整数数据+8bit温度小数数据
// +8bit校验和
uint8_t data[5] = {0};
for (int i = 0; i < 5; i++) {
data[i] = 0;
for (int j = 0; j < 8; j++) {
while (bflb_gpio_read(gpio, DHT_PIN) == 0) {
}
bflb_mtimer_delay_us(30);
if (bflb_gpio_read(gpio, DHT_PIN) == 1) {
data[i] |= (1 << (7 - j));
while (bflb_gpio_read(gpio, DHT_PIN) == 1) {
}
}
}
}
// 关闭GPIO
bflb_gpio_deinit(gpio, DHT_PIN);
// 解析数据
uint8_t humidity_integer = data[0];
uint8_t humidity_decimal = data[1];
uint8_t temperature_integer = data[2];
uint8_t temperature_decimal = data[3];
// 计算小数部分
float humidity = humidity_integer + (humidity_decimal / 10.0);
float temperature = temperature_integer + (temperature_decimal / 10.0);
// 数据有效
LOG_I("Humidity: %.1f%%\n", humidity);
LOG_I("Temperature: %.1fC\n", temperature);
}上传的附件: 
DHT11-chinese.pdf(677.52 KB, 下载次数: 2)
上传的附件: 
DHT11.zip(3.45 KB, 下载次数: 7)
PS:上述代码DH11数据线连接Ai-m61-32s-kit gpio33,可根据自己需要修改。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

