1. 项目背景与核心价值
智能家居环境检测系统是当前物联网领域的热门应用方向。作为一名长期从事嵌入式开发的工程师,我发现传统环境监测方案存在几个痛点:一是商业系统价格昂贵,二是扩展性差,三是数据可视化程度低。这个基于SpringBoot和Arduino的设计方案,正好能解决这些实际问题。
Arduino作为开源硬件平台,成本低廉且生态丰富,非常适合用来采集温湿度、光照等环境数据。而SpringBoot后端则提供了稳定可靠的数据处理和展示能力。两者结合,既能保证系统的实时性,又能实现数据的长期存储和分析。我在实际项目中多次采用这种架构,稳定性完全可以满足家庭和小型办公场所的需求。
2. 系统架构设计
2.1 硬件选型与传感器配置
核心硬件采用Arduino Uno R3开发板,这是经过市场验证的成熟方案。传感器配置建议:
- DHT22温湿度传感器(精度±0.5℃,±2%RH)
- BH1750光照传感器(量程0-65535 lux)
- MQ-2烟雾传感器(可检测LPG、烟雾等)
- 蜂鸣器模块(用于超标报警)
特别注意:DHT22需要上拉电阻,接线时VCC与DATA引脚间要接4.7KΩ电阻。我在初期测试时曾因忽略这点导致数据异常。
2.2 软件架构设计
系统采用三层架构:
- 感知层:Arduino负责数据采集,通过串口发送JSON格式数据
- 传输层:USB/蓝牙/WiFi(根据需求选择)
- 应用层:SpringBoot实现:
- 数据接收(SerialPort API)
- 业务处理(阈值判断、报警逻辑)
- 数据存储(MySQL)
- 可视化(ECharts)
3. 关键实现细节
3.1 Arduino固件开发
核心采集代码示例:
cpp复制#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor error!");
return;
}
String json = "{\"temp\":" + String(t) +
",\"humi\":" + String(h) + "}";
Serial.println(json);
delay(2000);
}
3.2 SpringBoot后端实现
3.2.1 串口数据接收
使用RXTX库实现串口通信:
java复制@Configuration
public class SerialConfig {
@Bean
public SerialPort serialPort() throws Exception {
Enumeration<CommPortIdentifier> ports =
CommPortIdentifier.getPortIdentifiers();
while (ports.hasMoreElements()) {
CommPortIdentifier port = ports.nextElement();
if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) {
SerialPort serial = (SerialPort) port.open(
"ArduinoComm", 2000);
serial.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
return serial;
}
}
throw new RuntimeException("Arduino not found");
}
}
3.2.2 数据持久化设计
建议采用时间序列数据库存储方案:
java复制@Entity
public class EnvData {
@Id
@GeneratedValue
private Long id;
private Float temperature;
private Float humidity;
private Float light;
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
// getters & setters
}
4. 系统优化与问题排查
4.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 数据跳变 | 传感器接触不良 | 检查接线,使用热熔胶固定 |
| 串口连接失败 | 端口被占用 | 重启IDE或使用lsof -t /dev/tty*查杀进程 |
| 数据延迟 | 采样间隔过短 | 调整Arduino的delay(2000)参数 |
4.2 性能优化建议
- 数据压缩传输:将JSON改为二进制协议,可减少70%传输量
- 批量写入:SpringBoot侧采用JPA的批量插入(hibernate.jdbc.batch_size)
- 前端轮询优化:用WebSocket替代HTTP轮询
5. 扩展功能实现
5.1 微信小程序对接
通过SpringBoot暴露REST API:
java复制@RestController
@RequestMapping("/api/env")
public class EnvController {
@Autowired
private EnvDataRepository repository;
@GetMapping("/current")
public EnvData getCurrent() {
return repository.findTopByOrderByCreateTimeDesc();
}
@GetMapping("/history")
public List<EnvData> getHistory(@RequestParam String period) {
// 按时间段查询逻辑
}
}
5.2 异常报警功能
基于Spring Scheduler的定时检查:
java复制@Scheduled(fixedRate = 300000)
public void checkThreshold() {
EnvData data = repository.findTopByOrderByCreateTimeDesc();
if (data.getTemperature() > 30) {
smsService.sendAlert("温度超标:" + data.getTemperature());
}
}
6. 项目部署实践
6.1 硬件部署要点
-
传感器分布策略:
- 温湿度传感器远离门窗和空调出风口
- 光照传感器避免直射阳光
- 烟雾传感器安装在厨房天花板
-
供电方案选择:
- 测试阶段可用USB供电
- 长期使用建议9V电源适配器
6.2 软件部署方案
推荐使用Docker compose部署:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
在开发过程中,我特别建议先使用Arduino IDE的串口监视器验证传感器数据,再逐步接入SpringBoot系统。这种分步验证的方法能快速定位问题所在。比如有一次温湿度数据异常,通过单独测试Arduino端,发现是DHT22的采样间隔设置不当导致。
