#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// Pin definitions
#define WATER_LEVEL_PIN 34 // Analog pin for water level sensor
#define SOIL_MOISTURE_PIN 35 // Analog pin for soil moisture sensor
#define DHT_PIN 4 // Digital pin for DHT sensor
#define PUMP_CHILLI_PIN 16 // GPIO for chilli pump relay
#define PUMP_BASIL_PIN 17 // GPIO for basil pump relay
#define PUMP_OREGANO_PIN 18 // GPIO for oregano pump relay
#define SOLAR_VOLTAGE_PIN 39 // Analog pin to monitor solar panel voltage
// Sensor and system parameters
#define WATER_LEVEL_THRESHOLD 1500 // Threshold for water level (analog value)
#define SOIL_MOISTURE_THRESHOLD 2000 // Threshold for soil moisture (analog value)
#define TEMP_THRESHOLD 30.0 // Temperature threshold in Celsius
#define HUMIDITY_THRESHOLD 70.0 // Humidity threshold in %
#define DHTTYPE DHT22
DHT dht(DHT_PIN, DHTTYPE);
void setup() {
Serial.begin(115200);
pinMode(WATER_LEVEL_PIN, INPUT);
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(SOLAR_VOLTAGE_PIN, INPUT);
pinMode(PUMP_CHILLI_PIN, OUTPUT);
pinMode(PUMP_BASIL_PIN, OUTPUT);
pinMode(PUMP_OREGANO_PIN, OUTPUT);
digitalWrite(PUMP_CHILLI_PIN, LOW);
digitalWrite(PUMP_BASIL_PIN, LOW);
digitalWrite(PUMP_OREGANO_PIN, LOW);
dht.begin();
}
void fertigationPumpControl(int pumpPin, int soilMoisture) {
if (soilMoisture < SOIL_MOISTURE_THRESHOLD) {
digitalWrite(pumpPin, HIGH); // Turn pump ON
} else {
digitalWrite(pumpPin, LOW); // Turn pump OFF
}
}
bool isWaterAvailable() {
int waterLevel = analogRead(WATER_LEVEL_PIN);
return (waterLevel > WATER_LEVEL_THRESHOLD);
}
bool isSolarPowerSufficient() {
int solarVoltage = analogRead(SOLAR_VOLTAGE_PIN);
// Assuming 0-4095 maps to 0-3.3V, threshold ~2.5V for sufficient power
float voltage = (solarVoltage / 4095.0) * 3.3;
return (voltage > 2.5);
}
void loop() {
if (!isSolarPowerSufficient()) {
Serial.println("Insufficient solar power. Pumps OFF.");
digitalWrite(PUMP_CHILLI_PIN, LOW);
digitalWrite(PUMP_BASIL_PIN, LOW);
digitalWrite(PUMP_OREGANO_PIN, LOW);
delay(10000);
return;
}
if (!isWaterAvailable()) {
Serial.println("Water level low. Pumps OFF.");
digitalWrite(PUMP_CHILLI_PIN, LOW);
digitalWrite(PUMP_BASIL_PIN, LOW);
digitalWrite(PUMP_OREGANO_PIN, LOW);
delay(10000);
return;
}
int soilMoistureChilli = analogRead(SOIL_MOISTURE_PIN);
int soilMoistureBasil = analogRead(SOIL_MOISTURE_PIN);
int soilMoistureOregano = analogRead(SOIL_MOISTURE_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.printf("Temp: %.2f C, Humidity: %.2f %%\n", temperature, humidity);
}
Serial.printf("Water Level: %d, Soil Moisture: %d\n", analogRead(WATER_LEVEL_PIN), soilMoistureChilli);
// Control pumps based on soil moisture and environmental conditions
if (temperature > TEMP_THRESHOLD || humidity < HUMIDITY_THRESHOLD) {
fertigationPumpControl(PUMP_CHILLI_PIN, soilMoistureChilli);
fertigationPumpControl(PUMP_BASIL_PIN, soilMoistureBasil);
fertigationPumpControl(PUMP_OREGANO_PIN, soilMoistureOregano);
} else {
digitalWrite(PUMP_CHILLI_PIN, LOW);
digitalWrite(PUMP_BASIL_PIN, LOW);
digitalWrite(PUMP_OREGANO_PIN, LOW);
}
delay(15000); // Wait 15 seconds before next reading
}