#include "DHT.h"
#include <Servo.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#define ECHO 2
#define TRIG 3
#define BUZZER 5
#define DHTPIN 4
#define DHTTYPE DHT22
Servo myservo;
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
int servoPosition = 0;
float distance;
const char* daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
lcd.init();
lcd.backlight();
dht.begin();
myservo.attach(9);
myservo.write(0);
lcd.setCursor(0, 0);
//01234567890123456789
lcd.print(" ");
lcd.setCursor(0, 1);
//01234567890123456789
lcd.print(" Automatic Gate ");
lcd.setCursor(0, 2);
//01234567890123456789
lcd.print(" Barrier System ");
lcd.setCursor(0, 3);
//01234567890123456789
lcd.print(" ");
delay(3000);
lcd.clear();
lcd.setCursor(0, 3);
//01234567890123456789
lcd.print(" No Train ");
}
void loop() {
displayTime();
measureAndControlServo();
delay(1000); // Update every second
}
void print2digits(int number) {
if (number < 10) {
lcd.print('0');
}
lcd.print(number);
}
void displayTime() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
print2digits(now.day());
lcd.print('/');
print2digits(now.month());
lcd.print('/');
lcd.print(now.year());
lcd.setCursor(11, 0);
print2digits(now.hour());
lcd.print(':');
print2digits(now.minute());
lcd.print(':');
print2digits(now.second());
int dayOfWeekIndex = now.dayOfTheWeek();
const char* dayOfWeek = daysOfTheWeek[dayOfWeekIndex];
int cursorPosition = (dayOfWeekIndex == 3) ? 5 : (dayOfWeekIndex % 2 == 0) ? 6 : 7;
lcd.setCursor(cursorPosition, 1);
lcd.print(dayOfWeek);
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.setCursor(0, 2);
//01234567890123456789
lcd.print(" ");
delay(10);
lcd.setCursor(0, 2);
//01234567890123456789
lcd.print("T : ");
lcd.print(int(t));
lcd.print("*C");
lcd.setCursor(12, 2);
lcd.print("RH: ");
lcd.print(int(h));
lcd.print("%");
}
void readDistanceCM() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
int duration = pulseIn(ECHO, HIGH);
distance = (duration / 2.0) / 29.1;
}
void measureAndControlServo() {
readDistanceCM();
if (distance <= 100) {
if (servoPosition == 0) {
lcd.setCursor(0, 3);
//01234567890123456789
lcd.print("The Train is Coming");
moveServo(0, 90, 5);
}
servoPosition = 90;
buz();
} else {
if (servoPosition == 90) {
lcd.setCursor(0, 3);
//01234567890123456789
lcd.print(" No Train ");
moveServo(90, 0, -5);
}
servoPosition = 0;
noTone(BUZZER);
}
}
void moveServo(int start, int end, int step) {
for (int pos = start; pos != end; pos += step) {
myservo.write(pos);
buz();
}
myservo.write(end);
}
void buz() {
tone(BUZZER, 1000);
delay(100);
tone(BUZZER, 500);
delay(100);
}