HOOOS

DIY智能阳台自动浇花系统:ESP32实现App远程控制与耐用防水

0 2 阳台小农 ESP32自动浇花智能家居
Apple

阳台上的花花草草,是很多人的心头好,但每次出门远行,最牵挂的莫过于它们的“口粮”——浇水。手动浇水费时费力,还容易忘记,特别是对新手来说,掌握浇水频率更是门学问。今天,我就来分享一个我亲手搭建的基于ESP32的智能阳台自动浇花系统,它不仅能自动监测土壤湿度,还能让你通过手机App远程控制,彻底告别浇水烦恼!更重要的是,我特别注重了它的防水和耐用性,让你的“智能园丁”可以长期稳定工作。

一、核心思路与技术选型

这个系统的核心是ESP32微控制器,它集成了Wi-Fi功能,非常适合物联网项目。我们利用它读取土壤湿度传感器的数据,当湿度低于预设阈值时,通过继电器控制水泵自动给植物浇水。同时,ESP32还会搭建一个简易的Web服务器,让你在手机上就能查看湿度、手动浇水或调整参数。

为什么选择ESP32?

  • 集成Wi-Fi: 无需额外模块即可联网,实现远程控制。
  • 性能强劲: 双核处理器,运行速度快,处理多任务无压力。
  • 成本效益高: 相较于树莓派,成本更低,功耗更小,更适合这种嵌入式应用。
  • 开发生态成熟: Arduino IDE支持,大量库和社区资源。

二、所需硬件清单

为了确保系统的稳定和耐用,以下是我推荐的硬件清单及一些注意事项:

  1. ESP32开发板:推荐NodeMCU-32S或ESP32-WROOM-32系列,淘宝或京东几十块钱一块。
  2. 电容式土壤湿度传感器强烈推荐电容式! 普通电阻式传感器容易被腐蚀,寿命短。电容式通过感应土壤介电常数变化来测量湿度,无金属裸露在土壤中,大大延长了寿命。
  3. 5V微型水泵:选择扬程和流量适中的小水泵,潜水式更方便。确保其能够将水从储水容器抽到植物处。
  4. 单通道5V继电器模块:用于控制水泵的开关,将ESP32的弱电信号转换为控制水泵强电的信号。
  5. DC-DC降压模块 (AMS1117-5.0V或LM2596):如果你使用12V或更高的电源驱动水泵,需要将其降压到5V为ESP32和继电器供电。如果全部使用5V供电,可省略。
  6. 5V电源适配器:给整个系统供电,电流建议2A以上,确保水泵启动时供电充足。
  7. 硅胶水管:选择内径与水泵出水口匹配的软管,长度根据阳台布局调整。
  8. 滴灌头/分配器:可选,但强烈建议。用于将水均匀分散到多个花盆,或更精准地浇灌单个植物。
  9. 防水接线盒 (IP65或更高):用于容纳ESP32、继电器和电源模块,避免电子元件受潮短路。
  10. 杜邦线:连接各个模块。
  11. 热熔胶/防水密封胶:用于密封防水盒的开孔和接线处。
  12. 螺丝刀、剥线钳等基本工具。

三、电路连接示意图

这部分是关键,请仔细对照连接:

  • ESP32供电:
    • 5V -> ESP32的VIN5V引脚
    • GND -> ESP32的GND引脚
  • 土壤湿度传感器:
    • VCC -> ESP32的3.3V引脚 (确保传感器是3.3V兼容,大多数电容式传感器可以)
    • GND -> ESP32的GND引脚
    • Analog Out -> ESP32的任意一个ADC引脚,例如GPIO34(ESP32的ADC1_CH6)。
  • 继电器模块:
    • VCC -> ESP32的5V引脚 (或者直接从5V电源取电)
    • GND -> ESP32的GND引脚
    • IN -> ESP32的任意一个GPIO数字引脚,例如GPIO27
  • 水泵:
    • 水泵的一端接电源正极(例如5V电源适配器正极)。
    • 水泵的另一端接继电器模块的常开 (NO)端。
    • 继电器模块的公共 (COM)端接电源负极(例如5V电源适配器负极)。
    • 注意: 确保水泵的电源与ESP32的电源兼容,若水泵使用更高电压,则需单独供电并经继电器隔离。

重要提示: 在接线时,务必断开所有电源,避免短路损坏设备!

四、软件代码示例 (基于Arduino IDE)

我们使用Arduino IDE进行开发,需要先安装ESP32板级支持包和相关库。

  1. 安装ESP32板级支持包: 在Arduino IDE的“文件”->“首选项”中,将以下链接添加到“附加开发板管理器网址”中:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    然后在“工具”->“开发板”->“开发板管理器”中搜索并安装“esp32”。
  2. 安装库: “项目”->“加载库”->“管理库”,搜索并安装:
    • ESPAsyncWebServer (用于Web服务器)
    • AsyncTCP (ESPAsyncWebServer的依赖)
    • ArduinoJson (可选,用于更复杂的数据交互,本例中暂不使用)

这是一个简化的Web控制代码示例,你可以根据需求进行扩展:

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

// WiFi配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// 引脚定义
const int MOISTURE_SENSOR_PIN = 34; // 土壤湿度传感器连接到GPIO34 (ADC1_CH6)
const int PUMP_RELAY_PIN = 27;     // 水泵继电器连接到GPIO27

// 浇水阈值 (根据实际测试调整)
// 0为干燥,4095为湿润 (ESP32 ADC默认12位)
const int DRY_THRESHOLD = 2000; // 低于此值开始浇水

// 浇水时长 (毫秒)
const unsigned long WATERING_DURATION = 5000; // 浇水5秒

// 浇水间隔 (避免频繁浇水,单位:毫秒)
const unsigned long WATERING_INTERVAL = 60 * 60 * 1000; // 1小时

unsigned long lastWateringTime = 0; // 上次浇水时间
bool autoWateringEnabled = true;    // 自动浇水开关

AsyncWebServer server(80); // 创建一个Web服务器在80端口

void setup() {
  Serial.begin(115200);

  pinMode(PUMP_RELAY_PIN, OUTPUT);
  digitalWrite(PUMP_RELAY_PIN, HIGH); // 继电器常为高电平断开,具体看你的继电器模块

  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("WiFi connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Web服务器路由设置
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    int moistureValue = analogRead(MOISTURE_SENSOR_PIN);
    String state = "未连接";
    if (WiFi.status() == WL_CONNECTED) {
      state = "已连接,IP: " + WiFi.localIP().toString();
    }
    
    String html = "<html><body>";
    html += "<h1>智能浇花系统</h1>";
    html += "<p>WiFi状态: " + state + "</p>";
    html += "<p>当前土壤湿度: " + String(moistureValue) + " (0=干, 4095=湿)</p>";
    html += "<p>自动浇水: " + (autoWateringEnabled ? String("已启用") : String("已禁用")) + "</p>";
    
    html += "<p><a href='/water'>手动浇水 (5秒)</a></p>";
    if (autoWateringEnabled) {
      html += "<p><a href='/autowatering_off'>禁用自动浇水</a></p>";
    } else {
      html += "<p><a href='/autowatering_on'>启用自动浇水</a></p>";
    }
    html += "</body></html>";
    request->send(200, "text/html", html);
  });

  // 手动浇水路由
  server.on("/water", HTTP_GET, [](AsyncWebServerRequest *request){
    Serial.println("手动浇水请求...");
    waterPlants();
    request->redirect("/");
  });

  // 启用自动浇水路由
  server.on("/autowatering_on", HTTP_GET, [](AsyncWebServerRequest *request){
    autoWateringEnabled = true;
    Serial.println("自动浇水已启用。");
    request->redirect("/");
  });

  // 禁用自动浇水路由
  server.on("/autowatering_off", HTTP_GET, [](AsyncWebServerRequest *request){
    autoWateringEnabled = false;
    Serial.println("自动浇水已禁用。");
    request->redirect("/");
  });

  server.begin(); // 启动Web服务器
}

void loop() {
  if (autoWateringEnabled) {
    int moistureValue = analogRead(MOISTURE_SENSOR_PIN);
    Serial.print("当前湿度: ");
    Serial.println(moistureValue);

    if (moistureValue < DRY_THRESHOLD && (millis() - lastWateringTime > WATERING_INTERVAL)) {
      Serial.println("湿度过低,开始自动浇水...");
      waterPlants();
    }
  }
  delay(5000); // 每5秒检查一次湿度
}

void waterPlants() {
  digitalWrite(PUMP_RELAY_PIN, LOW); // 继电器低电平触发(根据模块而定,有些是高电平)
  Serial.println("水泵开启...");
  delay(WATERING_DURATION);
  digitalWrite(PUMP_RELAY_PIN, HIGH); // 关闭水泵
  Serial.println("水泵关闭。");
  lastWateringTime = millis(); // 更新浇水时间
}

代码使用说明:

  • ssidpassword替换为你的WiFi名称和密码。
  • 根据实际接线调整MOISTURE_SENSOR_PINPUMP_RELAY_PIN
  • DRY_THRESHOLD是一个关键参数,你需要通过实验确定土壤干燥和湿润时的传感器读数,然后设置一个合适的阈值。初始可以先观察干燥土壤的读数,设置一个比它略高的值。
  • WATERING_DURATIONWATERING_INTERVAL也需要根据植物种类和花盆大小进行调整。
  • 编译并上传代码到ESP32。上传成功后,打开Arduino IDE的串口监视器,可以查看到ESP32获取到的IP地址。

五、防水与耐用性设计

这是项目成功的关键,没有做好防水,电子设备很快就会损坏。

  1. 电子元件封装:
    • 将ESP32、继电器模块、电源适配器(或降压模块)全部放入IP65或更高等级的防水接线盒中。
    • 所有从防水盒进出的线缆(电源线、传感器线、水泵控制线)必须通过防水格兰头固定和密封,确保水无法从线缆入口渗入。如果没有格兰头,可以用热熔胶或硅胶彻底堵死开孔处。
  2. 传感器保护:
    • 电容式传感器本身更耐腐蚀。将其插入土壤中时,确保其PCB板部分尽量不要直接暴露在长时间潮湿环境中。如果传感器带探头线,将探头插入土壤,控制器部分留在盒内。
    • 如果使用的是探针式(电阻式)传感器,虽然不推荐,但如果你非用不可,建议定期检查并更换,或尝试在探针裸露部分涂抹防水漆或环氧树脂(需注意可能影响精度)。
  3. 水泵与水管:
    • 水泵选择潜水泵,直接放入储水容器底部。
    • 水管连接处要紧固,不漏水。可以用管夹固定,或用热缩管加热收缩确保密封。
    • 尽量避免水管有锐角弯折,防止堵塞。
  4. 整体布局:
    • 将防水盒放置在远离水喷溅区域,最好是悬挂起来或放在高处。
    • 确保水泵电源线和控制线有足够的“滴水环”,防止水沿着线缆流到电子元件。
    • 定期检查系统,特别是接线和密封情况。

六、App控制与校准

通过上述代码,你的手机浏览器就是一个“简易App”:

  1. 在手机连接与ESP32相同的WiFi网络。
  2. 在浏览器中输入ESP32的IP地址(如:http://192.168.1.100)。
  3. 你就能看到当前湿度、手动浇水按钮和自动浇水开关了。

传感器校准:

  • 将传感器插入完全干燥的土壤中,记录其读数(例如1800)。
  • 将传感器插入浇透水后的湿润土壤中,记录其读数(例如3500)。
  • 根据这两个值,设定DRY_THRESHOLD,例如2000或2200,确保在植物需要浇水时能够触发。不同土壤、不同植物对湿度的需求不同,这个值需要一些实践来调整。

七、进阶拓展

  • 真正的App集成: 可以尝试使用Blynk、MQTT或阿里云/腾讯云物联网平台,配合更专业的手机App实现更丰富的控制和数据可视化。
  • 多花盆管理: 增加多个土壤湿度传感器和多个继电器/水泵,实现对不同花盆的独立浇水。
  • 水位监测: 在储水箱中加入一个水位传感器,当水位过低时发送提醒。
  • 雨水传感器: 增加雨水传感器,避免下雨天重复浇水。

通过这个DIY项目,你不仅能让你的阳台花卉得到精心照料,还能深入体验物联网的乐趣。祝你搭建顺利,拥有一个郁郁葱葱的智能阳台!

点评评价

captcha
健康