小安派 【Ai-m61-32s】 读取湿温度传感器DHT11

[复制链接]
查看3063 | 回复24 | 2023-11-4 22:12:15 | 显示全部楼层 |阅读模式
实验所需元件清单:

DHT11 1
Ai-m61-32s 1
实验现象:
通过串口Ai-m61-32s将湿温度数据发送给上位机。
360截图16720401393147.png

时序及代码如下:

1- 初始化DHT11, 数据线由MCU控制由高电平变为低,并且保持至少18ms, 之后MCU控制由低变为高,并且保持20-40us
360截图17411024114142130.png
代码如下:
  1. // 初始化GPIO引脚
  2.     gpio = bflb_device_get_by_name("gpio");
  3.     bflb_gpio_init(gpio, DHT_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

  4.     // 发送开始信号
  5.     bflb_gpio_set(gpio, DHT_PIN);
  6.     bflb_mtimer_delay_ms(50);
  7.     bflb_gpio_reset(gpio, DHT_PIN);
  8.     bflb_mtimer_delay_ms(20);
  9.     bflb_gpio_set(gpio, DHT_PIN);
  10.     bflb_mtimer_delay_us(30);
复制代码
2- 接收来自DHT11的应答
360截图17571122536480.png
代码如下

  1.     // 读取DHT11的响应
  2.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  3.     {
  4.     }
  5.     while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  6.     {
  7.     }
  8.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  9.     {
  10.     }
复制代码
3- 数据读取 After above DHT will send 40 bits data which are including 16 bits 湿度数据,16 bits 温度数据和8bits的校验数据。
360截图17891230595970.png

代码如下:
  1. // 读取温湿度数据 共 40bits
  2.     // 8bit湿度整数数据+8bit湿度小数数据
  3.     // +8bi温度整数数据+8bit温度小数数据
  4.     // +8bit校验和

  5.     uint8_t data[5] = {0};
  6.     for (int i = 0; i < 5; i++)
  7.     {
  8.         data[i] = 0;
  9.         for (int j = 0; j < 8; j++)
  10.         {
  11.             while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  12.             {
  13.             }
  14.             bflb_mtimer_delay_us(30);
  15.             if (bflb_gpio_read(gpio, DHT_PIN) == 1)
  16.             {
  17.                 data[i] |= (1 << (7 - j));
  18.                 while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  19.                 {
  20.                 }
  21.             }
  22.         }
  23.     }
复制代码
4-转换结果
  1.   // 关闭GPIO
  2.     bflb_gpio_deinit(gpio, DHT_PIN);

  3.     // 解析数据
  4.     uint8_t humidity_integer = data[0];
  5.     uint8_t humidity_decimal = data[1];
  6.     uint8_t temperature_integer = data[2];
  7.     uint8_t temperature_decimal = data[3];

  8.     // 计算小数部分
  9.     float humidity = humidity_integer + (humidity_decimal / 10.0);
  10.     float temperature = temperature_integer + (temperature_decimal / 10.0);

  11.     // 数据有效
  12.     LOG_I("Humidity: %.1f%%\n", humidity);
  13.     LOG_I("Temperature: %.1fC\n", temperature);
复制代码


完整代码如下:
  1. #include "DHT11.h"
  2. #include "bflb_gpio.h"
  3. #include "bflb_mtimer.h"
  4. #include "log.h"

  5. #define DHT_PIN 33
  6. struct bflb_device_s *gpio;

  7. void DHT_START()
  8. {
  9.     // 初始化GPIO引脚
  10.     gpio = bflb_device_get_by_name("gpio");
  11.     bflb_gpio_init(gpio, DHT_PIN, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

  12.     // 发送开始信号
  13.     bflb_gpio_set(gpio, DHT_PIN);
  14.     bflb_mtimer_delay_ms(50);
  15.     bflb_gpio_reset(gpio, DHT_PIN);
  16.     bflb_mtimer_delay_ms(20);
  17.     bflb_gpio_set(gpio, DHT_PIN);
  18.     bflb_mtimer_delay_us(30);

  19.     // 切换为输入模式并等待DHT11的响应
  20.     bflb_gpio_init(gpio, DHT_PIN, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN);

  21.     // 读取DHT11的响应
  22.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  23.     {
  24.     }
  25.     while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  26.     {
  27.     }
  28.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  29.     {
  30.     }

  31.     // 读取温湿度数据 共 40bits
  32.     // 8bit湿度整数数据+8bit湿度小数数据
  33.     // +8bi温度整数数据+8bit温度小数数据
  34.     // +8bit校验和

  35.     uint8_t data[5] = {0};
  36.     for (int i = 0; i < 5; i++)
  37.     {
  38.         data[i] = 0;
  39.         for (int j = 0; j < 8; j++)
  40.         {
  41.             while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  42.             {
  43.             }
  44.             bflb_mtimer_delay_us(30);
  45.             if (bflb_gpio_read(gpio, DHT_PIN) == 1)
  46.             {
  47.                 data[i] |= (1 << (7 - j));
  48.                 while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  49.                 {
  50.                 }
  51.             }
  52.         }
  53.     }

  54.     // 关闭GPIO
  55.     bflb_gpio_deinit(gpio, DHT_PIN);

  56.     // 解析数据
  57.     uint8_t humidity_integer = data[0];
  58.     uint8_t humidity_decimal = data[1];
  59.     uint8_t temperature_integer = data[2];
  60.     uint8_t temperature_decimal = data[3];

  61.     // 计算小数部分
  62.     float humidity = humidity_integer + (humidity_decimal / 10.0);
  63.     float temperature = temperature_integer + (temperature_decimal / 10.0);

  64.     // 数据有效
  65.     LOG_I("Humidity: %.1f%%\n", humidity);
  66.     LOG_I("Temperature: %.1fC\n", temperature);
  67. }
复制代码
DHT11-chinese.pdf (677.52 KB, 下载次数: 2)

本帖被以下淘专辑推荐:

回复

使用道具 举报

18350766600@139 | 2023-11-4 22:21:28 | 显示全部楼层
打卡学习
回复

使用道具 举报

WangChong | 2023-11-4 22:37:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

WangChong | 2023-11-4 23:26:02 | 显示全部楼层
回复

使用道具 举报

496199544 | 2023-11-5 11:29:49 | 显示全部楼层
学习
回复

使用道具 举报

bzhou830 | 2023-11-5 11:44:21 | 显示全部楼层
学习
选择去发光,而不是被照亮
回复

使用道具 举报

ddyty | 2023-11-5 15:03:34 | 显示全部楼层
学习
回复

使用道具 举报

King6688 | 2023-11-5 16:22:10 | 显示全部楼层
为什么要那么多空的while?
回复 支持 反对

使用道具 举报

lsrly | 2023-11-5 17:15:31 | 显示全部楼层
学习
回复

使用道具 举报

jkernet | 2023-11-5 19:11:47 | 显示全部楼层
学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则