在STM32微控制器上使用DHT11温湿度传感器时,代码实现主要涉及以下步骤:
硬件连接
代码初始化
通信协议
读取温湿度数据
下面是一个简化的代码示例,展示如何与DHT11进行通信并读取温湿度数据:
#include "main.h"
#include "dht.h"
#define DHT11_GPIO GPIOA
#define DHT11_PIN GPIO_PIN_0
void DHT11_Reset(void)
{
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_SET);
HAL_Delay(30);
}
uint8_t DHT11_Check(void)
{
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(180);
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_SET);
HAL_Delay(30);
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
if (HAL_GPIO_ReadPin(DHT11_GPIO, DHT11_PIN) == GPIO_PIN_RESET)
{
return 1; // 未检测到DHT11
}
else
{
return 0; // 存在DHT11
}
}
void DHT11_ReadBit(uint8_t *bit)
{
HAL_GPIO_WritePin(DHT11_GPIO, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(1);
if (HAL_GPIO_ReadPin(DHT11_GPIO, DHT11_PIN) == GPIO_PIN_SET)
{
*bit = 1;
}
else
{
*bit = 0;
}
}
void DHT11_ReadData(uint8_t *data)
{
uint8_t bit = 0;
for (int i = 0; i < 40; i++)
{
DHT11_ReadBit(&bit);
data[i] = bit;
}
}
void DHT11_ReadHumidity(float *humidity)
{
uint8_t data[5];
DHT11_ReadData(data);
*humidity = (data[0] << 8) | data[1];
*humidity /= 10;
}
void DHT11_ReadTemperature(float *temperature)
{
uint8_t data[5];
DHT11_ReadData(data);
*temperature = (data[2] << 8) | data[3];
*temperature /= 10;
}
int main(void)
{
HAL_Init();
DHT11_Reset();
if (DHT11_Check() == 0)
{
DHT11_ReadHumidity(&humidity);
DHT11_ReadTemperature(&temperature);
printf("Humidity: %.2f%%\n", humidity);
printf("Temperature: %.2f°C\n", temperature);
}
else
{
printf("DHT11 not detected\n");
}
while (1)
{
// 无限循环
}
}
DHT11_Reset():发送请求信号给DHT11。DHT11_Check():检查DHT11是否存在。DHT11_ReadBit():读取DHT11的一个数据位。DHT11_ReadData():读取DHT11发送的40位数据。DHT11_ReadHumidity():从读取的数据中解析出湿度数据。DHT11_ReadTemperature():从读取的数据中解析出温度数据。