#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Δημιουργία αντικειμένων για το LCD και το Servo
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ρύθμιση της LCD με I2C διεύθυνση 0x27
Servo myServo;
// Ορισμός των pins
const int sensorPin = 2; // Pin του αισθητήρα σεισμού (SW-420)
const int ledPin1 = 13; // Πορτα κλειστή κόκκινο
const int ledPin2 = 12; // Πορτα ανοικτή πράσσινο
//const int ledPin1 = 8; // Pin για το κόκκινο LED (κλειστή πόρτα)
//const int ledPin2 = 9; // Pin για το πράσινο LED (ανοιχτή πόρτα)
const int buzzerPin = 10; // Pin για τον Buzzer
int sensorValue = 0; // Αξία από τον αισθητήρα σεισμού
// Χρόνος για την τυχαία "δόνηση"
unsigned long previousMillis = 0;
const long interval = 5000; // Ελέγχει την δόνηση κάθε 5 δευτερόλεπτα
bool shakeDetected = false;
int doorPosition = 0; // Θέση της πόρτας (0 = κλειστή, 90 = ανοιχτή)
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(sensorPin, INPUT);
// Εμφάνιση του αρχικού μηνύματος στην LCD
lcd.print("Waiting for quake...");
}
void loop() {
// Λήψη του τρέχοντος χρόνου
unsigned long currentMillis = millis();
// Αν περάσουν 5 δευτερόλεπτα, προσομοιώνουμε μια σεισμική δόνηση
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Ενημέρωση του χρόνου
shakeDetected = true; // Προσομοιώνουμε ότι εντοπίστηκε δόνηση
}
// Ανιχνεύουμε σεισμό ή προσομοιώνουμε δόνηση
if (shakeDetected || digitalRead(sensorPin) == HIGH) {
// Ανιχνεύτηκε σεισμός ή προσομοιώθηκε δόνηση
digitalWrite(ledPin1, LOW); // Σβήνει το κόκκινο LED (κλείνει η πόρτα)
digitalWrite(ledPin2, HIGH); // Ανάβει το πράσινο LED (ανοίγει η πόρτα)
tone(buzzerPin, 1000); // Ενεργοποιεί τον buzzer με συχνότητα 1000 Hz
// Κίνηση του servo (πορτάκι ανοιχτό/κλειστό)
if (doorPosition == 0) {
myServo.write(90); // Ανοίγει την πόρτα
doorPosition = 90; // Θέση της πόρτας (ανοιχτή)
lcd.clear();
lcd.print("Door opened!");
} else {
myServo.write(0); // Κλείνει την πόρτα
doorPosition = 0; // Θέση της πόρτας (κλειστή)
lcd.clear();
lcd.print("Door closed!");
}
// Εμφάνιση του μηνύματος σεισμού στην LCD
lcd.setCursor(0, 1);
lcd.print("Earthquake detected!");
shakeDetected = false; // Επαναφορά του flag για την προσομοίωση
delay(5000); // Μήνυμα για 5 δευτερόλεπτα
} else {
digitalWrite(ledPin1, HIGH); // Ανάβει το κόκκινο LED (κλείνει η πόρτα)
digitalWrite(ledPin2, LOW); // Σβήνει το πράσινο LED (ανοιχτή πόρτα)
noTone(buzzerPin); // Σβήνει τον buzzer
// Εμφάνιση μηνύματος χωρίς σεισμό στην LCD
lcd.clear();
lcd.print("No Quake");
// Εμφάνιση της κατάστασης της πόρτας
lcd.setCursor(0, 1);
if (doorPosition == 0) {
lcd.print("Door closed.");
} else {
lcd.print("Door open.");
}
}
delay(500); // Παύση 500ms πριν την επανεκκίνηση της διαδικασίας
}
ERC Warnings
gnd1:GND: Short circuit