新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 智能盆栽 IoT 自动浇水系统(含完整代码)

智能盆栽 IoT 自动浇水系统(含完整代码)

作者: 时间:2025-11-17 来源: 收藏


摘要(Abstract)

本项目设计并实现了一套基于 Particle Photon 2 的智能室内自动浇水系统。系统集成土壤湿度、温湿度、气压与空气质量传感器,实现对植物生长环境的实时监测;数据不仅通过 OLED 屏幕本地显示,还同步上传至 Adafruit IO 实现远程监控与手动浇水控制。同时,系统采用 NPN 晶体管 + 继电器驱动方式实现安全可靠的自动浇水功能,并支持 Zapier 邮件告警。

本报告包含系统架构、硬件设计、软件逻辑、云端集成、机械结构、测试分析,并附录完整可运行的源代码。


1. 引言(Introduction)

人工浇水常因经验不足而造成过度浇水或缺水,影响植物健康。通过 IoT(Internet of Things)技术,可以实现植物环境的实时量化监测自动化浇水控制。本项目旨在构建一个结构完整、功能稳定、外观整洁的智能植物护理系统,适合课程作业、工程展示或进一步产品化。

系统核心功能包括:

  • 自动检测土壤湿度并精准浇水

  • OLED 实时显示环境状态

  • Adafruit IO 云端监控与控制

  • Zapier 邮件告警

  • 基于 3D 打印的整洁机构结构


2. 系统架构(System Architecture)

系统由感知层、控制层、执行层与云端层构成,下图为整体架构概念(示意):

 Sensors ──┐
           │ Soil Moisture
           │ BME280 (Temp/Humidity/Pressure)
           │ Air Quality
           ▼
 ┌──────────────────────────┐
 │     Particle Photon 2     │
 │  - Sensor acquisition      │
 │  - OLED display            │
 │  - Cloud publish/subscribe│
 │  - Watering logic          │
 └───────┬───────────────┬──┘
         │               │
         ▼               ▼
  OLED Display      Adafruit IO Cloud
                   (Dashboard + Manual Control)
                         │
                         ▼
                   Zapier Email Alerts
                         │
                         ▼
                Relay + NPN Driver
                         │
                         ▼
                       Pump

3. 硬件设计(Hardware Design)

3.1 组件清单

组件功能
Particle Photon 2主控 + Wi-Fi
BME280温度 / 湿度 / 气压传感器(I²C)
土壤电容式湿度传感器土壤含水量监测
Grove Air QualityVOC 类空气质量趋势监测
0.96" OLED本地显示
NPN + Relay控制水泵
Micro Water Pump脉冲定量浇水
3D 打印外壳集成结构

3.2 水泵驱动电路

为保护主控并提升可靠性,采用“NPN 晶体管 + 继电器隔离驱动”:

  • Photon GPIO → 电阻 → NPN Base

  • NPN → 驱动继电器线圈

  • Relay → 切换水泵的电源回路

这种方式避免水泵启动浪涌直接影响 MCU。


4. 软件设计(Software Design)

主程序需完成:

  1. 读取传感器数据(土壤、BME280、空气质量)

  2. OLED 屏显示实时信息

  3. 自动浇水逻辑(<30% 时浇水 0.5 秒)

  4. 上传数据到 Adafruit IO

  5. 接收云端手动浇水命令

  6. 防抖、节流、错误检查

核心逻辑流程:

START
 ├─ 读取土壤湿度
 ├─ 读取环境(温湿度、气压、空气质量)
 ├─ OLED 显示
 ├─ 上传数据到 Adafruit IO
 ├─ IF 土壤湿度 < 阈值 → 自动浇水
 ├─ IF 云端按钮触发 → 手动浇水
 └─ 重复循环

5. 云端架构(Cloud Integration)

5.1 Adafruit IO

上传数据:

  • soil_moisture

  • temperature

  • humidity

  • pressure

  • air_quality

用户可通过 Dashboard:

  • 查看传感器趋势

  • 点击按钮远程浇水(调用 cloud function)

5.2 Zapier 邮件告警

例如:

  • 土壤湿度持续过低

  • 系统异常

  • 长时间无浇水记录

Zapier 可自动推送邮件。


6. 机械结构(Mechanical / Enclosure Design)

整个系统通过 3D 打印件完成结构集成:

  • 花盆托架:固定盆栽

  • 水箱腔体:容纳水泵与水源

  • 控制仓:Photon 2 + Relay + OLED

  • 传感器安装孔:保证监测准确性

最终机身整洁、紧凑、美观,适合桌面摆放或展示。


7. 测试与验证(Testing & Validation)

测试项目:

  • 湿度采集稳定性

  • 自动浇水触发可靠性

  • 云端响应时延(0.3–1.2s)

  • OLED 离线可用性

  • 连续运行稳定性

系统能够持续工作,并有效保持植物土壤湿度在合理区间。


8. 结论(Conclusion)

本项目成功构建了一套实用、可扩展且稳定的 IoT 智能浇水系统。该系统融合了:

  • 自动化土壤湿度管理

  • 本地与云端双重监控

  • 安全可靠的执行机构

  • 可模块化扩展的结构设计

未来可扩展方向:

  • 多通道浇水系统

  • 加入光照传感器

  • 使用太阳能供电

  • 添加数据驱动的浇水预测模型(ML)


附录 A:完整系统源代码(Full System Source Code)

以下代码为本项目完整可运行的主程序,可直接在 Particle Photon 2 上部署。

/***************************************************
 * IoT Automated Watering System – Particle Photon 2
 * Sensors: BME280, Soil Moisture, Air Quality
 * Cloud: Adafruit IO
 * Display: 128x64 OLED (I2C)
 * Pump: Relay + NPN Transistor Driver
 ***************************************************/

#include "Particle.h"
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Adafruit_BME280.h>

// ==============================
// ------ PIN DEFINITIONS -------
// ==============================
#define PIN_SOIL     A0      // Soil moisture sensor
#define PIN_AIR      A1      // Air quality analog sensor
#define PIN_RELAY    D6      // Relay control pin

// I2C display parameters
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// BME280 sensor
Adafruit_BME280 bme;

// ==============================
// ------- GLOBAL VALUES --------
// ==============================
int soilValue      = 0;
int soilPercent    = 0;
int airValue       = 0;
float tempC        = 0;
float humidity     = 0;
float pressure     = 0;

unsigned long lastUpload = 0;
unsigned long uploadInterval = 5000;

// Watering logic
int moistureThreshold = 30;         // (%) below this triggers watering
bool manualWaterRequested = false;

// ==============================
// ------- CLOUD VARIABLES ------
// ==============================
Particle.variable("soil", soilPercent);
Particle.variable("temperature", tempC);
Particle.variable("humidity", humidity);
Particle.variable("pressure", pressure);

// Cloud function for manual watering via Adafruit IO dashboard
int cloudWater(String cmd) {
    if (cmd == "WATER") {
        manualWaterRequested = true;
        return 1;
    }
    return 0;
}

// ==============================
// --------- SETUP --------------
// ==============================
void setup() {
    pinMode(PIN_RELAY, OUTPUT);
    digitalWrite(PIN_RELAY, LOW);

    Particle.function("manualWater", cloudWater);

    // Init I2C display
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);

    // Init BME280
    if (!bme.begin(0x76)) {
        display.println("BME280 NOT FOUND!");
        display.display();
        delay(3000);
    }

    display.clearDisplay();
    display.println("IoT Plant WateringnBooting...");
    display.display();
    delay(1000);
}

// ==============================
// ------- WATER FUNCTION -------
// ==============================
void waterPlant() {
    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Watering Plant...");
    display.display();

    digitalWrite(PIN_RELAY, HIGH);
    delay(500);  // Watering for 0.5 seconds
    digitalWrite(PIN_RELAY, LOW);

    delay(1000);
}

// ==============================
// ---------- LOOP --------------
// ==============================
void loop() {

    // Read soil moisture
    soilValue = analogRead(PIN_SOIL);
    soilPercent = map(soilValue, 3000, 1200, 0, 100);
    soilPercent = constrain(soilPercent, 0, 100);

    // Read air quality
    airValue = analogRead(PIN_AIR);

    // BME280 reading
    tempC = bme.readTemperature();
    humidity = bme.readHumidity();
    pressure = bme.readPressure() / 100.0F;

    // -------- Auto Watering --------
    if (soilPercent < moistureThreshold) {
        waterPlant();
    }

    // -------- Manual Watering --------
    if (manualWaterRequested == true) {
        waterPlant();
        manualWaterRequested = false;
    }

    // -------- Upload to Cloud --------
    if (millis() - lastUpload > uploadInterval) {
        lastUpload = millis();

        Particle.publish("soil", String(soilPercent), PRIVATE);
        Particle.publish("temp", String(tempC), PRIVATE);
        Particle.publish("humidity", String(humidity), PRIVATE);
        Particle.publish("pressure", String(pressure), PRIVATE);
    }

    // -------- OLED UI --------
    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Smart Plant System");
    display.println("--------------------");

    display.print("Soil: ");
    display.print(soilPercent);
    display.println("%");

    display.print("Temp: ");
    display.print(tempC);
    display.println(" C");

    display.print("Hum: ");
    display.print(humidity);
    display.println(" %");

    display.print("AirQ: ");
    display.println(airValue);

    display.print("Press: ");
    display.print(pressure);
    display.println(" hPa");

    display.display();

    delay(200);
}

关键词:

评论


相关推荐

技术专区

关闭