Arduino Mega 2560-Based Obstacle Detection and Water Sensing System with Ultrasonic Sensors and Emergency Features
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This document provides a detailed overview of a circuit designed to detect obstacles and water using multiple ultrasonic sensors, a soil sensor, a vibration motor, a buzzer, and an emergency rocker switch. The circuit is controlled by an Arduino Mega 2560 microcontroller, which processes sensor data and activates the vibration motor and buzzer accordingly.
Component List
Rocker Switch
- Pins: 1, 2
- Description: A switch used to activate emergency mode.
- Purpose: To manually trigger an emergency state in the system.
HC-SR04 Ultrasonic Sensor
- Pins: VCC, TRIG, ECHO, GND
- Description: Ultrasonic sensor for distance measurement.
- Purpose: To detect obstacles at various heights and water levels.
Vibration Motor
- Pins: +, -
- Description: A motor that provides haptic feedback.
- Purpose: To alert the user of detected obstacles through vibration.
Buzzer
- Pins: GND, IN
- Description: An audio device that emits sound.
- Purpose: To alert the user of detected water or emergency state.
LiPo Battery 2200mAH 30C
- Pins: VCC, GND
- Description: A rechargeable battery.
- Purpose: To power the entire circuit.
Arduino Mega 2560
- Pins: IOREF, RESET, 3V3, 5V, GND, VIN, A0-A15, D0-D53, AREF, SDA, SCL
- Description: A microcontroller board.
- Purpose: To control the circuit and process sensor data.
Soil Sensor
- Pins: VCC, GND, D0, A0
- Description: A sensor to measure soil moisture.
- Purpose: To detect water levels.
Wiring Details
Rocker Switch
- Pin 1 connected to Arduino Mega 2560 D8 PWM
- Pin 2 connected to Ground (GND)
HC-SR04 Ultrasonic Sensor (Upper)
- VCC connected to 5V
- TRIG connected to D2 PWM
- ECHO connected to D3 PWM
- GND connected to Ground (GND)
HC-SR04 Ultrasonic Sensor (Middle)
- VCC connected to 5V
- TRIG connected to D4 PWM
- ECHO connected to D5 PWM
- GND connected to Ground (GND)
HC-SR04 Ultrasonic Sensor (Bottom)
- VCC connected to 5V
- TRIG connected to D12 PWM
- ECHO connected to D13 PWM
- GND connected to Ground (GND)
HC-SR04 Ultrasonic Sensor (Water)
- VCC connected to 5V
- TRIG connected to D10 PWM
- ECHO connected to D11 PWM
- GND connected to Ground (GND)
Vibration Motor
- + connected to Arduino Mega 2560 D9 PWM
- - connected to Ground (GND)
Buzzer
- IN connected to Arduino Mega 2560 D7 PWM
- GND connected to Ground (GND)
LiPo Battery 2200mAH 30C
- VCC connected to VIN
- GND connected to Ground (GND)
Soil Sensor
- VCC connected to 5V
- GND connected to Ground (GND)
- D0 connected to D10 PWM
Code Documentation
#include <Arduino.h>
#include <NewPing.h>
// Pin Definitions
#define TRIG_PIN_UPPER 2 // Upper ultrasonic sensor (obstacles above user)
#define ECHO_PIN_UPPER 3
#define TRIG_PIN_MIDDLE 4 // Middle ultrasonic sensor (front obstacles)
#define ECHO_PIN_MIDDLE 5
#define TRIG_PIN_WATER 10 // Bottom ultrasonic sensor (water detection)
#define ECHO_PIN_WATER 11
#define TRIG_PIN_BOTTOM 12 // Bottom ultrasonic sensor (replacing IR)
#define ECHO_PIN_BOTTOM 13
#define VIBRATION_MOTOR_PIN 9
#define ROCKER_SWITCH_PIN 8 // Emergency rocker switch
#define BUZZER_PIN 7
// Constants
#define MAX_DISTANCE 200 // Maximum distance in cm for ultrasonic sensors
#define WATER_THRESHOLD 10 // Threshold for water detection in cm
#define DETECTION_DELAY 100 // Delay between detection cycles
#define PWM_HIGH 255 // High-speed vibration
#define PWM_MEDIUM 128 // Medium-speed vibration
#define PWM_LOW 64 // Low-speed vibration
// Objects for ultrasonic sensors
NewPing sonarUpper(TRIG_PIN_UPPER, ECHO_PIN_UPPER, MAX_DISTANCE);
NewPing sonarMiddle(TRIG_PIN_MIDDLE, ECHO_PIN_MIDDLE, MAX_DISTANCE);
NewPing sonarWater(TRIG_PIN_WATER, ECHO_PIN_WATER, MAX_DISTANCE);
NewPing sonarBottom(TRIG_PIN_BOTTOM, ECHO_PIN_BOTTOM, MAX_DISTANCE);
// Global Variables
volatile bool emergencyActive = false; // Emergency flag
void setup() {
pinMode(VIBRATION_MOTOR_PIN, OUTPUT);
pinMode(ROCKER_SWITCH_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
// Interrupt for emergency rocker switch
attachInterrupt(digitalPinToInterrupt(ROCKER_SWITCH_PIN), handleEmergencyInterrupt, CHANGE);
// Start Serial for debugging
Serial.begin(9600);
Serial.println("System Initialized.");
}
void loop() {
if (emergencyActive) {
// Activate buzzer for emergency
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Emergency Mode Active! Buzzer ON.");
} else {
// Turn off emergency buzzer and handle other functionality
digitalWrite(BUZZER_PIN, LOW);
handleUpperSensor();
handleMiddleSensor();
handleBottomSensor();
handleWaterDetection();
}
delay(DETECTION_DELAY); // Small delay between cycles
}
// Interrupt Service Routine for Emergency System
void handleEmergencyInterrupt() {
emergencyActive = (digitalRead(ROCKER_SWITCH_PIN) == LOW);
Serial.print("Emergency Switch State Changed. Emergency Active: ");
Serial.println(emergencyActive);
}
// Function to handle upper ultrasonic sensor
void handleUpperSensor() {
int distance = sonarUpper.ping_cm();
Serial.print("Upper Sensor Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (distance > 0 && distance <= 50) {
Serial.println("Obstacle detected above. Vibrating motor at HIGH speed.");
for (int i = 0; i < 3; i++) { // Vibrate 3 times
analogWrite(VIBRATION_MOTOR_PIN, PWM_HIGH);
delay(400);
analogWrite(VIBRATION_MOTOR_PIN, 0);
delay(400); // Adjust the pause between vibrations
}
} else if (distance > 50 && distance <= 100) {
Serial.println("Obstacle detected above. Vibrating motor at MEDIUM speed.");
for (int i = 0; i < 3; i++) { // Vibrate 3 times
analogWrite(VIBRATION_MOTOR_PIN, PWM_MEDIUM);
delay(400);
analogWrite(VIBRATION_MOTOR_PIN, 0);
delay(400);
}
} else if (distance > 100 && distance <= 200) {
Serial.println("Obstacle detected above. Vibrating motor at LOW speed.");
for (int i = 0; i < 3; i++) { // Vibrate 3 times
analogWrite(VIBRATION_MOTOR_PIN, PWM_LOW);
delay(400);
analogWrite(VIBRATION_MOTOR_PIN, 0);
delay(400);
}
} else {
Serial.println("No obstacle above. Motor OFF.");
analogWrite(VIBRATION_MOTOR_PIN, 0);
}
}
// Function to handle middle ultrasonic sensor
void handleMiddleSensor() {
int distance = sonarMiddle.ping_cm();
Serial.print("Middle Sensor Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (distance > 0 && distance <= 50) {
Serial.println("Obstacle detected in front. Vibrating motor at HIGH speed.");
for (int i = 0; i < 2; i++) { // Vibrate 2 times
analogWrite(VIBRATION_MOTOR_PIN, PWM_HIGH);
delay(400);
analogWrite(VIBRATION_MOTOR_PIN, 0);
delay(400); // Adjust the pause between vibrations
}
} else if (distance > 50 && distance <= 100) {
Serial.println("Obstacle detected in front. Vibrating motor at MEDIUM speed.");
for (int i = 0; i < 2; i++) { // Vibrate 2 times