这个Arduino智能居家监测系统是我去年为父母家改造的一个实用项目。起因是老爷子总忘记关阳台门,导致冬天暖气费飙升;同时老房子水管老化,发生过一次漏水事故。市面上的智能家居产品要么功能单一,要么价格昂贵,于是决定用Arduino自己搭建一套多功能监测系统。
核心功能实现:
整套系统成本不到200元,但实现了商业产品上千元的功能组合。最让我满意的是扩展性——后期陆续增加了燃气检测和红外人体感应模块,全部通过同一个Arduino主板控制。
对比了几种常见方案:
最终选择Arduino Nano,理由:
注意:购买时要选CH340G芯片版本,比FT232更稳定且便宜
选择DHT22因为:
接线方式:
arduino复制DHT22引脚 | Arduino连接
VCC | 3.3V(注意不要接5V!)
DATA | D2(需接4.7K上拉电阻)
GND | GND
测试了三种方案:
选择SW-420因为:
安装技巧:
采用分级报警策略:
蜂鸣器驱动电路:
arduino复制void setup() {
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, HIGH); // 初始高电平关闭
}
void alarm() {
for(int i=0; i<5; i++) {
digitalWrite(buzzerPin, LOW);
delay(200);
digitalWrite(buzzerPin, HIGH);
delay(200);
}
}
关键点:一定要用NPN三极管驱动蜂鸣器(如S8050),IO口直接驱动可能烧毁主板!
常见问题:DHT22读取失败率高
解决方案:加入异常处理和多次读取
arduino复制float readDHT22() {
int retry = 0;
while(retry < 3) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
return t, h;
}
delay(100);
retry++;
}
Serial.println("DHT22读取失败!");
return NAN;
}
不使用RTOS的情况下,通过状态机实现多任务:
arduino复制unsigned long previousMillis = 0;
const long interval = 2000; // 2秒采样间隔
void loop() {
unsigned long currentMillis = millis();
// 温湿度采样
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
readSensors();
}
// 检查报警
checkAlarms();
// 处理网络请求
if (WiFi.available()) {
handleClient();
}
}
通过Server酱实现免费微信通知:
arduino复制void sendWechat(String msg) {
WiFiClient client;
if (client.connect("sc.ftqq.com", 80)) {
String url = "/YOUR_KEY.send?text=" + URLEncode(msg);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: sc.ftqq.com\r\n" +
"Connection: close\r\n\r\n");
delay(10);
}
}
实测延迟在2-5秒,比邮件通知更及时
经过三个月的实测优化,推荐如下安装位置:
| 传感器类型 | 最佳安装位置 | 安装高度 |
|---|---|---|
| DHT22 | 客厅中央远离窗户和空调 | 1.5米 |
| 门窗磁簧 | 门框上沿(防破坏) | 2.2米 |
| 漏水检测 | 卫生间地漏旁+厨房水槽下方 | 地面 |
| 震动传感器 | 窗户对角线位置(灵敏度最高) | 窗框 |
系统采用5V/2A电源适配器供电,但遇到两个问题:
解决方案:
实测功耗:
现象:偶尔返回-999或异常高值
排查步骤:
震动传感器误触发解决方案:
arduino复制if (digitalRead(vibrationPin) == LOW) {
delay(50); // 消抖
if (digitalRead(vibrationPin) == LOW) {
triggerAlarm();
}
}
ESP8266频繁断连的优化措施:
arduino复制AT+CWJAP="SSID","PWD",1,0,0,1000
// 最后一个参数调大扫描时间
arduino复制void checkWiFi() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
WiFi.begin(ssid, password);
}
}
新增MQ-2/MQ-5燃气传感器:
arduino复制int gasValue = analogRead(A6);
if (gasValue > 650) { // 阈值需实测调整
sendWechat("燃气泄漏警报!浓度:" + String(gasValue));
}
校准技巧:
添加HC-SR501模块实现:
arduino复制void setup() {
pinMode(PIR_PIN, INPUT);
}
void loop() {
if (digitalRead(PIR_PIN) == HIGH) {
if (!motionDetected) {
sendWechat("检测到人员活动");
motionDetected = true;
}
} else {
motionDetected = false;
}
}
安装要点:
通过EasyIoT平台实现:
arduino复制void uploadData() {
String url = "/device/update?ID=123&key=abc&temp=";
url += String(temperature);
client.print(url);
}
成本效益分析:整套系统加上扩展功能后,相当于实现了市面3000元级智能家居主机80%的功能,而硬件成本仅280元(含备用电源)。最耗时的部分是传感器位置调试,建议先用临时支架测试一周再固定安装。