STM32实现环境温湿度、智能灯光与门禁控制,OLED实时显示,附代码及注意事项!
以下是一个基于STM32的环境温湿度控制、智能灯光控制和智能门禁控制系统的示例代码,同时可以在OLED屏幕上显示相关信息。本示例使用STM32Cube HAL库,温湿度传感器采用DHT11,OLED屏幕采用I2C接口的128x64 OLED,智能灯光控制使用一个普通的GPIO控制LED,智能门禁控制使用一个按键模拟刷卡开门。 ```c #include "stm32f1xx_hal.h" #include "dht11.h" #include "ssd1306.h" // 定义灯光控制引脚 #define LIGHT_PIN GPIO_PIN_0 #define LIGHT_PORT GPIOA // 定义门禁控制引脚 #define DOOR_PIN GPIO_PIN_1 #define DOOR_PORT GPIOA // 定义按键引脚 #define BUTTON_PIN GPIO_PIN_2 #define BUTTON_PORT GPIOA // 全局变量 uint8_t humidity; uint8_t temperature; uint8_t door_status = 0; // 0: 门关闭,1: 门打开 uint8_t light_status = 0; // 0: 灯关闭,1: 灯打开 // 初始化GPIO void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 灯光控制引脚初始化 GPIO_InitStruct.Pin = LIGHT_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LIGHT_PORT, &GPIO_InitStruct); // 门禁控制引脚初始化 GPIO_InitStruct.Pin = DOOR_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DOOR_PORT, &GPIO_InitStruct); // 按键引脚初始化 GPIO_InitStruct.Pin = BUTTON_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct); } // 读取温湿度 void Read_Temperature_Humidity(void) { if (DHT11_Read_Data(&humidity, &temperature) == DHT11_OK) { // 读取成功 } else { // 读取失败 humidity = 0; temperature = 0; } } // 控制灯光 void Control_Light(uint8_t status) { if (status) { HAL_GPIO_WritePin(LIGHT_PORT, LIGHT_PIN, GPIO_PIN_SET); light_status = 1; } else { HAL_GPIO_WritePin(LIGHT_PORT, LIGHT_PIN, GPIO_PIN_RESET); light_status = 0; } } // 控制门禁 void Control_Door(uint8_t status) { if (status) { HAL_GPIO_WritePin(DOOR_PORT, DOOR_PIN, GPIO_PIN_SET); door_status = 1; } else { HAL_GPIO_WritePin(DOOR_PORT, DOOR_PIN, GPIO_PIN_RESET); door_status = 0; } } // 在OLED屏幕上显示信息 void Display_Info(void) { char str[20]; ssd1306_Fill(Black); // 显示温湿度 sprintf(str, "Temp: %d C", temperature); ssd1306_SetCursor(0, 0); ssd1306_WriteString(str, Font_7x10, White); sprintf(str, "Humi: %d %%", humidity); ssd1306_SetCursor(0, 10); ssd1306_WriteString(str, Font_7x10, White); // 显示灯光状态 if (light_status) { ssd1306_SetCursor(0, 20); ssd1306_WriteString("Light: ON", Font_7x10, White); } else { ssd1306_SetCursor(0, 20); ssd1306_WriteString("Light: OFF", Font_7x10, White); } // 显示门禁状态 if (door_status) { ssd1306_SetCursor(0, 30); ssd1306_WriteString("Door: OPEN", Font_7x10, White); } else { ssd1306_SetCursor(0, 30); ssd1306_WriteString("Door: CLOSED", Font_7x10, White); } ssd1306_UpdateScreen(); } int main(void) { HAL_Init(); GPIO_Init(); DHT11_Init(); ssd1306_Init(); while (1) { // 读取温湿度 Read_Temperature_Humidity(); // 控制灯光(示例:温度高于30度开灯) if (temperature > 30) { Control_Light(1); } else { Control_Light(0); } // 检测按键,模拟刷卡开门 if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET) { HAL_Delay(20); // 消抖 if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET) { Control_Door(1); HAL_Delay(3000); // 门打开3秒 Control_Door(0); } } // 显示信息 Display_Info(); HAL_Delay(1000); // 每秒更新一次 } } ``` 代码说明 1. GPIO初始化:初始化灯光控制引脚、门禁控制引脚和按键引脚。 2. 读取温湿度:使用DHT11传感器读取环境温湿度。 3. 控制灯光:根据温度值控制灯光的开关。 4. 控制门禁:检测按键状态,模拟刷卡开门。 5. 显示信息:在OLED屏幕上显示温湿度、灯光状态和门禁状态。 注意事项 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. DHT11传感器:DHT11传感器的数据读取需要严格按照时序进行,否则可能会读取失败。在读取数据时,需要注意延时时间的准确性。 2. OLED屏幕:OLED屏幕的初始化和显示需要使用正确的I2C地址和驱动程序。在使用过程中,需要注意屏幕的分辨率和字体大小。 3. 按键消抖:在检测按键状态时,需要进行消抖处理,避免误触发。可以使用延时消抖或硬件消抖的方法。 ######[AI写代码神器 | 1665点数解答 | 2025-11-08 09:34:25]
- STM32F10x代码解析:多模块引用与变量定义及功能探讨(字节豆包 | 25点数解答 | 2025-05-06 01:13:43)197
- Keil编译报错:找不到core_cm3.h文件的原因及解决办法(字节豆包 | 666点数解答 | 2025-11-12 18:26:21)169
- Keil MDK编译报错“无法打开 core_cm3.h”,解决办法及注意事项全揭秘!(字节豆包 | 560点数解答 | 2025-11-12 18:31:47)80
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)468
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)350
- 仅36元!低成本人体感应自动门控制系统,硬件选型、代码全揭秘 (DeepSeek | 586点数解答 | 2025-04-08 16:54:34)188
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)322
- C51 编程:外部中断 0 边沿触发控制 P2 口 8 个 LED 依次点亮(字节豆包 | 41点数解答 | 2025-06-22 11:25:54)152
- 8051 单片机:用外部中断 0 边沿触发实现 P2 口 8 个 LED 依次点亮(附代码与详解) (字节豆包 | 538点数解答 | 2025-06-22 11:26:15)129
- C51实现外部中断0边沿触发,让P2口8个LED依次点亮的程序详解(DeepSeek | 400点数解答 | 2025-06-22 21:21:28)109
- C51 程序:利用外部中断 0 边沿触发实现 P2 口 8 个 LED 依次点亮及代码分析(DeepSeek | 228点数解答 | 2025-06-22 23:18:42)164
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)471