STM32_DH11
无糖可乐 Lv2

DHT11传感器概述

特点

  • 测量范围:湿度 20-80% RH, 温度 0-50°C
  • 精确度:湿度 ±5% RH, 温度 ±2°C
  • 供电电压:3.3V 或 5V
  • 数字信号输出:单线串行通讯

工作原理

DHT11输出的是数字信号。它使用单一的数据线(加上地线和电源线)进行通信。DHT11在数据线上输出一个特定的高低电平信号组合来代表湿度和温度的数据。

连接方式

通常连接DHT11传感器需要三根线:

  1. VCC(+3.3V或+5V)
  2. GND(地线)
  3. DATA(数据线)

对于STM32等微控制器,可以通过GPIO(通用输入输出)端口读取数据线上的数字信号。

编程与读取数据

  1. 初始化GPIO: 配置数据线为输入,用于读取DHT11的数据。
  2. 启动信号: 微控制器需要先将数据线拉低至少18ms,然后拉高20-40μs以启动传感器。
  3. 响应信号: DHT11收到启动信号后会保持数据线低80μs作为响应,然后再拉高80μs。
  4. 数据传输: DHT11发送40位数据(湿度整数部分、湿度小数部分、温度整数部分、温度小数部分、校验和)。

示例代码(基于STM32)

这里是一个简单的使用示例,假设你已经有一个适用于STM32的DHT11库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "DHT11.h"
#include "Delay.h"

void DHT11_Init(void) {
RCC_APB2PeriphClockCmd(DHT11_GPIO_RCC, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);

DHT11_DATA_HIGH();
}

static void DHT11_SetDataOutput(void) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}

static void DHT11_SetDataInput(void) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}

static uint8_t DHT11_ReadByte(void) {
uint8_t i, byte = 0;
for (i = 0; i < 8; i++) {
while (DHT11_DATA_READ() == Bit_RESET);
Delay_us(40);
if (DHT11_DATA_READ() == Bit_SET) {
byte |= (1 << (7 - i));
while (DHT11_DATA_READ() == Bit_SET);
}
}
return byte;
}

uint8_t DHT11_ReadData(DHT11_Data_TypeDef *pData) {
DHT11_SetDataOutput();
DHT11_DATA_LOW();
Delay_ms(18);
DHT11_DATA_HIGH();
Delay_us(30);
DHT11_SetDataInput();

if (DHT11_DATA_READ() == Bit_RESET) {
while (DHT11_DATA_READ() == Bit_RESET);
while (DHT11_DATA_READ() == Bit_SET);

pData->humi_int = DHT11_ReadByte();
pData->humi_deci = DHT11_ReadByte();
pData->temp_int = DHT11_ReadByte();
pData->temp_deci = DHT11_ReadByte();
pData->check_sum = DHT11_ReadByte();

DHT11_SetDataOutput();
DHT11_DATA_HIGH();

if (pData->check_sum == ((pData->humi_int + pData->humi_deci + pData->temp_int + pData->temp_deci) & 0xFF)) {
return 0; // SUCCESS
} else {
return 1; // CHECKSUM ERROR
}
}
return 2; // TIMEOUT ERROR
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef _DHT11_H_
#define _DHT11_H_

#include "stm32f10x.h"

// Pin and port configuration for DHT11
#define DHT11_GPIO_PORT GPIOA
#define DHT11_GPIO_PIN GPIO_Pin_0
#define DHT11_GPIO_RCC RCC_APB2Periph_GPIOA

// Macros for data line manipulation
#define DHT11_DATA_HIGH() GPIO_SetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN)
#define DHT11_DATA_LOW() GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_GPIO_PIN)
#define DHT11_DATA_READ() GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_GPIO_PIN)

// Data structure for storing humidity and temperature readings
typedef struct {
uint8_t humi_int; // Integer part of humidity
uint8_t humi_deci; // Decimal part of humidity
uint8_t temp_int; // Integer part of temperature
uint8_t temp_deci; // Decimal part of temperature
uint8_t check_sum; // Checksum for data integrity
} DHT11_Data_TypeDef;

// Function prototypes
void DHT11_Init(void);
uint8_t DHT11_ReadData(DHT11_Data_TypeDef *pData);

#endif // _DHT11_H_

注意:实际编程时,你需要确保有适用于你的硬件平台的DHT11驱动库。这通常包括对时序的精确控制,可能需要使用定时器中断或精确的延时函数来实现。

学习资源

  • 数据手册: 查看DHT11的官方数据手册可以更深入地了解其工作原理和技术规格。
  • 社区和教程: 许多在线教程和社区(如Arduino社区、STM32社区)中有关于如何使用DHT11的详细讲解和示例。
  • 项目实践: 尝试将DHT11集成到一个实际的微控制器项目中,比如制作一个自动调节温湿度的系统。