#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#define TRIG_PIN 12
#define ECHO_PIN 13
#define BUTTON_PIN 7
#define BUZZER_PIN 8
#define LED_GREEN 2
#define LED_YELLOW 4
#define LED_RED 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
float maxVisina = 200.0; // cm
bool alarmAktiven = false;
bool rtcPovezan = false;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inicializacija");
if (rtc.begin()) {
rtcPovezan = true;
if (rtc.lostPower()) rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
lcd.setCursor(0, 1);
lcd.print("RTC OK");
} else {
lcd.setCursor(0, 1);
lcd.print("RTC napaka!");
}
delay(1000);
lcd.clear();
}
long izmeriRazdaljo() {
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long traj = pulseIn(ECHO_PIN, HIGH);
return traj * 0.034 / 2;
}
bool readButton() {
static bool last = HIGH;
bool s = digitalRead(BUTTON_PIN);
if (s != last) { delay(50); s = digitalRead(BUTTON_PIN); }
last = s;
return s;
}
void loop() {
long raz = izmeriRazdaljo();
if (raz <= 0 || raz > maxVisina) raz = maxVisina;
int procent = constrain(((maxVisina - raz) / maxVisina) * 100, 0, 100);
// Zapis na LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nivo: ");
lcd.print(procent);
lcd.print("%");
// Kontrolne diode
digitalWrite(LED_GREEN, procent > 70);
digitalWrite(LED_YELLOW, procent > 30 && procent <= 70);
digitalWrite(LED_RED, procent <= 30);
// Alarm
if (procent < 20 && !alarmAktiven) {
digitalWrite(BUZZER_PIN, HIGH);
if (rtcPovezan) {
Serial.print("Kriticen nivo ob: ");
Serial.println(rtc.now().timestamp());
}
alarmAktiven = true;
}
if ((procent >= 20 && alarmAktiven) || readButton() == LOW) {
digitalWrite(BUZZER_PIN, LOW);
alarmAktiven = false;
}
Serial.print("Razdalja=");
Serial.print(raz);
Serial.print("cm, Nivo=");
Serial.print(procent);
Serial.println("%");
delay(1000);
}