Python实现连接土壤湿度传感器(或液位传感器)并实现手机报警。
2026/7/12 8:42:09 网站建设 项目流程

两种方案

方案一: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秒以上的持续淹没判断,避免雨水瞬间滴落误报

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询