1. 嵌入式毕业设计选题指南与项目解析
作为一名经历过毕业设计洗礼的过来人,我深知选题的重要性。一个好的选题不仅能让你的毕业设计过程事半功倍,还能在答辩时给老师留下深刻印象。近年来,随着物联网、人工智能等技术的发展,传统的单片机项目已经很难满足毕业答辩的要求。本文将分享5个经过验证的STM32毕业设计项目,这些项目都具有适中的难度、达标的工作量和显著的创新点。
2. 项目1:STM32与深度学习口罩佩戴检测系统
2.1 系统架构设计
这个项目结合了嵌入式系统和计算机视觉技术,构建了一个智能化的口罩检测门禁系统。系统采用PC端和STM32双主控架构,PC端负责实时图像处理和口罩检测,STM32负责设备控制和结果显示。
系统工作流程如下:
- PC端通过USB摄像头采集实时视频流
- 使用OpenCV和深度学习模型(如YOLOv3-tiny)进行人脸检测和口罩识别
- 检测结果通过WiFi模块(ESP-01S)发送给STM32
- STM32接收数据并在OLED屏上显示检测状态
- 当检测到未佩戴口罩时,触发蜂鸣器报警
2.2 硬件选型与搭建
核心硬件组件包括:
- STM32F103RCT6开发板:作为下位机主控,处理来自PC的指令并控制外设
- ESP-01S WiFi模块:实现STM32与PC之间的无线通信
- 1.44寸SPI接口OLED屏:用于显示检测状态和系统信息
- 有源蜂鸣器模块:用于报警提示
硬件连接注意事项:
- ESP-01S的TX接STM32的PA3(RX),RX接PA2(TX)
- OLED的SCK接PA5,SDA接PA7,RES接PB0,DC接PB1,CS接PA4
- 蜂鸣器信号线接PB8,注意添加驱动三极管
2.3 软件实现要点
PC端程序开发:
python复制import cv2
import numpy as np
from tensorflow.keras.models import load_model
# 加载预训练的口罩检测模型
model = load_model('mask_detector.model')
# 初始化摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# 人脸检测和预处理
faces = detect_faces(frame)
for (x, y, w, h) in faces:
face = frame[y:y+h, x:x+w]
face = preprocess(face) # 归一化、resize等
# 口罩检测
pred = model.predict(face[np.newaxis, ...])
mask_prob = pred[0][0]
# 通过串口发送检测结果给ESP-01S
send_result_to_stm32(mask_prob)
STM32端关键代码:
c复制// WiFi数据接收处理
void ESP8266_Receive(void)
{
if(USART_RX_STA&0x8000)
{
int len = USART_RX_STA&0x3FFF;
USART_RX_BUF[len] = '\0';
// 解析接收到的数据
if(strstr(USART_RX_BUF, "NoMask"))
{
OLED_ShowString(0,0,"Status:No Mask!",16);
BEEP_ON();
}
else
{
OLED_ShowString(0,0,"Status:Mask On ",16);
BEEP_OFF();
}
USART_RX_STA = 0;
}
}
2.4 项目创新点与难点
创新点:
- 将深度学习模型与嵌入式系统结合,实现了端边协同计算
- 采用无线通信方式,避免了布线麻烦
- 系统可扩展性强,可轻松改为其他检测场景
难点及解决方案:
- PC与STM32通信同步问题:采用固定格式的数据帧,包含起始标志、数据长度、校验和等
- 实时性要求:优化PC端程序,使用轻量级模型,减少处理延迟
- 误检处理:加入状态保持机制,连续3帧检测到未戴口罩才触发报警
3. 项目2:STM32智能鱼缸监控投喂系统
3.1 系统功能设计
这个项目实现了一个全自动的智能鱼缸管理系统,主要功能包括:
- 水位自动调节:通过超声波传感器监测水位,控制水泵和电磁阀
- 水质监测:使用TDS传感器和浊度传感器监测水质
- 定时投喂:通过步进电机控制饲料投放
- 远程监控:通过WiFi将数据上传到手机APP
- 本地显示:OLED屏实时显示各项参数
3.2 硬件组成与电路设计
核心传感器和执行器:
- 超声波传感器HC-SR04:测量水位高度
- TDS传感器:检测水中溶解固体总量
- 浊度传感器:评估水质清澈度
- 5V微型水泵:用于加水
- 电磁阀:控制排水
- 28BYJ-48步进电机:驱动投食机构
电路设计注意事项:
- 水泵和电磁阀需要继电器驱动,注意与MCU隔离
- 传感器信号线要加滤波电容,避免干扰
- 步进电机需要ULN2003驱动模块
- 为WiFi模块单独供电,避免电流不足
3.3 控制逻辑实现
系统主控制逻辑:
c复制void main_control_loop(void)
{
// 1. 读取传感器数据
float water_level = get_water_level();
float tds_value = get_tds_value();
float turbidity = get_turbidity();
// 2. 水位控制
if(water_level < LOW_LEVEL)
{
turn_on_pump();
close_drain_valve();
}
else if(water_level > HIGH_LEVEL)
{
turn_off_pump();
open_drain_valve();
}
// 3. 水质控制
if(tds_value > TDS_THRESHOLD || turbidity > TURBIDITY_THRESHOLD)
{
start_water_change();
}
// 4. 定时喂食
if(should_feed_now())
{
feed_fish();
}
// 5. 更新显示和远程数据
update_display();
send_to_app();
}
3.4 项目优化建议
- 增加水温监测:添加DS18B20温度传感器
- 实现PH值检测:接入PH传感器模块
- 添加光照控制:通过光敏电阻和LED灯条实现自动补光
- 开发手机APP:使用MIT App Inventor或Android Studio开发控制界面
- 数据记录功能:添加SD卡模块,记录历史数据
4. 项目3:STM32火灾监控与可视化系统
4.1 系统架构设计
该系统由以下部分组成:
- 传感器阵列:烟雾传感器(MQ-2)、温度传感器(DS18B20)、火焰传感器
- 主控制器:STM32F103
- 通信模块:WiFi(ESP-01S)或NB-IoT(BC95)
- 报警装置:蜂鸣器、LED指示灯
- 可视化平台:基于Qt或Web的上位机
4.2 传感器选型与校准
关键传感器技术参数:
-
MQ-2烟雾传感器:
- 检测范围:300-10000ppm
- 加热电压:5V±0.1V
- 需要预热时间:约20秒
- 校准方法:在洁净空气中读取基准值,然后暴露于标准烟雾源调整
-
DS18B20温度传感器:
- 测量范围:-55°C ~ +125°C
- 精度:±0.5°C
- 单总线接口,需严格时序控制
-
火焰传感器:
- 检测波长:760nm-1100nm
- 探测角度:约60度
- 数字量输出,灵敏度可调
4.3 报警策略实现
多级报警机制设计:
-
初级预警(黄色警报):
- 条件:单一传感器超过阈值(如温度>50°C或烟雾>500ppm)
- 动作:本地LED闪烁,上位机记录事件
-
中级报警(橙色警报):
- 条件:两个传感器同时超阈值(如温度>60°C且烟雾>800ppm)
- 动作:启动蜂鸣器,发送短信通知
-
高级报警(红色警报):
- 条件:检测到明火或三个传感器均超阈值
- 动作:触发联动装置(如自动拨打电话、启动喷淋系统)
报警处理代码示例:
c复制void check_alarm(void)
{
// 读取传感器数据
float temp = get_temperature();
float smoke = get_smoke_level();
uint8_t fire = get_fire_status();
// 判断报警级别
if(fire)
{
trigger_red_alarm();
}
else if(temp > TEMP_TH2 && smoke > SMOKE_TH2)
{
trigger_orange_alarm();
}
else if(temp > TEMP_TH1 || smoke > SMOKE_TH1)
{
trigger_yellow_alarm();
}
else
{
clear_alarm();
}
}
4.4 远程监控实现
NB-IoT通信方案:
- 硬��连接:
- BC95模块通过UART与STM32连接
- 需要SIM卡支持NB-IoT网络
- 数据上报协议:
- 采用CoAP或MQTT协议
- 数据格式:JSON封装
- 上报频率:正常状态每小时1次,报警状态实时上报
- 平台对接:
- 华为OceanConnect
- 中国移动OneNET
- 阿里云IoT平台
5. 项目4:STM32人脸识别快递柜系统
5.1 系统整体设计
该系统分为两大部分:
-
下位机(STM32):
- 控制柜门锁(继电器模拟)
- 驱动OLED显示屏
- 与上位机通信
-
上位机(PC):
- 人脸检测与识别
- 人脸数据库管理
- 用户界面
5.2 人脸识别算法选择
适合嵌入式系统的轻量级方案:
-
人脸检测:
- OpenCV Haar级联分类器
- Dlib HOG特征检测
- MTCNN(更准确但计算量大)
-
人脸特征提取:
- FaceNet(需要PC级算力)
- MobileFaceNet(适合嵌入式设备)
- OpenFace
-
人脸比对:
- 欧氏距离
- 余弦相似度
Python实现示例:
python复制import face_recognition
# 加载已知人脸
known_image = face_recognition.load_image_file("known.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]
# 获取摄像头帧
video_capture = cv2.VideoCapture(0)
ret, frame = video_capture.read()
# 检测人脸
face_locations = face_recognition.face_locations(frame)
face_encodings = face_recognition.face_encodings(frame, face_locations)
for face_encoding in face_encodings:
# 比对已知人脸
matches = face_recognition.compare_faces([known_encoding], face_encoding)
if matches[0]:
send_open_command_to_stm32()
5.3 STM32与PC通信协议
自定义通信协议设计:
-
数据帧格式:
- 帧头:0xAA 0x55(2字节)
- 命令字:1字节(0x01开门,0x02关门,0x03查询状态)
- 数据长度:1字节
- 数据域:N字节
- 校验和:1字节(前面所有字节累加和)
-
状态反馈:
- 柜门状态(开/关)
- 系统错误码
- 当前用户ID
-
错误处理:
- 超时重传
- 校验失败丢弃
- 状态同步机制
5.4 系统安全性考虑
-
防欺骗攻击:
- 活体检测(眨眼、张嘴等动作识别)
- 红外摄像头防照片攻击
-
数据安全:
- 通信加密(AES-128)
- 人脸特征数据脱敏存储
-
故障保护:
- 看门狗定时器
- 紧急开门机制
- 断电保护
6. 项目5:STM32人脸识别门禁系统
6.1 系统架构优化
相比项目4,本项目进行了以下优化:
-
计算任务分配:
- PC端:人脸检测、特征提取、数据库比对
- STM32:设备控制、用户交互、状态显示
-
性能优化:
- 使用多线程处理视频流
- 采用更高效的通信协议
- 优化人脸识别算法参数
-
用户体验改进:
- 增加语音提示
- 改进用户界面
- 简化注册流程
6.2 硬件设计细节
核心模块选型:
-
摄像头:
- OV7670(低分辨率,直接接STM32)
- USB摄像头(接PC,更高画质)
-
显示模块:
- 1.3寸OLED(I2C接口)
- 2.4寸TFT LCD(SPI接口)
-
门禁执行机构:
- 电磁锁(12V/24V)
- 继电器模块(控制电磁锁)
- 门磁传感器(检测门状态)
电源设计要点:
- 主控电源:3.3V LDO
- 外设电源:5V/12V独立供电
- 电磁锁电源:单独大电流电源
- 添加滤波电容和保护二极管
6.3 人脸注册流程实现
完整的用户注册流程:
- 管理员模式激活
- 输入新用户姓名
- 多角度人脸采集(至少3张不同角度)
- 特征提取和存储
- 分配用户权限
- 确认保存
Python实现关键代码:
python复制def register_new_face():
name = input("请输入用户姓名:")
face_encodings = []
print("请面对摄像头采集不同角度...")
for i in range(3):
ret, frame = camera.read()
face_locations = face_recognition.face_locations(frame)
if len(face_locations) == 1:
encoding = face_recognition.face_encodings(frame, face_locations)[0]
face_encodings.append(encoding)
if len(face_encodings) >= 2:
avg_encoding = np.mean(face_encodings, axis=0)
save_to_database(name, avg_encoding)
print(f"用户{name}注册成功!")
else:
print("人脸采集不足,注册失败")
6.4 系统测试与性能评估
测试方案设计:
-
功能测试:
- 人脸注册成功率
- 识别准确率
- 响应时间
-
压力测试:
- 多人连续识别
- 不同光照条件
- 不同角度识别
-
安全测试:
- 防照片攻击
- 防视频回放攻击
- 通信安全测试
性能优化建议:
- 采用更高效的人脸检测算法
- 优化数据库查询方式
- 增加人脸跟踪减少重复检测
- 使用硬件加速(如OpenCL)
