#include <LiquidCrystal_I2C.h> //dyrektywa
//dyrektywy preprocesora dotyczace wyswietlacza
#define LCD_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
//dyrektywy preprocesora dotyczace czujnika
#define trig 3
#define echo 2

// diodki z przypisanymi numerami PWM
int g = 11;
int y = 12;
int r = 13;

// tworzneie obiektu z parametrami
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_ROWS);

void setup() {
  Serial.begin(9600); // inicjacja portu szeregowego
  // inicjacja wyswietlacza
  lcd.begin(16, 2);
  lcd.init();
  lcd.backlight();

  pinMode(r, OUTPUT); // dioda czerwona
  pinMode(y, OUTPUT); // dioda zolta
  pinMode(g, OUTPUT); // dioda zielona
  pinMode(trig, OUTPUT); // triger czujnika
  pinMode(echo, INPUT); // echo czujnika

}

void loop() {
  float czas,odl; // parametry zmiennoprzecnikowe 
  digitalWrite(trig, HIGH); // wygenerowanie sygnału ultradźwiękowego
  delayMicroseconds(1000); //czas trwania impulsu ultradźwiękowego
  digitalWrite(trig, LOW); //kończy impuls ultradźwiękowy i przygotowuje czujnik do odbierania odbitego sygnału
  czas = pulseIn(echo, HIGH);  // czas między wysłaniem sygnału ultradźwiękowego a jego odbiciem
  odl = (czas/2) /29.1; //odległość do obiektu

  if (odl <=30) //odelgłość mniejsza do 30 cm
  { //wyswietlacz
    lcd.setCursor(1,0);
	  lcd.print("BARDZO  BLISKO");
    lcd.setCursor(6,1);
    lcd.print(odl,2);
    lcd.setCursor(10,1);
    lcd.print("cm");
    // Port szeregowy
    Serial.print("BARDZO BLISKO");
    Serial.print("\t");
    Serial.print(odl, 2);
    Serial.println(" cm");
    // diody
    digitalWrite(r, HIGH);
    digitalWrite(y, LOW);
    digitalWrite(g, LOW);

    delay(300);
    lcd.clear();
    lcd.setCursor(4,0);
    lcd.print("UWAGA !!!");
    delay(300);
    lcd.clear();
  }

  if (odl <=50 && odl>30) // odległość z zakresu 30 - 50 cm
  {
    //wyswietlacz
    lcd.setCursor(5,0);
	  lcd.print("BLISKO");
    lcd.setCursor(5,1);
    lcd.print(odl,2);
    lcd.setCursor(10,1);
    lcd.print("cm");
     // Port szeregowy
    Serial.print("BLISKO");
    Serial.print("\t");
    Serial.print(odl, 2);
    Serial.println(" cm");
    // diody
    digitalWrite(y, HIGH);
    digitalWrite(r, LOW);
    digitalWrite(g, LOW);

    delay(500);
    lcd.clear();
  }

  if (odl >50) // Odległość jest większa od 50 cm
  {
    //wyswietlacz
    lcd.setCursor(5,0);
	  lcd.print("DALEKO");
    lcd.setCursor(5,1);
    lcd.print(odl,2);
    lcd.setCursor(11,1);
    lcd.print("cm");
     // Port szeregowy
    Serial.print("DALEKO");
    Serial.print("\t");
    Serial.print(odl, 2);
    Serial.println(" cm");
    // diody
    digitalWrite(g, HIGH);
    digitalWrite(y, LOW);
    digitalWrite(r, LOW);

    delay(900);
    lcd.clear();
  }
}