/* ----------------------------------------------------------------
  Arduino Ultrasoninc Sensor HC-SR04
  Re-writed by Arbi Abdul Jabbaar
  Using Arduino IDE 1.8.7
  Using HC-SR04 Module
  Tested on 17 September 2019
  Re-re-writed by Barbu Vulc
  Using Arduino IDE 2.0.0
  Tested on 31 March & 1, 2, 3 & 4 April 2022
  ---------------------------------------------------------------- */
//LCD I2C library:
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
//LCD I2C address 0x27, 20 column and 4 rows!
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define echoPin 2 //attach pin D2 Arduino to pin Echo of HC-SR04
#define trigPin 3 //attach pin D3 Arduino to pin Trig of HC-SR04
// defines variables
long duration; //variable for the duration of sound wave travel
int distance;  //variable for the distance measurement
int LED_1 = 5; //Green LED...
int LED_2 = 6; //Yellow LED...
int LED_3 = 7; //Red LED...
int buzzer = 12;
void setup() {
  //Initialize LCD, LEDs and buzzer:
  lcd.init();
  lcd.backlight();
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(trigPin, OUTPUT); //Sets the trigPin as an OUTPUT
  pinMode(echoPin, INPUT);  //Sets the echoPin as an INPUT
  pinMode(buzzer, OUTPUT);
  //Serial Communication is starting with 9600 of baudrate speed
  Serial.begin(9600);
  //Print some text in Serial Monitor
  Serial.println("Ultrasonic Sensor HC-SR04 Test");
  Serial.println("with Arduino UNO R3");
}
void loop() {
  //Clears the trigPin condition
  digitalWrite(trigPin, LOW);
  delay(100);
  //Sets the trigPin HIGH (ACTIVE) for 10 microseconds
  digitalWrite(trigPin, HIGH);
  delay(100);
  digitalWrite(trigPin, LOW);
  //Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  //Calculating the distance
  distance = duration * 0.034 / 2; //Speed of sound wave divided by 2 (go and back)
  //Displays the distance on the Serial Monitor and LCD!
  if (distance >= 56) {
    lcd.setCursor(0, 0);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 1);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 2);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 3);
    lcd.println("  ****************  ");
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, LOW);
    digitalWrite(LED_3, LOW);
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
    digitalWrite(buzzer, 0);
  }
  if (distance >= 26 && distance <= 55) {
    lcd.setCursor(0, 0);
    lcd.println("     You're ok!     ");
    lcd.setCursor(0, 1);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 2);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 3);
    lcd.println("  ****************  ");
    digitalWrite(LED_1, HIGH);
    digitalWrite(LED_2, LOW);
    digitalWrite(LED_3, LOW);
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
    digitalWrite(buzzer, 0);
  }
  if (distance >= 6 && distance <= 25) {
    lcd.setCursor(0, 0);
    lcd.println("  Beware of...");
    lcd.setCursor(0, 1);
    lcd.println(" ...surrounding ...");
    lcd.setCursor(0, 2);
    lcd.println("... objects!       ");
    lcd.setCursor(0, 3);
    lcd.println("  ****************  ");
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, HIGH);
    digitalWrite(LED_3, LOW);
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
    digitalWrite(buzzer, 1);
    tone(buzzer, 500, 400);
    delay(400);
    digitalWrite(buzzer, 0);
    tone(buzzer, 500, 400);
    delay(400);
  }
  if (distance <= 5) {
    lcd.setCursor(0, 0);
    lcd.println("   WATCH OUT!!!...  ");
    lcd.setCursor(0, 1);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 2);
    lcd.println("  ****************  ");
    lcd.setCursor(0, 3);
    lcd.println("  ****************  ");
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, LOW);
    digitalWrite(LED_3, HIGH);
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
    digitalWrite(buzzer, 1);
    tone(buzzer, 1000, 100);
    delay(100);
    digitalWrite(buzzer, 0);
    tone(buzzer, 1000, 100);
    delay(100);
  }
}