#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 10
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define echoPin 12
#define trigPin 11
#define menuButton 2
#define ledCrash 9
#define ledAttention 6
#define alarmBuzzer 5
volatile byte menu = 1;
bool volatile isMenuButtonPressed = false;
int maxRange = 450;
long duration, distance;
LiquidCrystal_I2C lcd(0x27,20,4);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledAttention, OUTPUT);
pinMode(ledCrash, OUTPUT);
pinMode(alarmBuzzer, OUTPUT);
pinMode(menuButton, INPUT_PULLUP);
lcd.print("System Booted");
lcd.setCursor(0,1);
lcd.print("Parking Radar");
lcd.setCursor(0,2);
lcd.print("Programmer");
lcd.setCursor(0,3);
lcd.print("Nick Andrikopoulos");
dht.begin();
delay(3000);
attachInterrupt(digitalPinToInterrupt(menuButton), checkMenuButton, FALLING);
}
void loop() {
if(menu == 1){
parkingRadar();
}else if(menu == 2){
temperature();
}
}
void checkMenuButton(){
menu++;
if(menu > 2)
menu = 1;
}
void resetComponents(){
lcd.clear();
lcd.home();
digitalWrite(ledAttention, LOW);
digitalWrite(ledCrash, LOW);
noTone(alarmBuzzer);
tone(alarmBuzzer, 1500, 15);
}
void parkingRadar(){
resetComponents();
lcd.print("Remain distance");
Serial.println("Parking randar");
long buzzerMillis = 0;
while(menu == 1){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration / 58.2;
Serial.println(distance);
if(distance >= maxRange){
Serial.println("Out of bounds");
lcd.setCursor(0,1);
lcd.print("?? ");
digitalWrite(ledAttention, LOW);
digitalWrite(ledCrash, LOW);
delay(10);
}
else if (distance >= 21 && distance < 50){
if(millis()- buzzerMillis > distance * 10){
//if(millis()- buzzerMillis > 500){
tone(alarmBuzzer, 1000, 50);
buzzerMillis = millis();
}
digitalWrite(ledAttention, HIGH);
digitalWrite(ledCrash, LOW);
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm");
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("ATTENTION");
delay(10);
}
else if(distance <= 20){
tone(alarmBuzzer, 1000);
digitalWrite(ledAttention, LOW);
digitalWrite(ledCrash, HIGH);
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm");
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("DANGER");
lcd.print(" ");
delay(10);
}
else{
noTone(alarmBuzzer);
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print(" cm");
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
digitalWrite(ledAttention, LOW);
digitalWrite(ledCrash, LOW);
delay(10);
}
}
}
void temperature(){
long tm = 0;
resetComponents();
lcd.setCursor(0,0); lcd.print("TEMPERATURE: ");
lcd.setCursor(0,1); lcd.print("HUMIDITY: ");
Serial.println("Temperature Control");
while(menu == 2){
if( millis() - tm > 3000 ){
tm = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
lcd.clear();
lcd.setCursor(4,1); lcd.print("DHT22 sensor");
lcd.setCursor(7,2); lcd.print("failed");
tone(alarmBuzzer, 500, 15);
}else{
lcd.setCursor(13,0); lcd.print(" ");
lcd.setCursor(13,0); lcd.print(t);
lcd.setCursor(10,1); lcd.print(" ");
lcd.setCursor(10,1); lcd.print(h); lcd.print("%");
Serial.print("TEMPERATURE: ");
Serial.print(t);
Serial.print(" HUMIDITY: ");
Serial.print(h);
Serial.println("%");
}
}
}
}