物联网毕业设计实战案例50选:STM32与WiFi智能系统开发指南
1. 物联网毕业设计入门指南
做物联网方向的毕业设计,很多同学一开始都会觉得无从下手。我自己带过不少学生的毕业设计,发现大家最困惑的就是如何选择一个既不太难又能体现技术水平的题目。STM32加上WiFi通信这个组合,可以说是目前最实用也最容易出成果的方案了。
STM32单片机功能强大而且价格亲民,一块开发板几十块钱就能买到,非常适合学生党。加上现在WiFi模块也很便宜,ESP8266这种模块十块钱左右就能入手,用串口就能和STM32通信,不需要太复杂的电路知识。这两个组合起来,就能做出很多实用的物联网项目。
我建议同学们从自己熟悉的场景入手。比如如果你对智能家居感兴趣,可以做智能灯光控制或者环境监测系统;如果对农业有兴趣,可以做智能灌溉或者大棚监控系统。关键是选择一个你真正感兴趣的方向,这样做起来会更有动力。
硬件选型方面,STM32F103系列是最常用的,价格便宜而且资料丰富。WiFi模块首推ESP8266,特别是ESP-01S这个型号,体积小而且功耗低,直接用AT指令就能控制,不需要深入研究无线通信协议也能用起来。
软件开发环境推荐使用Keil MDK或者STM32CubeIDE,这两个工具都有丰富的库函数支持,能大大降低开发难度。操作系统方面,如果项目不太复杂,直接用裸机开发就可以;如果需要处理多任务,可以考虑FreeRTOS这样的实时系统。
2. 智能农业监控系统实战
2.1 系统架构设计
这个系统是我带学生做过的一个实际案例,用来监控大棚环境并自动控制灌溉。整个系统采用模块化设计,这样调试起来比较方便,哪个部分出问题就修哪个部分。
核心控制器用的是STM32F103RCT6,这款芯片有256KB的Flash和48KB的RAM,完全够用。传感器方面,温湿度用DHT11,光照强度用BH1750,土壤湿度用简单的电阻式传感器。执行机构是一个小水泵,通过继电器控制开关。
显示部分用了一个1.44寸的LCD屏,SPI接口的,占用IO口比较少。WiFi模块选用ESP-01S,通过串口与STM32通信。整个系统的供电可以用USB或者外部12V电源,通过稳压芯片降到3.3V和5V。
2.2 硬件连接详解
传感器的连接其实很简单。DHT11只有三个引脚:VCC、GND和DATA。DATA引脚接STM32的任何一个GPIO口,记得加上拉电阻。BH1750是I2C接口,接STM32的I2C引脚,通常是PB6和PB7。
土壤湿度传感器是模拟输出的,需要接STM32的ADC引脚。我一般用PA0这个引脚,它是ADC1的通道0。继电器模块的控制引脚接任何一个GPIO口,注意要加三极管驱动,因为STM32的IO口驱动能力有限。
ESP-01S的接线要特别注意:TX接STM32的RX,RX接STM32的TX,VCC接3.3V,千万不要接5V,否则会烧模块。CH_PD引脚要接高电平,也就是直接接到3.3V上。
2.3 软件实现代码
主程序的逻辑是这样的:先初始化各个外设,然后进入主循环,循环里轮流读取传感器数据,显示到LCD上,通过WiFi上传数据,最后根据设定值判断是否需要浇水。
#include "stm32f10x.h"
#include "dht11.h"
#include "bh1750.h"
#include "lcd.h"
#include "esp8266.h"
// 传感器数据结构体
typedef struct {
float temperature;
float humidity;
uint16_t light;
uint16_t soil_moisture;
} SensorData;
int main(void) {
// 初始化系统时钟和外设
SystemInit();
DHT11_Init();
BH1750_Init();
LCD_Init();
ESP8266_Init();
SensorData data;
while(1) {
// 读取传感器数据
data.temperature = DHT11_Read_Temperature();
data.humidity = DHT11_Read_Humidity();
data.light = BH1750_Read_Light();
data.soil_moisture = Read_Soil_Moisture();
// 显示数据
LCD_DisplayData(&data);
// 上传数据到云平台
ESP8266_SendData(&data);
// 判断是否需要浇水
if(data.soil_moisture < 30) { // 土壤湿度低于30%
Relay_Control(ON); // 打开水泵
Delay_ms(5000); // 浇水5秒
Relay_Control(OFF); // 关闭水泵
}
Delay_ms(5000); // 每5秒采集一次数据
}
}
DHT11的驱动要注意时序问题。这个传感器对时序要求比较严格,读数据前要先发送开始信号,然后等待传感器响应。
// DHT11读取温度函数
float DHT11_Read_Temperature(void) {
uint8_t data[5] = {0};
// 发送开始信号
GPIO_ResetBits(DHT11_GPIO, DHT11_PIN);
Delay_ms(18);
GPIO_SetBits(DHT11_GPIO, DHT11_PIN);
Delay_us(40);
// 等待传感器响应
while(GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN));
while(!GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN));
// 读取40位数据
for(int i=0; i<5; i++) {
for(int j=0; j<8; j++) {
while(!GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN));
Delay_us(30);
if(GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN)) {
data[i] |= (1 << (7-j));
}
while(GPIO_ReadInputDataBit(DHT11_GPIO, DHT11_PIN));
}
}
// 校验数据
if(data[4] == (data[0] + data[1] + data[2] + data[3])) {
return data[2] + data[3] * 0.1;
}
return -1; // 读取失败
}
3. 智能家居温控系统开发
3.1 系统功能设计
这个温控系统可以实现自动和手动两种模式。自动模式下,系统根据温度传感器数据自动控制风扇转速;手动模式下,可以通过手机APP远程控制风扇。两种模式可以随时切换,非常灵活。
温度传感器用的是DS18B20,这个传感器精度比较高,而且只需要一根数据线。风扇控制采用PWM调速,这样可以根据温度变化平滑地调整风扇转速,比简单的开关控制要好用得多。
无线通信还是用ESP8266模块,通过串口与STM32通信。在APP设计方面,可以用MIT App Inventor这样的图形化工具,不需要很深入的Android开发知识就能做出可用的控制界面。
3.2 硬件电路设计
DS18B20的连接很简单,VCC和GND接电源,DATA引脚接STM32的GPIO口,同样需要加上拉电阻。这个传感器支持一线总线,理论上可以同时接多个传感器,不过我们这个系统一个就够了。
风扇控制部分要用到MOS管,因为STM32的IO口不能直接驱动电机。我一般用IRF540这样的MOS管,PWM信号通过MOS管控制风扇的转速。记得在风扇两端反向并联一个二极管,防止电机产生的反向电动势损坏电路。
电源部分要特别注意,电机工作时电流比较大,最好给电机单独供电,不要和单片机共用电源,否则可能会因为电流不足导致单片机重启。
3.3 软件控制逻辑
温度控制采用分段PID算法,不同温度区间使用不同的控制参数。这样既能保证控制精度,又不会让风扇转速变化太剧烈。
// PWM控制函数
void Fan_PWM_Control(float temperature) {
uint16_t pwm_value;
if(temperature < 25.0) {
pwm_value = 0; // 低于25度,风扇停转
}
else if(temperature < 28.0) {
pwm_value = 512; // 25-28度,50%转速
}
else if(temperature < 30.0) {
pwm_value = 768; // 28-30度,75%转速
}
else {
pwm_value = 1023; // 高于30度,全速运转
}
TIM_SetCompare1(TIM3, pwm_value); // 设置PWM占空比
}
DS18B20的驱动程序比DHT11复杂一些,需要严格按照时序图来操作。这个传感器最大的特点是可以每个器件都有唯一的64位序列号,支持多设备挂载在同一条总线上。
// DS18B20温度读取函数
float DS18B20_ReadTemp(void) {
uint8_t temp_l, temp_h;
int16_t temp;
DS18B20_Start(); // 发送开始转换命令
while(!DS18B20_Wait_Convert()); // 等待转换完成
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM命令
DS18B20_WriteByte(0xBE); // 读暂存器命令
temp_l = DS18B20_ReadByte(); // 读取温度低字节
temp_h = DS18B20_ReadByte(); // 读取温度高字节
temp = (temp_h << 8) | temp_l;
return temp * 0.0625; // 转换温度值
}
4. 环境监测系统实现
4.1 多传感器集成
环境监测系统需要同时监测多种参数,比如温湿度、空气质量、光照强度等。这个系统的难点在于如何协调多个传感器的工作,以及如何处理可能出现的传感器数据冲突。
我建议采用分时复用的方式,每个传感器分配不同的时间片来读取数据。比如先读温湿度,延迟一段时间再读光照强度,然后再读空气质量。这样可以避免多个传感器同时工作时产生的干扰。
传感器选型方面,温湿度还是用DHT11,光照用BH1750,空气质量可以用MQ-135传感器。MQ-135可以检测二氧化碳、氨气、苯等多种气体,适合做室内空气质量监测。
4.2 数据上传与显示
监测数据可以通过WiFi上传到云平台,比如OneNet或者阿里云物联网平台。这些平台都提供了免费的基础服务,适合学生使用。上传数据一般采用HTTP或者MQTT协议,ESP8266都支持。
本地显示可以用LCD屏,显示当前各项环境参数的数值。如果某个参数超过设定阈值,比如PM2.5浓度过高,可以点亮LED灯或者启动蜂鸣器报警。
数据存储方面,可以添加一个SD卡模块,定期将监测数据保存到SD卡中。这样即使网络出现问题,数据也不会丢失,后期还可以导出数据进行分析。
4.3 报警功能实现
报警功能分为本地报警和远程报警两种。本地报警就是通过声光方式提醒现场人员,远程报警则是通过APP推送或者短信通知用户。
报警阈值可以根据实际情况设置,比如温度超过30度报警,PM2.5超过75报警等。为了避免误报,可以设置成连续多次检测到超标才触发报警。
// 报警判断函数
void Check_Alarm(SensorData *data) {
static uint8_t alarm_count = 0;
if(data->temperature > 30.0 || data->pm25 > 75) {
alarm_count++;
if(alarm_count >= 3) { // 连续3次超标才报警
Local_Alarm(); // 本地声光报警
Remote_Alarm(); // 远程通知
alarm_count = 0;
}
} else {
alarm_count = 0;
}
}
5. 智能门禁系统设计
5.1 人脸识别方案
智能门禁系统采用人脸识别技术,这个听起来很高大上,但其实现在有很多现成的解决方案。比如可以用OpenMV这样的视觉模块,或者使用离线的人脸识别算法库。
系统工作流程是这样的:当有人靠近时,摄像头采集图像,然后进行人脸检测和识别。如果是已注册的用户,就控制继电器打开门锁;如果是陌生人,就不开门并保存图像。
人脸注册功能也很重要,要能够方便地添加新用户。可以通过按键触发注册模式,然后采集多张不同角度的人脸图像作为训练数据。
5.2 硬件组成
主控还是用STM32,摄像头可以用OV7670这种常用的型号,带FIFO的更好,可以减轻STM32的处理压力。门锁控制用继电器模块,注意要选用能够承受门锁工作电流的继电器。
显示部分可以用OLED屏,显示识别结果和系统状态。还可以加一个按键模块,用于触发注册模式或者删除用户。
电源要稳定可靠,因为门禁系统需要长时间运行。最好有备用电源,比如电池,这样即使停电系统也能正常工作。
5.3 软件算法优化
人脸识别算法可以适当简化,因为STM32的处理能力有限。可以采用特征点匹配的方式,而不是复杂的深度学习算法。虽然准确率可能低一些,但对于毕业设计来说已经足够了。
图像采集和处理要优化效率,比如降低图像分辨率,减少颜色深度等。一帧320x240的灰度图像处理起来就比较适合STM32的性能。
// 人脸识别主循环
void FaceRecognition_Loop(void) {
if(Detect_Person()) { // 检测到有人
Capture_Image(); // 采集图像
if(Face_Detect()) { // 检测到人脸
if(Face_Recognize()) { // 识别成功
Open_Door(); // 开门
Display_Welcome(); // 显示欢迎信息
} else {
Save_Stranger_Image(); // 保存陌生人图像
Display_Denied(); // 显示拒绝信息
}
}
}
Delay_ms(1000); // 每秒检测一次
}
6. 项目答辩与展示技巧
6.1 项目文档准备
毕业设计答辩时,文档质量很重要。论文要写清楚系统设计思路、硬件选型理由、软件架构设计等内容。代码要规范,有足够的注释,方便老师阅读。
系统框图要画得清晰明了,包括硬件连接图和软件流程图。实物照片要多角度拍摄,展示整体和细节。性能测试数据要真实可靠,最好有图表对比。
演示PPT要简洁扼要,突出重点。不要堆砌太多文字,多用图片和图表。提前演练讲解过程,控制好时间,一般答辩时间都在10-15分钟左右。
6.2 实物演示要点
实物演示是答辩的关键环节。要确保系统稳定可靠,提前测试各种情况。准备好备用方案,万一某个功能临时出问题,可以快速切换。
演示时要有条理,先介绍系统功能,再演示实际操作。操作过程要流畅,展示系统的响应速度和处理能力。可以准备一些典型场景,比如模拟温度变化展示自动控制效果。
注意展示创新点,比如你自己优化的算法、改进的电路设计等。这些都是加分项,能够体现你的工作量和思考深度。
6.3 问答准备
提前预测老师可能问的问题,并准备好答案。常见的问题包括:为什么选择这个方案、有什么创新点、遇到了什么困难怎么解决的、系统还有什么改进空间等。
回答时要自信
更多推荐
所有评论(0)