随着物联网技术的发展,智能农业设备逐渐走入人们的视野。本文将详细介绍如何使用ESP32与土壤湿度传感器实现自动灌溉系统。通过该系统,用户可以实时监控土壤湿度,并根据预设的阈值自动启动或停止灌溉。
本项目的核心是ESP32微控制器和土壤湿度传感器。ESP32负责读取传感器数据、判断是否需要浇水以及控制水泵或电磁阀的动作。此外,ESP32还可以通过Wi-Fi将数据上传到云端或发送到用户的手机应用中,便于远程监控。
土壤湿度传感器通常有三个引脚:VCC、GND和AO(模拟输出)。将其连接到ESP32如下:
继电器模块用于控制水泵或电磁阀的开关。连接方式如下:
继电器的常开触点连接到水泵或电磁阀的电源回路中。
以下是一个简单的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);
}
analogRead(sensorPin)
用于读取土壤湿度传感器的模拟值。digitalWrite(relayPin, HIGH/LOW)
控制继电器的状态。可以通过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秒上传一次数据
}
为了适应不同植物的需求,可以在程序中加入一个阈值调整功能,允许用户通过串口输入自定义的干燥和湿润阈值。
以下是整个系统的逻辑流程图:
flowchart TD A[开始] --> B[读取土壤湿度] B --> C{湿度是否大于干燥阈值?} C --是--> D[打开水泵] C --否--> E{湿度是否小于湿润阈值?} E --是--> F[关闭水泵] E --否--> G[保持状态不变] D --> H[延迟5秒] F --> H G --> H H --> B