引言
现代家庭车库不仅是车辆的存放空间,也经常用作物品储存区域。为确保车库的安全性和便捷性,智能车库监控与照明系统可以实时监测车库内外的环境状态,包括检测车辆进出、异常活动提醒和自动控制照明,确保用户的车辆和财产安全。本文设计了一个基于STM32的智能车库监控系统,集成了红外感应、超声波检测、视频监控、智能照明和远程控制等功能。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列):用于系统控制和数据处理。
- 红外传感器:用于检测车辆进出车库和车库内的运动。
- 超声波传感器:用于检测车库内的物体距离,确保车辆停车安全。
- 摄像头模块(如OV7670):用于实时监控车库内外的情况,支持图像捕获。
- 照明灯(如LED灯):用于在车库内外提供照明。
- 继电器模块:用于控制照明灯的开关。
- OLED 显示屏:用于显示系统状态,包括车辆出入、距离和光照状态等信息。
- Wi-Fi 模块(如ESP8266):用于实现远程视频监控、报警和控制。
- 蜂鸣器:用于异常活动或停车不当时发出警报。
- LED 指示灯:用于显示系统的运行状态和车库的使用情况。
- 电源模块、杜邦线、面包板等基础电子元件。
2. 软件工具
- STM32CubeMX:用于配置STM32的外设。
- Keil uVision 或 STM32CubeIDE:用于编写、调试和下载代码。
- ST-Link 驱动程序:用于烧录程序到STM32。
项目实现
1. 硬件连接
- 红外传感器连接:将红外传感器的信号引脚连接到STM32的GPIO(如PA0),用于检测车辆进出车库。
- 超声波传感器连接:将超声波传感器的Echo和Trig引脚连接到STM32的GPIO(如PA1、PA2),用于测量车库内物体的距离,确保停车安全。
- 摄像头模块连接:将摄像头模块的数据引脚连接到STM32的GPIO(如PA3到PA8),用于实时捕捉车库内外图像。
- 照明灯连接:通过继电器模块连接到STM32的GPIO(如PA9),用于控制车库照明灯的开关。
- OLED显示屏连接:OLED显示屏的SDA和SCL引脚连接到STM32的I2C接口(如PB6、PB7),用于显示系统状态和警报信息。
- Wi-Fi模块连接:Wi-Fi模块的TX/RX引脚连接到STM32的USART接口,用于远程数据传输和控制。
- 蜂鸣器连接:蜂鸣器的控制引脚连接到STM32的GPIO(如PA10),用于发出异常活动报警。
2. STM32CubeMX 配置
- GPIO:配置多个GPIO引脚,用于连接红外传感器、超声波传感器、继电器、蜂鸣器、LED等外设。
- I2C:用于OLED显示屏的数据通信。
- USART:用于Wi-Fi模块的通信,实现数据上传和远程监控。
- 系统时钟:使用外部高速时钟HSE,提高系统响应速度和性能。
生成代码后,在Keil uVision或STM32CubeIDE中进行开发。
3. 主程序设计
智能车库监控与照明系统的核心功能是通过红外、超声波和摄像头实时监测车库状态,并根据车辆进出情况控制照明,确保车库的安全性和便利性。当检测到异常活动或停车不当时,系统会自动报警并通过Wi-Fi提醒用户。以下是系统的代码示例:
#include "stm32f1xx_hal.h"
#include "infrared_sensor.h"
#include "ultrasonic_sensor.h"
#include "camera.h"
#include "oled.h"
#include "relay.h"
#include "wifi.h"
#include "gpio.h"
// 定义超声波距离和红外传感阈值
#define DISTANCE_THRESHOLD 30 // 距离阈值(单位:厘米)
#define INFRARED_DETECTION_THRESHOLD 1 // 红外检测值
// 函数声明
void System_Init(void);
void Measure_Environment(void);
void Control_Lighting(void);
void Display_Status(void);
void Send_Data_Remotely(void);
void Alarm_Control(void);
// 全局变量
uint16_t distance = 0; // 物体距离
uint8_t vehicle_detected = 0; // 是否检测到车辆进出
uint8_t alarm_triggered = 0; // 报警状态
void System_Init(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
InfraredSensor_Init();
UltrasonicSensor_Init();
Camera_Init();
OLED_Init();
Relay_Init();
WiFi_Init();
OLED_ShowString(0, 0, "Garage Monitoring");
}
// 读取环境数据
void Measure_Environment(void)
{
distance = UltrasonicSensor_Read();
vehicle_detected = InfraredSensor_Read();
}
// 控制照明灯
void Control_Lighting(void)
{
// 如果检测到车辆进出或距离低于阈值,则打开照明灯
if (vehicle_detected || distance < DISTANCE_THRESHOLD)
{
Relay_Light_On(); // 打开照明灯
}
else
{
Relay_Light_Off(); // 关闭照明灯
}
}
// 显示系统状态
void Display_Status(void)
{
OLED_Clear();
OLED_ShowString(0, 0, "Distance: ");
OLED_ShowNumber(64, 0, distance, 4);
OLED_ShowString(0, 1, "Vehicle: ");
OLED_ShowString(64, 1, vehicle_detected ? "Yes" : "No");
}
// 发送数据到远程服务器
void Send_Data_Remotely(void)
{
char buffer[100];
sprintf(buffer, "Distance:%d Vehicle:%d", distance, vehicle_detected);
WiFi_SendData(buffer); // 通过Wi-Fi发送数据
}
// 控制报警
void Alarm_Control(void)
{
if (distance < DISTANCE_THRESHOLD && vehicle_detected == 0) // 非法进入或停车不当
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); // 打开蜂鸣器
alarm_triggered = 1;
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // 关闭蜂鸣器
alarm_triggered = 0;
}
}
int main(void)
{
System_Init();
while (1)
{
Measure_Environment(); // 读取环境数据
Control_Lighting(); // 控制照明系统
Display_Status(); // 显示系统状态
Send_Data_Remotely(); // 上传数据
Alarm_Control(); // 控制报警
HAL_Delay(5000); // 每5秒更新一次
}
}
4. 各模块代码
红外传感器读取
#include "infrared_sensor.h"
// 初始化红外传感器
void InfraredSensor_Init(void)
{
// 配置红外传感器的GPIO引脚
}
// 检测是否有车辆进出
uint8_t InfraredSensor_Read(void)
{
// 返回红外传感器状态,1表示有车辆,0表示无车辆
return 1; // 假设检测到车辆进出
}
超声波传感器读取
#include "ultrasonic_sensor.h"
// 初始化超声波传感器
void UltrasonicSensor_Init(void)
{
// 配置超声波传感器的GPIO引脚
}
// 读取物体距离
uint16_t UltrasonicSensor_Read(void)
{
// 返回物体距离的模拟值(单位:厘米)
return 20; // 假设当前距离为20厘米
}
继电器控制
#include "relay.h"
// 初始化继电器模块
void Relay_Init(void)
{
// 配置继电器引脚
}
// 打开照明灯
void Relay_Light_On(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); // 打开照明灯继电器
}
// 关闭照明灯
void Relay_Light_Off(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); // 关闭照明灯继电器
}
OLED显示
#include "oled.h"
// 初始化OLED显示屏
void OLED_Init(void)
{
// OLED初始化代码
}
// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
{
// 在OLED显示屏上显示字符串
}
// 显示整数
void OLED_ShowNumber(uint8_t x, uint8_t y, uint32_t num, uint8_t len)
{
// 显示整数值
}
// 清除显示内容
void OLED_Clear(void)
{
// 清除OLED显示
}
Wi-Fi数据发送
#include "wifi.h"
// 初始化Wi-Fi模块
void WiFi_Init(void)
{
// Wi-Fi初始化代码
}
// 发送数据到服务器
void WiFi_SendData(char* data)
{
// 通过Wi-Fi将数据上传到服务器
}
系统工作原理
- 车辆检测与照明控制:系统通过红外和超声波传感器监测车辆出入和车内物体距离,自动控制车库照明灯,确保安全停车。
- 异常报警:当检测到车库内有异常活动或停车不当时,系统通过蜂鸣器发出警报,并通过Wi-Fi提醒用户。
- 远程监控与实时显示:OLED显示屏实时显示车库状态数据,系统还将数据上传到云端,方便用户远程查看车库状态。
常见问题与解决方法
1. 车辆检测误报
- 问题原因:红外传感器受外部环境干扰。
- 解决方法:将传感器安装在车库入口附近,避免其他光源干扰。
2. 照明灯无法正常开启
- 问题原因:继电器模块故障或连接不良。
- 解决方法:检查继电器模块和照明灯的电源连接,确保照明灯正常工作。
3. Wi-Fi连接失败
- 问题原因:Wi-Fi模块配置错误或网络信号弱。
- 解决方法:确保Wi-Fi信号覆盖良好,并正确配置Wi-Fi模块的参数。
扩展功能
- 远程摄像头监控:增加摄像头模块,实现远程实时查看车库内的情况。
- 停车位置引导:通过LED灯或指示牌引导车辆停靠到合适的位置。
- 多重报警系统:增加智能锁、摄像头和防盗警报,确保车库的安全性。
结论
本项目设计的基于STM32的智能车库监控与照明系统,通过车辆检测、异常报警和智能照明功能,为车库提供了高效的安全防护和便捷管理方案。系统具备自动化、远程监控和报警功能,适用于家庭车库、停车场等场景。未来可以通过增加远程视频监控和智能引导等功能,进一步提升系统的智能化水平和用户体验。