#include "DHT.h"
#include "Wire.h"
#include "Adafruit_MPU6050.h"
#include "Adafruit_Sensor.h"
// Pin Definitions
#define DHT_PIN 4 // DHT22 Data Pin
#define SOIL_PIN 34 // Analog Pin for Soil Moisture Sensor
#define PIEZO_PIN 35 // Analog Pin for Piezometer (Pore Pressure Sensor)
#define DHT_TYPE DHT22
// Thresholds for landslide detection
#define SOIL_MOISTURE_THRESHOLD 60.0 // Soil moisture threshold in percentage
#define TEMP_THRESHOLD 35.0 // Temperature threshold in °C
#define HUMIDITY_THRESHOLD 90.0 // Humidity threshold in %
#define ACCEL_THRESHOLD 1.5 // Sudden acceleration in m/s²
#define PORE_PRESSURE_THRESHOLD 70.0 // Threshold for pore water pressure (0-100 scaled)
// Sensor Instances
DHT dht(DHT_PIN, DHT_TYPE);
Adafruit_MPU6050 mpu;
// Function to scale analogRead() values to floating-point percentages
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void setup() {
Serial.begin(115200);
dht.begin();
Wire.begin();
// MPU6050 Initialization
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 sensor!");
while (1);
}
Serial.println("MPU6050 Found!");
Serial.println("Landslide Monitoring System Initialized.");
}
void loop() {
float soilMoisture = readSoilMoisture();
float porePressure = readPorePressure();
float temperature, humidity;
readDHT22(&temperature, &humidity);
float accel = readAcceleration();
// Print all sensor readings
Serial.print("Soil Moisture: ");
Serial.printf("%.2f%% | ", soilMoisture);
Serial.print("Pore Pressure: ");
Serial.printf("%.2f | ", porePressure);
Serial.print("Temperature: ");
Serial.printf("%.2f°C | ", temperature);
Serial.print("Humidity: ");
Serial.printf("%.2f%% | ", humidity);
Serial.print("Acceleration: ");
Serial.printf("%.2f m/s²\n", accel);
// Check for Landslide Conditions
if (soilMoisture > SOIL_MOISTURE_THRESHOLD) {
Serial.println("ALERT: Soil Moisture Threshold Breached!");
}
if (porePressure > PORE_PRESSURE_THRESHOLD) {
Serial.println("ALERT: Pore Pressure Threshold Breached!");
}
if (temperature > TEMP_THRESHOLD) {
Serial.println("ALERT: Temperature Threshold Breached!");
}
if (humidity > HUMIDITY_THRESHOLD) {
Serial.println("ALERT: Humidity Threshold Breached!");
}
if (accel > ACCEL_THRESHOLD) {
Serial.println("ALERT: Sudden Acceleration Detected!");
}
if (soilMoisture <= SOIL_MOISTURE_THRESHOLD &&
porePressure <= PORE_PRESSURE_THRESHOLD &&
temperature <= TEMP_THRESHOLD &&
humidity <= HUMIDITY_THRESHOLD &&
accel <= ACCEL_THRESHOLD) {
Serial.println("System Normal.");
}
delay(10); // Wait for 2 seconds before the next reading
}
// Function to read soil moisture
float readSoilMoisture() {
int rawValue = analogRead(SOIL_PIN);
return mapFloat(rawValue, 0, 4095, 0.0, 100.0); // Scale to percentage
}
// Function to read pore pressure
float readPorePressure() {
int rawValue = analogRead(PIEZO_PIN);
return mapFloat(rawValue, 0, 4095, 0.0, 100.0); // Scale to