ESP32 + 土壤湿度传感器实现自动灌溉

2025-06发布9次浏览

随着物联网技术的发展,智能农业设备逐渐走入人们的视野。本文将详细介绍如何使用ESP32与土壤湿度传感器实现自动灌溉系统。通过该系统,用户可以实时监控土壤湿度,并根据预设的阈值自动启动或停止灌溉。

系统概述

本项目的核心是ESP32微控制器和土壤湿度传感器。ESP32负责读取传感器数据、判断是否需要浇水以及控制水泵或电磁阀的动作。此外,ESP32还可以通过Wi-Fi将数据上传到云端或发送到用户的手机应用中,便于远程监控。

硬件清单

  1. ESP32开发板
  2. 土壤湿度传感器(如FC-28)
  3. 继电器模块(用于控制水泵或电磁阀)
  4. 水泵或电磁阀
  5. 面包板及连接线

软件环境

  • Arduino IDE(用于编写ESP32程序)
  • 可选:Thingspeak或其他云服务(用于远程监控)

硬件连接

1. 土壤湿度传感器

土壤湿度传感器通常有三个引脚:VCC、GND和AO(模拟输出)。将其连接到ESP32如下:

  • VCC -> 5V 或 3.3V
  • GND -> GND
  • AO -> ESP32的ADC引脚(例如GPIO34)

2. 继电器模块

继电器模块用于控制水泵或电磁阀的开关。连接方式如下:

  • IN -> ESP32的数字引脚(例如GPIO2)
  • VCC -> 5V
  • GND -> GND

继电器的常开触点连接到水泵或电磁阀的电源回路中。


软件设计

代码实现

以下是一个简单的Arduino代码示例,用于实现自动灌溉功能:

#include <WiFi.h>

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

// 定义引脚
const int sensorPin = 34; // 土壤湿度传感器连接到GPIO34
const int relayPin = 2;   // 继电器连接到GPIO2

// 阈值设置
int dryThreshold = 2000;  // 干燥阈值
int wetThreshold = 1000;  // 湿润阈值

void setup() {
  Serial.begin(115200);
  
  // 初始化WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // 设置引脚模式
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // 默认关闭继电器
}

void loop() {
  // 读取土壤湿度传感器值
  int soilMoisture = analogRead(sensorPin);

  // 打印当前湿度值
  Serial.print("Soil Moisture: ");
  Serial.println(soilMoisture);

  // 判断是否需要浇水
  if (soilMoisture > dryThreshold) {
    Serial.println("Too dry! Turning on water pump.");
    digitalWrite(relayPin, HIGH); // 打开继电器
  } else if (soilMoisture < wetThreshold) {
    Serial.println("Wet enough. Turning off water pump.");
    digitalWrite(relayPin, LOW); // 关闭继电器
  }

  // 延迟一段时间再检测
  delay(5000);
}

代码解析

  1. 传感器读取analogRead(sensorPin) 用于读取土壤湿度传感器的模拟值。
  2. 阈值判断:根据预设的干燥和湿润阈值,决定是否开启或关闭水泵。
  3. 继电器控制:通过digitalWrite(relayPin, HIGH/LOW) 控制继电器的状态。

扩展功能

1. 数据上传至云端

可以通过Thingspeak等平台将土壤湿度数据上传至云端,便于远程监控。以下是修改后的代码片段:

#include <WiFiClient.h>
#include <ThingSpeak.h>

// Thingspeak配置
unsigned long myChannelNumber = 123456;
const char * myWriteAPIKey = "你的API密钥";

void loop() {
  int soilMoisture = analogRead(sensorPin);

  // 将数据上传到Thingspeak
  ThingSpeak.setField(1, soilMoisture);
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if (x == 200) {
    Serial.println("Data uploaded successfully");
  } else {
    Serial.println("Failed to upload data");
  }

  delay(20000); // 每20秒上传一次数据
}

2. 自定义阈值调整

为了适应不同植物的需求,可以在程序中加入一个阈值调整功能,允许用户通过串口输入自定义的干燥和湿润阈值。


流程图

以下是整个系统的逻辑流程图:

flowchart TD
    A[开始] --> B[读取土壤湿度]
    B --> C{湿度是否大于干燥阈值?}
    C --是--> D[打开水泵]
    C --否--> E{湿度是否小于湿润阈值?}
    E --是--> F[关闭水泵]
    E --否--> G[保持状态不变]
    D --> H[延迟5秒]
    F --> H
    G --> H
    H --> B