酷代码 AI
菜单
服务商

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]