// === Pin Definitions (Only A0–A7 used) ===
#define TRIG_PIN PA4 // Ultrasonic Trigger
#define ECHO_PIN PA5 // Ultrasonic Echo
#define BUZZER_PIN PA6 // Buzzer Output
#define PUMP_PIN PA7 // Pump Output
#define SOIL1_PIN PA0 // Soil Moisture Sensor 1
#define SOIL2_PIN PA1 // Soil Moisture Sensor 2
#define SOIL3_PIN PA2 // Soil Moisture Sensor 3
#define SOIL4_PIN PA3 // Soil Moisture Sensor 4
// === Thresholds ===
#define MOISTURE_THRESHOLD 500 // Lower = dry soil
#define WATER_LEVEL_THRESHOLD 10.0 // cm; Higher = water low
// === Variables ===
int dry = 0;
int soilPins[4] = {SOIL1_PIN, SOIL2_PIN, SOIL3_PIN, SOIL4_PIN};
int soilValues[4];
// === Ultrasonic Water Level Function ===
long readWaterLevelCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout
return duration * 0.034 / 2; // Distance in cm
}
// === Setup ===
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(soilPins[i], INPUT);
}
digitalWrite(PUMP_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// === Main Loop ===
void loop() {
long waterLevel = readWaterLevelCM(); // Read tank level (cm)
if (waterLevel > WATER_LEVEL_THRESHOLD) {
// Tank is low
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(PUMP_PIN, LOW);
} else {
// Tank has enough water
digitalWrite(BUZZER_PIN, LOW);
dry = 0; // Reset dry count
// Check soil moisture for each sensor
for (int i = 0; i < 4; i++) {
soilValues[i] = analogRead(soilPins[i]);
if (soilValues[i] < MOISTURE_THRESHOLD) {
dry++;
}
}
// Activate pump if at least one plant is dry
if (dry > 0) {
digitalWrite(PUMP_PIN, HIGH);
} else {
digitalWrite(PUMP_PIN, LOW);
}
}
delay(4000); // Check every 4 seconds
}Loading
st-nucleo-l031k6
st-nucleo-l031k6