stm32温湿度控制,显示在oled上,keil
时间: 2023-10-19 20:20:07 浏览: 209
好的,下面是一个基于Keil编写的STM32温湿度控制的程序,并将数据显示在OLED屏幕上。
首先,你需要在Keil中创建一个新的工程,并选择你所使用的STM32芯片型号。然后,在工程中添加以下库文件:
1. STM32F1xx_HAL_Driver
2. STM32F1xx_HAL_Driver\Inc
3. STM32F1xx_HAL_Driver\Src
4. STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_i2c.c
5. STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_i2c_ex.c
6. STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c
7. STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c
8. STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c
然后,你需要添加以下头文件:
```c
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
#include "fonts.h"
#include <stdio.h>
#include <string.h>
```
接下来,你需要定义I2C总线的地址和OLED屏幕的地址:
```c
#define I2C_ADDR 0x27
#define OLED_ADDR (I2C_ADDR << 1)
```
然后,你需要定义温湿度传感器的地址和寄存器地址:
```c
#define DHT11_ADDR 0x01
#define DHT11_REG_TEMP 0x00
#define DHT11_REG_HUMI 0x01
```
接下来,你需要定义I2C总线和OLED屏幕的变量:
```c
I2C_HandleTypeDef hi2c1;
extern uint8_t ssd1306_buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];
```
然后,你需要定义温湿度传感器读取数据的函数:
```c
void DHT11_ReadData(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5] = {0};
uint8_t parity = 0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(18);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(40);
while (!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
for (int i = 0; i < 5; i++) {
for (int j = 7; j >= 0; j--) {
while (!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
HAL_Delay(30);
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12))
buf[i] |= (1 << j);
while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
}
}
parity = buf[0] + buf[1] + buf[2] + buf[3];
if (buf[4] == parity) {
*humi = buf[0];
*temp = buf[2];
}
}
```
在主函数中,你需要初始化I2C总线和OLED屏幕:
```c
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
int main(void)
{
uint8_t temp, humi;
char buf[16];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_UpdateScreen();
while (1)
{
DHT11_ReadData(&temp, &humi);
sprintf(buf, "Temp: %d C", temp);
ssd1306_SetCursor(0, 0);
ssd1306_WriteString(buf, Font_7x10, White);
sprintf(buf, "Humi: %d %%", humi);
ssd1306_SetCursor(0, 20);
ssd1306_WriteString(buf, Font_7x10, White);
ssd1306_UpdateScreen();
HAL_Delay(2000);
}
}
```
这个程序会不断读取温湿度传感器的数据,并将其显示在OLED屏幕上。你可以根据需要调整延迟时间和屏幕显示的内容。
最后,你需要在Keil中编译和下载程序到STM32芯片中。然后,连接温湿度传感器和OLED屏幕,就可以看到温湿度数据在屏幕上显示了。
阅读全文