#include <OneWire.h>
#include <DallasTemperature.h>
// Pin definitions
#define ONE_WIRE_BUS 4 // DS18B20 Data pin
#define SOIL_PIN 34 // Potentiometer SIG pin for soil moisture
#define GREEN_LED 5 // Green LED pin
#define YELLOW_LED 18 // Yellow LED pin (temperature warning)
#define RED_LED 19 // Red LED pin (soil warning/dry)
// Soil moisture thresholds
#define DRY_THRESHOLD 3000
#define WET_THRESHOLD 1500
#define SOIL_WARNING_THRESHOLD 2000
#define TEMP_WARNING_THRESHOLD 45.0
// Setup a oneWire instance
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Blink state variables
bool tempBlinkState = false;
bool soilBlinkState = false;
unsigned long lastBlinkTime = 0;
const long blinkInterval = 500; // Blink every 500ms (0.5s)
void setup() {
Serial.begin(115200);
sensors.begin();
// Initialize LED pins
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
Serial.println("Setup complete. Starting sensor readings...");
}
void loop() {
// Read sensors
int soilValue = analogRead(SOIL_PIN); // Reads SIG pin (0–4095)
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0); // Get temperature from DS18B20
// Debugging output
Serial.print("Raw Soil Value: ");
Serial.println(soilValue);
Serial.print("Raw Temperature: ");
Serial.println(temperature);
// Check sensor readings
if (soilValue < 0 || soilValue > 4095) {
Serial.println("Error: Invalid soil moisture reading!");
soilValue = 0; // Default to 0 if invalid
}
if (temperature == DEVICE_DISCONNECTED_C || temperature < -55 || temperature > 125) {
Serial.println("Error: DS18B20 not detected or out of range!");
temperature = 25.0; // Default to 25°C if invalid
}
// Print to Serial Monitor
Serial.print("Soil Moisture: ");
Serial.print(soilValue);
Serial.print(" | Temperature: ");
Serial.print(temperature);
Serial.println("°C");
// Get current time
unsigned long currentTime = millis();
// Control LEDs based on conditions
if (soilValue <= WET_THRESHOLD) { // Wet
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
} else if (soilValue > WET_THRESHOLD && soilValue <= DRY_THRESHOLD) { // Normal
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
} else { // Dry (> 3000)
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH); // Solid ON for dry
}
// Temperature warning blink (> 45°C)
if (temperature > TEMP_WARNING_THRESHOLD) {
if (currentTime - lastBlinkTime >= blinkInterval) {
tempBlinkState = !tempBlinkState;
digitalWrite(YELLOW_LED, tempBlinkState ? HIGH : LOW);
lastBlinkTime = currentTime;
}
} else {
digitalWrite(YELLOW_LED, LOW); // Off if temp ≤ 45°C
}
// Soil moisture warning blink (> 2000) only if not dry
if (soilValue > SOIL_WARNING_THRESHOLD && soilValue <= DRY_THRESHOLD) {
if (currentTime - lastBlinkTime >= blinkInterval) {
soilBlinkState = !soilBlinkState;
digitalWrite(RED_LED, soilBlinkState ? HIGH : LOW); // Blinks if > 2000 but ≤ 3000
lastBlinkTime = currentTime;
}
} else if (soilValue <= SOIL_WARNING_THRESHOLD) {
digitalWrite(RED_LED, LOW); // Ensure off if ≤ 2000
}
delay(100); // Short delay for smooth blinking
}