/****************************************************
 * DS18B20 hőmérő + 16x2 I2C LCD kijelző (Arduino Uno)
 * Szenzor: DS18B20 - adatvonal D6-ra
 * Kijelző: I2C 16x2 LCD (0x27 vagy 0x3F cím)
 * 
 * Követelmények:
 *  - Temp : XX.X °C formátum
 *  - Tartomány: -30°C … +50°C
 *  - Hibakezelés: Error / Too low / Too high
 ****************************************************/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// --- DS18B20 lábak definiálása ---
#define ONE_WIRE_BUS 6

// OneWire és DallasTemperature objektumok létrehozása
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// --- LCD beállítás ---
// Leggyakoribb címek: 0x27 vagy 0x3F
#define LCD_ADDRESS 0x27
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);

// --- Hőmérséklet tartomány ---
const float TEMP_MIN = -30.0;
const float TEMP_MAX = 50.0;

// --- Inicializálás ---
void setup() {
  // LCD indítása
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Initializing...");
  
  // Szenzor indítása
  sensors.begin();
  
  delay(1000);
  lcd.clear();
}

// --- Folyamatos futás ---
void loop() {

  sensors.requestTemperatures();  // Mérési kérés a szenzorhoz
  float temperatureC = sensors.getTempCByIndex(0); // Első szenzor értéke

  lcd.clear();
  lcd.setCursor(0,0);

  // Hibakezelés: ha nem elérhető a szenzor
  if (temperatureC == DEVICE_DISCONNECTED_C) {
    lcd.print("Temp : Error");
  } 
  else {
    // Tartomány ellenőrzés
    if (temperatureC < TEMP_MIN) {
      lcd.print("Temp : Too low");
    } 
    else if (temperatureC > TEMP_MAX) {
      lcd.print("Temp : Too high");
    } 
    else {
      // Érték kiírása 1 tizedesjeggyel
      lcd.print("Temp : ");
      lcd.print(temperatureC, 1);
      lcd.print(" \xDF""C"); // ° jel kiírása
    }
  }

  delay(1000); // Frissítési ciklus
}