两种方案
方案一:ESP8266/ESP32 + 阿里云物联网(推荐,稳定可靠)
```cpp
#include <ESP8266WiFi.h>
#include <AliyunIoTSDK.h>
// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// 阿里云配置
#define PRODUCT_KEY "你的ProductKey"
#define DEVICE_NAME "你的DeviceName"
#define DEVICE_SECRET "你的DeviceSecret"
#define REGION_ID "cn-shanghai"
// 传感器引脚
#define SENSOR_PIN A0 // 模拟输入
#define THRESHOLD 300 // 淹没阈值(根据实际传感器校准)
// 淹没计时
unsigned long floodStartTime = 0;
bool isFlooding = false;
const unsigned long FLOOD_DELAY = 5000; // 持续淹没5秒后报警
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("连接WiFi中...");
}
Serial.println("WiFi已连接");
// 连接阿里云
AliyunIoTSDK::begin(REGION_ID, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
}
void loop() {
AliyunIoTSDK::loop();
int sensorValue = analogRead(SENSOR_PIN);
bool currentlyFlooded = (sensorValue > THRESHOLD);
if (currentlyFlooded) {
if (!isFlooding) {
floodStartTime = millis();
isFlooding = true;
}
// 持续淹没超过设定时间,发送报警
if (millis() - floodStartTime > FLOOD_DELAY) {
sendAlert("⚠️ 传感器被液体淹没!请检查!");
// 上报到阿里云
AliyunIoTSDK::send("alert", 1);
floodStartTime = millis(); // 防止重复发送
}
} else {
isFlooding = false;
if (sensorValue < THRESHOLD - 50) { // 恢复阈值带滞回
AliyunIoTSDK::send("alert", 0);
}
}
delay(100);
}
// 通过微信公众号/钉钉等推送
void sendAlert(String message) {
Serial.println(message);
// 这里可以调用第三方推送服务,如:钉钉机器人、Server酱等
}
```
---
方案二:Arduino + 蓝牙模块 + 手机APP(简单本地报警)
硬件:Arduino Nano + HC-05蓝牙模块 + 土壤湿度传感器
```cpp
#include <SoftwareSerial.h>
// 蓝牙模块引脚
#define BLUETOOTH_TX 10
#define BLUETOOTH_RX 11
SoftwareSerial BTSerial(BLUETOOTH_TX, BLUETOOTH_RX);
#define SENSOR_PIN A0
#define THRESHOLD 400
#define FLOOD_DELAY 3000 // 持续3秒报警
unsigned long floodStart = 0;
bool flooding = false;
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(SENSOR_PIN, INPUT);
Serial.println("系统启动,等待传感器数据...");
}
void loop() {
int value = analogRead(SENSOR_PIN);
bool isWet = (value > THRESHOLD);
if (isWet) {
if (!flooding) {
floodStart = millis();
flooding = true;
}
if (millis() - floodStart > FLOOD_DELAY) {
// 发送报警(通过蓝牙或串口)
String alert = "ALERT: 传感器被淹没! 湿度值=" + String(value);
BTSerial.println(alert); // 发送到手机APP
Serial.println(alert);
// 手机端APP(如:蓝牙串口助手)收到"ALERT"关键字触发通知
floodStart = millis(); // 重置,防止刷屏
}
} else {
flooding = false;
}
// 定期发送状态
static unsigned long lastSend = 0;
if (millis() - lastSend > 10000) {
BTSerial.println("STATUS:" + String(value));
lastSend = millis();
}
delay(200);
}
```
---
手机端报警接收方式
方式 优点 缺点
阿里云+钉钉机器人 稳定、不限距离 需联网配置
蓝牙串口APP 无需网络 距离短(10米内)
Bark/Server酱 推送直达手机 依赖第三方服务
GSM模块(SIM800) 无网也可用 需SIM卡和流量
---
硬件连接注意事项
1. 传感器校准:干土和淹没时的ADC值差异很大,建议用 analogRead() 测出实际值再设阈值
2. 供电稳定:传感器插入土壤后可能电解腐蚀,建议使用电容式传感器更耐用
3. 防误触:设置5秒以上的持续淹没判断,避免雨水瞬间滴落误报