DHT11_Data_TypeDef data; if (DHT11_ReadData(&data) == DHT11_OK) { sprintf(buffer, "Temperature: %d.%dC, Humidity: %d.%d%%\r\n", data.temperature / 10, data.temperature % 10, data.humidity / 10, data.humidity % 10); HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY); } else { HAL_UART_Transmit(&huart1, (uint8_t *)"Failed to read data from DHT11.\r\n", 34, HAL_MAX_DELAY); } HAL_Delay(2000); }
时间: 2024-03-14 09:49:07 浏览: 28
这段代码是用来读取 DHT11 温湿度传感器数据,并通过串口输出温度和湿度值。如果读取成功,会将格式化后的温湿度值通过串口发送出去;如果读取失败,则会输出“Failed to read data from DHT11.”的提示信息。在读取完数据后,程序会延时 2 秒钟再进行下一次的读取。其中,sprintf 函数用于将温湿度值格式化成字符串,strlen 函数用于获取字符串长度,HAL_UART_Transmit 函数用于通过串口发送数据,HAL_Delay 函数用于延时。
相关问题
#include "dht11.h" #include "protocol.h" #include "lcd.h" #include "string.h" #include <stdio.h> #include "gpio.h" #include "usart.h" #define DHT11_DATA_LOW_TIMEOUT 80 #define DHT11_DATA_HIGH_TIMEOUT 90 #define DHT11_RESPONSE_TIMEOUT 40 #define DHT11_BIT_TIMEOUT 60 DHT11_StatusTypeDef DHT11_ReadData(DHT11_Data_TypeDef* data) { uint8_t buffer[5] = {0}; uint8_t i, j; uint32_t count; // 发送开始信号 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); HAL_Delay(18); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); // 等待DHT11响应 count = 0; while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET) { count++; if (count > DHT11_RESPONSE_TIMEOUT) { return DHT11_ERROR; } HAL_Delay(1); } count = 0; while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET) { count++; if (count > DHT11_RESPONSE_TIMEOUT) { return DHT11_ERROR; } HAL_Delay(1); } // 读取40位数据 for (i = 0; i < 40; i++) { count = 0; while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET) { count++; if (count > DHT11_DATA_LOW_TIMEOUT) { return DHT11_ERROR; } } count = 0; while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET) { count++; if (count > DHT11_DATA_HIGH_TIMEOUT) { return DHT11_ERROR; } } buffer[i / 8] <<= 1; if (count > DHT11_BIT_TIMEOUT) { buffer[i / 8] |= 0x01; } } // 验证数据是否正确 if (buffer[4] != (buffer[0] + buffer[1] + buffer[2] + buffer[3])) { return DHT11_ERROR; } // 解析数据 data->humidity = buffer[0]; data->temp_int = buffer[2]; data->temp_dec = buffer[3]; return DHT11_OK; } void text_func_1() { DHT11_Data_TypeDef data; DHT11_ReadData(&data); printf("-->"); printf("%d.%c %d%%",data.temp_int, data.temp_dec, data.humidity); HAL_Delay(1000); if (DHT11_ReadData(&data) == DHT11_OK){ char str[16]; sprintf(str, "T:%d.%dC H:%d%%", data.temp_int, data.temp_dec, data.humidity); HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY); HAL_Delay(1000); } }改错
代码中需要修改的地方:
1. 在 `DHT11_ReadData` 函数中,`buffer[i / 8]` 需要先清零再左移,否则可能导致结果错误。
修改前:`buffer[i / 8] <<= 1;`
修改后:`buffer[i / 8] = 0; buffer[i / 8] |= 0x01 << (7 - (i % 8));`
2. 在 `text_func_1` 函数中,需要判断 `DHT11_ReadData` 函数返回值是否为 `DHT11_OK`,如果不是,则不执行后面的代码。
修改前:
```
DHT11_ReadData(&data);
printf("-->");
printf("%d.%c %d%%",data.temp_int, data.temp_dec, data.humidity);
HAL_Delay(1000);
if (DHT11_ReadData(&data) == DHT11_OK){
char str[16];
sprintf(str, "T:%d.%dC H:%d%%", data.temp_int, data.temp_dec, data.humidity);
HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
HAL_Delay(1000);
}
```
修改后:
```
if (DHT11_ReadData(&data) == DHT11_OK){
printf("-->");
printf("%d.%c %d%%",data.temp_int, data.temp_dec, data.humidity);
HAL_Delay(1000);
char str[16];
sprintf(str, "T:%d.%dC H:%d%%", data.temp_int, data.temp_dec, data.humidity);
HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
HAL_Delay(1000);
}
```
stm32f103c8t6使用dht11温湿度模块检测,测试
好的,下面是基于STM32F103C8T6使用DHT11温湿度模块检测的步骤:
1. 硬件连接
将DHT11模块的VCC引脚连接到STM32F103C8T6的5V引脚,GND引脚连接到STM32F103C8T6的GND引脚,DATA引脚连接到STM32F103C8T6的PB0引脚。
2. 软件开发
在Keil MDK中,新建一个工程,然后按照以下步骤进行配置:
(1)在工程中添加头文件dht11.h和dht11.c。
(2)在main函数中初始化PB0引脚为输入模式。
(3)在main函数中循环调用dht11_read函数,读取DHT11模块的温湿度值,并通过串口输出。
以下是示例代码:
```c
#include "stm32f10x.h"
#include "dht11.h"
#include "stdio.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 初始化PB0引脚为输入模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
while (1)
{
// 读取温湿度值
DHT11_Data_TypeDef dht11_data = dht11_read();
// 输出温湿度值
char str[128];
sprintf(str, "Temperature: %d.%d C, Humidity: %d.%d %%\r\n",
dht11_data.temperature_integral, dht11_data.temperature_decimal,
dht11_data.humidity_integral, dht11_data.humidity_decimal);
USART_SendString(USART1, str);
Delay_ms(2000);
}
}
// 串口发送字符串
void USART_SendString(USART_TypeDef* USARTx, char* str)
{
while(*str)
{
USART_SendData(USARTx, (uint8_t)(*str++));
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
// 延时函数
void Delay_ms(uint32_t nTime)
{
uint32_t TimingDelay = 0;
TimingDelay = nTime;
while(TimingDelay != 0)
{
TimingDelay--;
}
}
// SysTick中断处理函数
void SysTick_Handler(void)
{
static uint32_t counter = 0;
if(counter != 0)
{
counter--;
}
}
// 获取系统时钟
uint32_t GetSysClock(void)
{
RCC_ClocksTypeDef RCC_ClocksStatus;
RCC_GetClocksFreq(&RCC_ClocksStatus);
return RCC_ClocksStatus.HCLK_Frequency;
}
```
3. 编译下载
在Keil MDK中编译工程,然后下载到STM32F103C8T6开发板中进行测试。
注意:由于DHT11模块的数据线是单向的,需要使用上拉电阻,所以在初始化PB0引脚时,需要将它设置为上拉输入模式(GPIO_Mode_IPU)。而且DHT11模块的温湿度值读取需要一定的时间,建议采用定时器或者延时函数等方式进行等待。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)