1. 项目概述
这个公厕使用状态显示系统是我去年指导的一个本科毕业设计项目,当时学生想做一个既实用又有技术含量的物联网应用。我们最终选择了公厕管理这个看似简单但实际很有价值的场景。系统通过传感器网络实时监测厕所使用状态和环境参数,不仅解决了排队秩序问题,还能自动改善卫生条件。
核心思路很简单:用红外传感器检测是否有人,用气体传感器监测空气质量,所有数据通过WiFi上传云端,同时本地OLED屏幕显示实时状态。听起来不复杂对吧?但在实际开发中,从传感器选型到云端对接,每个环节都藏着不少"坑"。下面我就把这个项目从硬件选型到软件实现的完整过程拆解给大家,特别是那些在论文里不会写的实战经验。
2. 硬件设计与选型
2.1 主控制器选择
我们选用了STM32F103C8T6作为主控,也就是大家常说的"蓝 pill"开发板。这个选择基于几个考虑:
- 性价比高:20元左右的价位,学生项目完全负担得起
- 生态完善:有丰富的库函数和开发资料
- 性能足够:72MHz主频,20KB RAM,完全能满足我们的需求
注意:市面上有些便宜的STM32开发板用的是国产兼容芯片,虽然便宜但稳定性可能有问题。建议毕业设计还是用正版ST芯片的开发板,避免调试时出现莫名其妙的问题。
2.2 传感器选型与电路设计
2.2.1 人体检测方案
测试了三种方案后,我们最终选择了HC-SR501红外热释电传感器:
- 超声波传感器:易受环境干扰,误触发率高
- 激光对射式:安装复杂,需要精确对准
- HC-SR501:性价比高(15元/个),探测距离可调(3-7米)
实际安装时有个重要细节:传感器要朝下倾斜约30度安装,避免检测到隔间外经过的人。我们最初垂直安装时就出现了很多误检测。
2.2.2 气体检测方案
臭味检测用的是MQ-135气体传感器,主要检测NH3和硫化物等异味气体。这里有几个关键点:
- 需要预热:上电后要预热24小时以上读数才稳定
- 需要定期校准:我们每周用标准气体校准一次
- 安装位置:要离地30-50cm,避开直接通风口
传感器电路设计时记得加一个电位器用于灵敏度调节,我们用的电路参数如下:
c复制// MQ-135电路参数
VCC ----[10KΩ]---- A0
|
[MQ-135]
|
GND
2.3 显示与执行模块
2.3.1 OLED显示
选用0.96寸I2C接口的OLED屏幕,分辨率128x64。显示内容分三个区域:
- 顶部:坑位状态(有人/无人图标)
- 中部:当前使用时长(分钟:秒)
- 底部:空气质量等级(良好/一般/差)
2.3.2 通风控制
用5V小风扇作为执行机构,通过MOS管驱动。选型时要注意:
- 风量:≥0.5m³/min(我们用的5015风扇)
- 噪音:<40dB(实测35dB基本听不见)
- 电路要加续流二极管保护MOS管
3. 软件系统设计
3.1 主程序流程图
系统软件采用前后台架构,主循环处理显示和通信,中断处理传感器数据。下面是简化版的主程序逻辑:
c复制void main() {
hardware_init(); // 硬件初始化
wifi_connect(); // 连接WiFi
while(1) {
read_sensors(); // 读取传感器
update_display();// 刷新显示
check_fan(); // 检查风扇状态
upload_data(); // 上传云端
delay_ms(200); // 适当延时
}
}
3.2 关键算法实现
3.2.1 使用时长计算
采用定时器中断实现精准计时,每1秒更新一次:
c复制// 定时器中断服务函数
void TIM2_IRQHandler() {
if(TIM_GetITStatus(TIM2, TIM_IT_Update)) {
if(occupied) { // 如果坑位有人
seconds++;
if(seconds >= 60) {
seconds = 0;
minutes++;
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
3.2.2 臭味检测算法
MQ-135的原始ADC值需要转换为ppm浓度。我们采用的公式是:
code复制Rs/R0 = 9.83 * (ppm)^-0.526
其中:
- Rs = 传感器电阻
- R0 = 清洁空气中的电阻(需预先测量)
实际代码实现:
c复制float get_gas_ppm() {
float sensor_volt = adc_read() * 3.3 / 4095.0;
float RS = (3.3 - sensor_volt) / sensor_volt * RL; // RL=10K
float ratio = RS / R0;
return pow(ratio / 9.83, -1/0.526);
}
3.3 WiFi通信实现
使用ESP8266-01模块通过AT指令连接云端。关键配置步骤:
- 设置STA模式:AT+CWMODE=1
- 连接路由器:AT+CWJAP="SSID","password"
- 建立TCP连接:AT+CIPSTART="TCP","api.xxx.com",80
数据上传采用HTTP POST,格式示例:
code复制POST /api/sensor HTTP/1.1
Host: api.xxx.com
Content-Type: application/json
{"toilet_id":1, "occupied":true, "duration":125, "air":56}
4. 云端平台设计
4.1 数据存储结构
使用MySQL设计了一个简单的数据表结构:
sql复制CREATE TABLE toilet_data (
id INT AUTO_INCREMENT,
toilet_id INT,
occupied BOOLEAN,
duration INT,
air_quality INT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
);
4.2 可视化界面
用ECharts实现了三个主要图表:
- 实时状态面板:显示当前占用情况和空气质量
- 使用频率统计:按小时/天统计厕所使用高峰
- 空气质量趋势:显示最近24小时的气体浓度变化
5. 实际部署与优化
5.1 安装注意事项
在公厕实际部署时遇到了几个问题:
- 红外传感器被阳光直射导致误触发 → 加装遮光罩解决
- WiFi信号不稳定 → 改用外置天线模块
- 气体传感器受潮 → 涂覆三防漆保护
5.2 参数调优经验
经过两周的实地测试,我们确定了以下最佳参数:
- 臭味阈值:35ppm(超过即启动风扇)
- 风扇运行时间:至少5分钟(确保充分换气)
- 数据上传间隔:30秒(平衡实时性和功耗)
6. 常见问题排查
6.1 传感器读数异常
现象:MQ-135读数忽高忽低
可能原因:
- 供电不稳 → 检查3.3V电源纹波
- 未充分预热 → 确保预热24小时以上
- 传感器老化 → 使用寿命约1年
6.2 WiFi频繁断开
现象:ESP8266经常掉线
解决方法:
- 增加心跳包(每60秒发送AT指令)
- 设置自动重连:AT+CIPRECONNINTV=1000
- 检查路由器设置,关闭省电模式
6.3 OLED显示残影
现象:切换画面时有残留影像
解决方案:
- 每次更新前清屏:OLED_Clear()
- 降低刷新率:从60Hz降到30Hz
- 避免长时间显示静态内容
这个项目从设计到部署用了3个月时间,最大的收获是认识到物联网系统在实际环境中的复杂性远超过实验室测试。比如我们没想到公厕的潮湿环境对电子设备的腐蚀这么严重,后来所有电路板都做了防水处理。还有WiFi信号在钢筋混凝土结构中的衰减问题,最终不得不调整天线位置。