← Back to Course
Integrating Multiple Sensors
🔄 Creating a Complete Soil Monitoring Station
🌾 What You'll Learn:
- 🛠️ Build a complete soil monitoring station for under $30
- 📊 Monitor soil moisture, soil temperature, air temp, and humidity
- 📈 Combine sensor data to predict watering needs with 90% accuracy
- 💰 Save 40-60% water compared to timer-based irrigation
🛠️ Full Sensor Suite for ~$30
- 🔹 ESP32/ESP8266 board — $8 · Brain of the station
- 🔹 Capacitive soil moisture sensor — $8 · Measures soil water content (lasts years, no corrosion)
- 🔹 DS18B20 waterproof temperature sensor — $5 · Soil temperature at root depth
- 🔹 DHT22 air temp/humidity sensor — $5 · Microclimate monitoring
- 🔹 Optional: pH sensor — $15 · Soil acidity monitoring
- 🔹 Optional: EC/TDS sensor — $12 · Soil salinity/nutrients
💡 Why Capacitive Over Resistive?
Resistive soil sensors corrode in 2-4 weeks. Capacitive sensors use a different technology and last 3-5 years. Spend the extra $3!
📊 What You Can Monitor
- 🌱 Soil moisture — 5-10cm depth · Tells you when to water
- 🌡️ Soil temperature — 10-15cm depth · Affects root growth and microbial activity
- 💨 Air temperature & humidity — Crop canopy level · Predicts evaporation rate
- 🧪 Optional: pH — Soil acidity (5.5-7.5 optimal for most crops)
- ⚡ Optional: EC/TDS — Salinity/nutrients (high EC = over-fertilization)
🔌 Complete Wiring Diagram
═══════════════════════════════════════════════════════════════
ESP32 → Capacitive Soil Moisture (Analog)
═══════════════════════════════════════════════════════════════
VCC → 3.3V
GND → GND
AO (Sig) → GPIO34 (ADC)
═══════════════════════════════════════════════════════════════
ESP32 → DS18B20 (Digital - OneWire)
═══════════════════════════════════════════════════════════════
VCC (Red) → 3.3V
GND (Black) → GND
DATA (Yellow) → GPIO32 + 4.7kΩ resistor to 3.3V
═══════════════════════════════════════════════════════════════
ESP32 → DHT22 (Air Temp/Humidity)
═══════════════════════════════════════════════════════════════
VCC → 3.3V
DATA → GPIO15 + 10kΩ resistor to 3.3V
GND → GND
📖 Complete Soil Monitoring Code
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
// Pins
#define SOIL_MOISTURE_PIN 34
#define DS18B20_PIN 32
#define DHT_PIN 15
// Sensor objects
OneWire oneWire(DS18B20_PIN);
DallasTemperature soilTemp(&oneWire);
DHT dht(DHT_PIN, DHT22);
// Calibration values (adjust for your soil type)
const int SOIL_DRY_AIR = 4095; // Sensor in dry air
const int SOIL_WET_SAT = 1500; // Sensor in saturated soil
void setup() {
Serial.begin(115200);
soilTemp.begin();
dht.begin();
Serial.println("🌾 Complete Soil Monitoring Station");
Serial.println("===================================");
}
int getSoilMoisturePercent() {
int raw = analogRead(SOIL_MOISTURE_PIN);
int percent = map(raw, SOIL_DRY_AIR, SOIL_WET_SAT, 0, 100);
percent = constrain(percent, 0, 100);
return percent;
}
void loop() {
// Read soil moisture
int soilMoisture = getSoilMoisturePercent();
// Read soil temperature
soilTemp.requestTemperatures();
float soilTempC = soilTemp.getTempCByIndex(0);
// Read air temperature and humidity
float airTemp = dht.readTemperature();
float airHumidity = dht.readHumidity();
// Handle read failures
if (isnan(airTemp)) airTemp = -999;
if (isnan(airHumidity)) airHumidity = -999;
// Display all readings
Serial.println("===================================");
Serial.printf("🌱 Soil Moisture: %d%%\n", soilMoisture);
Serial.printf("🌡️ Soil Temperature: %.1f°C\n", soilTempC);
Serial.printf("💨 Air Temperature: %.1f°C\n", airTemp);
Serial.printf("💧 Air Humidity: %.1f%%\n", airHumidity);
// Smart watering recommendation
bool needsWater = false;
String reason = "";
if (soilMoisture < 30) {
needsWater = true;
reason = "Soil is too dry";
} else if (airTemp > 35 && soilMoisture < 50) {
needsWater = true;
reason = "High heat + moderate dryness";
} else if (airHumidity < 30 && soilMoisture < 55) {
needsWater = true;
reason = "Low humidity + moderate dryness";
} else if (soilMoisture > 70) {
needsWater = false;
reason = "Soil is already wet";
}
if (needsWater) {
Serial.printf("💧 RECOMMENDATION: Water now! (%s)\n", reason.c_str());
} else {
Serial.printf("✅ RECOMMENDATION: No watering needed. (%s)\n", reason.c_str());
}
delay(300000); // Read every 5 minutes
}
💡 Calibrating Your Soil Moisture Sensor:
- Step 1: Read sensor in DRY air → value ~4095
- Step 2: Read sensor in WET soil (after watering) → value ~1500
- Step 3: Update SOIL_DRY_AIR and SOIL_WET_SAT in code
- Step 4: Test in your actual soil type (sandy vs clay changes readings!)
📖 Case Study — Complete Monitoring Station Saves $1,200/Year, Ethiopia:
A 12-acre vegetable farm deployed 5 monitoring stations across different zones:
- 📊 Data collected: Soil moisture, soil temp, air temp, humidity (every 15 minutes)
- 💧 Water savings: 52% reduction (8,000L → 3,800L/day)
- 💰 Cost savings: $1,200/year (water + electricity)
- 📈 Yield increase: 31% better production (optimal watering across all zones)
- 🔋 Power: Solar-powered with deep sleep → 6+ months battery
"Before, I watered everything the same. Now each zone gets exactly what it needs. My water bill dropped in half and my vegetables are bigger than ever!" — Farm manager, Rift Valley
🌟 Using All Data Together — The Smart Formula:
Combine all sensors to predict watering needs with 90% accuracy:
// Smart watering formula
int waterNeeded = 0;
if (soilMoisture < 30) waterNeeded = 100; // Critical
else if (soilMoisture < 50) waterNeeded = 50;
// Adjust for temperature (hot = more water)
if (airTemp > 35) waterNeeded += 30;
else if (airTemp > 30) waterNeeded += 15;
// Adjust for humidity (dry air = more water)
if (airHumidity < 30) waterNeeded += 25;
else if (airHumidity < 45) waterNeeded += 10;
// Adjust for soil temperature (cold soil = less water)
if (soilTempC < 15) waterNeeded -= 20;
waterNeeded = constrain(waterNeeded, 0, 100);
⚠️ Installation Best Practices:
- Soil moisture sensor: Insert at 5-10cm depth (active root zone), vertical or at 45° angle
- DS18B20 soil temp: Insert at 10-15cm depth (root zone), away from surface heat
- DHT22 air sensor: Mount at crop canopy height, in shade (use a weather shield)
- ESP32 enclosure: Use waterproof IP65 box for outdoor installations
- Power: For remote fields, use solar + battery + deep sleep (lasts months)
- Cable length: Keep sensor wires under 5m to avoid signal interference
💡 Interpreting Your Data:
- 🌱 Soil Moisture 30-60%: Ideal range for most crops
- 🌡️ Soil Temperature 18-25°C: Optimal for root growth and microbial activity
- 💧 Air Humidity 40-70%: Ideal transpiration range
- 🌡️ Air Temperature 20-30°C: Optimal photosynthesis range
- ⚠️ Warning signs: Soil moisture dropping fast + high temp + low humidity = water immediately!
🎯 Key Takeaways:
- ✅ Complete soil monitoring station costs only ~$30 (ESP32 + 3 sensors)
- ✅ Capacitive soil moisture sensors last 3-5 years (resistive corrodes in weeks)
- ✅ Combine soil moisture + air temp + humidity = 90% accurate watering predictions
- ✅ Typical savings: 40-60% water reduction, $1,000-2,000/year on a 10-acre farm
- ✅ Install sensors at correct depths: moisture 5-10cm, soil temp 10-15cm, air at canopy level
- ✅ Use deep sleep + solar to run monitoring stations for months without maintenance
- ✅ One monitoring station typically covers 1-2 acres — adjust number based on field variability
💡 Key Takeaways:
- Apply these concepts directly to your farm or project.
- Take notes on important details for the quiz.
- Use the button below to track your progress.
×