久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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溫度 / 濕度 / 氣壓傳感器(I2C)
土壤電容式濕度傳感器土壤含水量監測
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);
}

關鍵詞:

評論


相關推薦

技術專區

關閉