Arduino Uno灌溉项目代码修改:实现持续循环检测灌溉
修复后的自动灌溉系统代码
int relayPin = 8; int sensor_pin = A0; // 土壤湿度传感器接模拟引脚A0 int output_value; // 加入滞后阈值,防止频繁启停 const int MOISTURE_LOW_THRESHOLD = 20; // 低于此值启动水泵 const int MOISTURE_HIGH_THRESHOLD = 30; // 高于此值停止水泵 bool pumpRunning = false; // 记录水泵当前状态 void setup() { Serial.begin(9600); pinMode(relayPin, OUTPUT); pinMode(sensor_pin, INPUT); Serial.println("Reading From the Sensor ..."); delay(2000); // 初始化继电器状态为关闭 digitalWrite(relayPin, HIGH); } void loop() { int rawValue = analogRead(sensor_pin); // 根据传感器实际输出范围调整map参数,确保干燥时湿度值低,湿润时高 // 多数土壤湿度传感器:干燥时rawValue≈500-800,湿润时≈100-300,可根据实际校准 output_value = map(rawValue, 600, 100, 0, 100); // 限制数值范围,避免map超出0-100 output_value = constrain(output_value, 0, 100); Serial.print("Moisture : "); Serial.print(output_value); Serial.println("%"); // 带滞后的控制逻辑,防止频繁启停 if (!pumpRunning && output_value < MOISTURE_LOW_THRESHOLD) { digitalWrite(relayPin, LOW); // 启动水泵(根据继电器类型调整电平) pumpRunning = true; Serial.println("Pump started - soil is dry"); } else if (pumpRunning && output_value > MOISTURE_HIGH_THRESHOLD) { digitalWrite(relayPin, HIGH); // 停止水泵 pumpRunning = false; Serial.println("Pump stopped - soil is moist"); } delay(1000); }
关键修改点说明
- 滞后控制逻辑:新增
MOISTURE_HIGH_THRESHOLD和pumpRunning状态变量,避免湿度在阈值附近波动时水泵频繁启停,同时确保传感器从湿润环境移开后,湿度低于低阈值时能触发水泵启动。 - 传感器数值校准:调整
map函数的输入范围为600, 100(适配多数土壤湿度传感器的实际输出:干燥时模拟值高,湿润时低),并通过constrain函数确保湿度值始终在0-100%范围内,避免异常数值导致逻辑错误。 - 初始状态明确:在
setup中初始化继电器为关闭状态,避免上电时水泵误启动。 - 调试日志补充:添加水泵启停的串口日志,方便观察系统运行状态。
额外调试建议
- 若水泵仍不启动,先确认继电器触发电平:部分继电器模块为高电平触发,此时需将启动逻辑改为
digitalWrite(relayPin, HIGH),停止改为digitalWrite(relayPin, LOW)。 - 用串口监视器记录传感器原始值:将传感器分别放在干燥、湿润土壤中,记录实际模拟值范围,再调整
map函数的输入参数,确保湿度计算准确。
内容的提问来源于stack exchange,提问作者Tendai
相关产品推荐
相关产品推荐

