STM32F103+温湿度传感器DHT22+4脚OLED,完成一个传感器的数据采集,将数据显示到OLED屏幕上
时间: 2025-01-28 22:22:19 浏览: 91
要使用STM32F103微控制器、温湿度传感器DHT22和4脚OLED显示屏来完成一个传感器的数据采集并将数据显示到OLED屏幕上,可以按照以下步骤进行:
### 硬件连接
1. **STM32F103与DHT22连接**:
- VCC接3.3V或5V电源(根据DHT22的工作电压)
- GND接地
- DATA接STM32的GPIO引脚(例如PA0)
2. **STM32F103与OLED连接**:
- VCC接3.3V电源
- GND接地
- SDA接STM32的GPIO引脚(例如PB7)
- SCL接STM32的GPIO引脚(例如PB6)
### 软件实现
1. **初始化GPIO和I2C**:
- 配置DHT22连接的GPIO引脚为开漏输出和上拉输入。
- 初始化I2C接口,用于与OLED通信。
2. **DHT22数据读取**:
- 通过GPIO引脚发送起始信号给DHT22。
- 读取DHT22的响应信号,并解析温湿度数据。
3. **OLED显示**:
- 初始化OLED显示屏。
- 清除显示缓冲区。
- 将温湿度数据写入显示缓冲区。
- 更新显示。
### 示例代码
```c
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
#include "dht22.h"
I2C_HandleTypeDef hi2c1;
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_UpdateScreen();
while (1)
{
float temperature, humidity;
if (dht22_read(&temperature, &humidity) == DHT22_OK)
{
char buffer[32];
sprintf(buffer, "Temp: %.2f C", temperature);
ssd1306_Fill(Black);
ssd1306_SetCursor(2, 0);
ssd1306_WriteString(buffer, Font_11x18, White);
sprintf(buffer, "Humidity: %.2f %%", humidity);
ssd1306_SetCursor(2, 20);
ssd1306_WriteString(buffer, Font_11x18, White);
ssd1306_UpdateScreen();
}
HAL_Delay(2000);
}
}
void SystemClock_Config(void)
{
// 系统时钟配置代码
}
static void MX_I2C1_Init(void)
{
// I2C1初始化代码
}
static void MX_GPIO_Init(void)
{
// GPIO初始化代码
}
static void MX_USART1_UART_Init(void)
{
// USART1初始化代码
}
```
### 说明
- `dht22_read`函数用于读取DHT22传感器的数据。
- `ssd1306_Init`函数用于初始化OLED显示屏。
- `ssd1306_Fill`函数用于填充显示缓冲区。
- `ssd1306_SetCursor`函数用于设置光标位置。
- `ssd1306_WriteString`函数用于在OLED上写字符串。
- `ssd1306_UpdateScreen`函数用于更新显示。
阅读全文
相关推荐



















