#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Adafruit_MPU6050.h>
// Δημιουργία αντικειμένων για το LCD και το Servo
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ρύθμιση της LCD με I2C διεύθυνση 0x27
Servo myServo;
bool Start_Counter = false;
// Ορισμός των pins
const int ledPin1 = 13; // Πορτα κλειστή κόκκινο
const int ledPin2 = 12; // Πορτα ανοικτή πράσσινο
const int buzzerPin = 10; // Pin για τον Buzzer
const int trigPin = 8; // Pin για το Trig του ultrasonic
const int echoPin = 9; // Pin για το Echo του ultrasonic
// Δημιουργία αντικειμένου για τον αισθητήρα MPU6050
Adafruit_MPU6050 mpu;
// Threshold for earthquake detection based on acceleration (in m/s^2)
const float threshold = 4.5; // You can adjust this value based on the sensitivity you need
int counter = 0; // Counter for objects closer than 1 meter
void setup() {
// Αρχικοποίηση του LCD και του Servo
lcd.begin(16, 2);
lcd.backlight();
myServo.attach(11); // Ρύθμιση του servo στο pin 11
// Ρύθμιση των pins για LEDs και Buzzer
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
mpu.begin();
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
}
void loop() {
digitalWrite(ledPin1, HIGH); // Ανάβει το πράσινο LED (ανοίγει η πόρτα)
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Υπολογισμός επιτάχυνσης
float totalAcceleration = sqrt(a.acceleration.x +
a.acceleration.y +
a.acceleration.z );
// Ελέγχουμε αν η συνολική επιτάχυνση ξεπερνά το κατώφλι για σεισμό
if (totalAcceleration > threshold) {
myServo.write(90); // Ανοίγει την πόρτα
// Βήματα κατά τη διάρκεια του σεισμού για 5 δευτερόλεπτα
digitalWrite(ledPin1, LOW); // Σβήνει το κόκκινο LED (κλείνει η πόρτα)
digitalWrite(ledPin2, HIGH); // Ανάβει το πράσινο LED (ανοίγει η πόρτα)
tone(buzzerPin, 1000); // Ενεργοποιεί τον buzzer με συχνότητα 1000 Hz
lcd.setCursor(0, 0); // Ρύθμιση του cursor στην αρχή
lcd.print("Total Acc: ");
lcd.print(totalAcceleration, 2); // Στρογγυλοποίηση σε 2 δεκαδικά
lcd.setCursor(0, 1);
lcd.print("Quake !");
lcd.setCursor(7, 1);
lcd.print("Door Open!");
if ((totalAcceleration > threshold)) {
Start_Counter = true; //χρησιμοποιούμε ένα flag για να ξέρουμε πότε ξεκινάει
// η καταμέτρηση κ να μπορούμε να την σταματήσουμε μετα το πέρας των 5 δευτερολέπτων
if(Start_Counter){
// Μετράμε αντικείμενα που είναι κοντά κατά τη διάρκεια της καθυστέρησης
// Ενεργοποίηση του ultrasonic sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Ανάγνωση από το echoPin
long duration = pulseIn(echoPin, HIGH);
// Υπολογισμός απόστασης σε μέτρα
float distance = (duration * 0.034) / 2;
lcd.setCursor(0, 1);
lcd.print("countedPersons");
lcd.print(counter);
// Έλεγχος αν η απόσταση είναι κάτω από 10 μέτρa
if (distance < 10.0) {
counter++; // Αύξηση του μετρητή
delay(300);
}
delay(200); // 100ms delay between ultrasonic readings
}
//περιμένουμε 5 δευτερόλεπτα έως να κλείσει ξανα η πόρτα
delay(5000);
Start_Counter =false;
}
}
else {
// Δεν ανιχνεύτηκε σεισμός
digitalWrite(ledPin1, HIGH); // Ανάβει το κόκκινο LED (κλείνει η πόρτα)
digitalWrite(ledPin2, LOW); // Σβήνει το πράσινο LED (ανοικτή πόρτα)
noTone(buzzerPin); // Σβήνει τον buzzer
lcd.setCursor(0, 0); // Ρύθμιση του cursor στην αρχή
lcd.print("Total Acc: ");
lcd.print(totalAcceleration, 2); // Στρογγυλοποίηση σε 2 δεκαδικά
lcd.setCursor(0, 1);
lcd.print("Door is Closed !");
myServo.write(0); // Κλείνει η πόρτα
}
}