1. 项目背景与设计思路

室内环境监测系统是当前物联网应用中的一个热门方向,尤其适合作为毕业设计项目。基于STM32的开发方案不仅成本低、性能强,而且生态完善,资料丰富,非常适合学生上手。我在实际项目中多次使用STM32开发各种物联网设备,发现它最大的优势在于稳定性和灵活性,既能满足复杂的数据采集需求,又能在低功耗模式下长时间工作。

这个项目的主要目标是构建一个能够实时监测室内温湿度、空气质量、烟雾浓度和一氧化碳含量的系统,并通过Wi-Fi将数据上传到云平台,最终在手机APP上展示。整个系统涉及硬件选型、电路设计、嵌入式编程、通信协议和移动端开发,是一个典型的全栈式物联网项目。

在设计初期,我们需要明确系统的核心功能:数据采集、数据处理、数据传输和数据展示。数据采集部分依赖多种传感器,如DHT11(温湿度)、MQ-135(空气质量)、MQ-2(烟雾)和MQ-7(一氧化碳)。数据处理由STM32完成,包括ADC转换、数据滤波和阈值判断。数据传输通过ESP8266 Wi-Fi模块实现,将数据发送到云平台(如机智云)。数据展示则通过Android APP实现,用户可以在手机上实时查看环境数据并接收报警信息。

2. 硬件选型与传感器配置

2.1 STM32主控芯片选择

STM32F103C8T6是意法半导体推出的一款基于ARM Cortex-M3内核的微控制器,具有64KB Flash和20KB RAM,运行频率可达72MHz。这款芯片的性价比极高,价格通常在10元左右,但性能足够应对大多数物联网应用。我实际测试过它的ADC采集速度和GPIO控制能力,发现其响应速度非常快,能够同时处理多个传感器的数据输入。

除了性能之外,STM32F103C8T6的生态也非常完善。有丰富的库函数和例程可供参考,开发工具(如Keil MDK)也对其有很好的支持。对于初学者来说,这些资源可以大大降低开发难度。

2.2 温湿度传感器DHT11

DHT11是一款数字温湿度传感器,通过单总线协议与主控芯片通信。它的测量范围是20-90%RH(湿度)和0-50°C(温度),精度为±5%RH和±2°C。虽然精度不是最高,但对于室内环境监测来说已经完全够用。

在实际使用中,DHT11的响应速度较快,一次完整的数据采集仅需4毫秒。需要注意的是,它的单总线协议对时序要求比较严格,如果程序中有其他中断干扰,可能会导致数据读取失败。我在项目中通常会在读取数据时暂时关闭其他中断,以确保通信的稳定性。

2.3 气体传感器选型

MQ-135是一款通用空气质量传感器,对氨气、硫化物和苯系蒸汽有较高的灵敏度。MQ-2主要用于检测烟雾和可燃气体,而MQ-7则专注于一氧化碳检测。这三款传感器都是基于半导体气敏原理,输出模拟信号,需要通过STM32的ADC模块进行采集。

这些传感器的优点是价格低廉(每颗不到10元),但缺点是需要预热时间和定期校准。在实际使用中,我通常会让系统先运行几分钟,待传感器稳定后再开始数据采集。此外,它们的输出受环境影响较大,因此需要软件滤波算法来提高数据的准确性。

2.4 Wi-Fi模块ESP8266

ESP8266是一款超低成本的Wi-Fi模块,支持802.11 b/g/n协议,内置TCP/IP协议栈。我们可以通过AT指令或直接编程(NodeMCU固件)来控制它。在项目中,我通常使用AT指令模式,因为它简单易用,不需要额外的固件开发。

ESP8266的功耗较低,在连续工作时的电流约为70mA,而在睡眠模式下可降至1mA以下。对于电池供电的应用,可以通过定时唤醒的方式进一步降低功耗。

3. 电路设计与PCB制作

3.1 最小系统电路设计

STM32F103C8T6的最小系统包括电源电路、复位电路、时钟电路和调试接口。电源电路需要提供3.3V电压,可以使用AMS1117-3.3稳压芯片从5V电源转换而来。复位电路通常是一个简单的RC电路,加上一个手动复位按钮。时钟电路包括8MHz的外部晶振和两个负载电容,这是STM32正常运行所必需的。

调试接口推荐使用SWD(Serial Wire Debug),它只需要两根线(SWDIO和SWCLK)就能实现调试和程序下载,比传统的JTAG接口更节省引脚。

3.2 传感器接口电路

DHT11的接口很简单,只需要一个GPIO引脚和上拉电阻。气体传感器(MQ-135、MQ-2、MQ-7)则需要连接到STM32的ADC引脚,并加上适当的滤波电路。我在实际项目中发现,添加一个简单的RC低通滤波电路(如10kΩ电阻和100nF电容)可以显著减少噪声干扰。

ESP8266模块的接口也很简单,只需要连接VCC、GND和两个串口引脚(TX、RX)。需要注意的是,ESP8266的工作电压是3.3V,不能直接与5V系统连接,否则可能会损坏模块。

3.3 PCB设计与制作

电路设计完成后,可以使用Altium Designer或KiCad等工具绘制PCB。对于初学者来说,我推荐使用立创EDA,它是在线工具,学习成本低,而且可以直接在嘉立创下单制作PCB。

在PCB布局时,要注意将模拟电路和数字电路分开,减少相互干扰。电源线要尽量宽,以减少电压降。信号线要避免直角转弯,最好使用45度角或圆弧过渡。

PCB制作完成后,需要仔细检查是否有短路或断路。我通常会用万用表的导通档检查所有电源网络和地网络,确保没有短路后再焊接元件。

4. 嵌入式程序开发

4.1 开发环境搭建

STM32的程序开发通常使用Keil MDK或STM32CubeIDE。我个人更喜欢Keil,因为它界面简洁,调试功能强大。安装Keil后,还需要安装STM32F1系列的设备支持包(DFP),这样才能识别和编程STM32F103C8T6。

除了IDE,还需要一个调试器,如ST-Link或J-Link。ST-Link价格便宜(约20元),而且完全兼容STM32系列芯片。

4.2 传感器数据采集程序

DHT11的读取程序需要严格按照时序图编写。首先拉低数据线至少18毫秒,然后拉高20-40微秒,之后切换到输入模式等待DHT11的响应。DHT11会先拉低80微秒,再拉高80微秒,然后开始发送40位数据。

气体传感器的读取相对简单,只需要初始化ADC模块,然后定期读取ADC值即可。需要注意的是,ADC值需要转换为实际的气体浓度,这个转换公式通常需要根据传感器的数据手册和实际测试来确定。

4.3 数据处理与滤波算法

传感器采集的原始数据通常包含噪声,需要进行滤波处理。我通常使用滑动平均滤波或中值滤波算法。滑动平均滤波的实现很简单,只需要维护一个数据缓冲区,每次取平均值即可。

对于阈值判断,我建议添加 hysteresis(迟滞)功能,避免在阈值附近频繁切换状态。例如,当温度超过30°C时触发报警,但只有在温度降到28°C以下时才解除报警。

4.4 Wi-Fi通信程序

ESP8266通过AT指令进行控制。首先需要发送"AT"指令测试模块是否正常,然后配置Wi-Fi模式(STA模式)、连接路由器,最后建立TCP连接与云平台通信。

在实际使用中,我发现ESP8266偶尔会断开连接,因此需要添加重连机制。我通常会在程序中定期检查连接状态,如果发现断开就重新初始化连接过程。

5. 云平台与移动端开发

5.1 云平台选择与配置

机智云是一个免费的物联网云平台,支持多种设备接入和数据可视化。注册账号后,创建一个新产品,定义数据点(如温度、湿度、烟雾浓度等),平台会自动生成设备密钥和通信协议。

云平台的主要作用是接收设备数据并转发给手机APP。它还可以存储历史数据,支持数据分析和报警规则设置。

5.2 Android APP开发

APP开发可以使用Android Studio,配合机智云提供的SDK。SDK封装了与云平台通信的细节,我们只需要关注界面设计和业务逻辑。

主界面通常显示当前的环境数据和历史曲线图。数据更新可以通过定时轮询或推送机制实现。推送机制的实时性更好,但实现起来稍微复杂一些。

报警功能可以通过通知(Notification)实现。当云平台检测到数据超过阈值时,会发送报警信息给APP,APP收到后显示通知并播放提示音。

5.3 数据安全与用户认证

物联网设备的安全性经常被忽视,但在实际项目中非常重要。机智云平台提供了设备认证机制,每个设备都有唯一的密钥,只有通过认证的设备才能上传数据。

在APP端,用户需要登录后才能查看数据。机智云SDK提供了用户管理功能,包括注册、登录和密码重置等。

6. 系统调试与优化

6.1 硬件调试技巧

硬件调试的第一步是检查电源电压。我通常会用万用表测量3.3V和5V电源是否稳定,纹波是否在允许范围内。如果电源有问题,后续的调试都是徒劳。

接下来检查晶振是否起振。可以用示波器测量晶振引脚的波形,正常应该是正弦波或近似方波,频率为8MHz。

传感器部分可以先单独测试,比如用打火机测试MQ-2的响应,用哈气测试DHT11的湿度变化。这样可以快速定位是硬件问题还是软件问题。

6.2 软件调试方法

Keil提供了强大的调试功能,可以设置断点、单步执行、查看变量和寄存器值。我通常会在关键函数设置断点,比如数据采集完成时和Wi-Fi发送数据时。

串口打印是另一个有用的调试手段。可以在程序中添加调试信息,通过串口输出到电脑,这样可以实时了解程序的运行状态。

6.3 功耗优化策略

对于电池供电的系统,功耗优化非常重要。STM32有多种低功耗模式,如睡眠模式、停机和待机模式。在数据采集间隔期间,可以让STM32进入睡眠模式,仅保留RTC工作。

ESP8266的功耗也比较高,可以通过定时唤醒的方式降低平均功耗。例如,每5分钟唤醒一次,上传数据后立即进入睡眠模式。

传感器也可以根据需要开启和关闭。比如气体传感器需要预热,可以一直供电,而温湿度传感器可以在采集时再上电。

7. 常见问题与解决方案

7.1 传感器数据不准怎么办

传感器数据不准可能是由于校准不当或环境干扰。首先尝试重新校准传感器,比如将温湿度传感器放在已知环境中(如饱和盐溶液)进行校准。

对于气体传感器,需要注意交叉敏感问题。比如MQ-2对酒精也很敏感,如果环境中有酒精,可能会导致误报。可以通过软件算法或使用多个传感器相互验证来减少误报。

7.2 Wi-Fi连接不稳定怎么办

Wi-Fi连接不稳定可能是信号弱或路由器配置问题。尝试调整ESP8266的天线位置,或者添加外部天线。也可以尝试降低通信速率,提高稳定性。

在软件层面,可以添加重连机制和心跳包。如果检测到连接断开,自动重新连接;定期发送心跳包,保持连接活跃。

7.3 系统功耗过高怎么办

首先测量各部分的功耗,确定耗电大户。可以使用电流表串联在电源回路中,分别测量不同工作状态下的电流。

对于耗电大的部分,可以考虑优化工作策略。比如减少数据采集频率,使用更高效的通信协议,或者更换低功耗的替代器件。

7.4 手机APP收不到报警通知

首先检查设备是否正常上传数据到云平台,然后检查云平台的报警规则设置是否正确。在APP端,需要检查通知权限是否开启,以及后台服务是否被系统杀死。

可以在APP中添加日志功能,记录通知接收情况,这样便于排查问题。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐