/*
 * ============================================================
 *  Lecture Température + Humidité — DHT22
 *  Affichage sur LCD 16×2 caractères en I²C
 *  Version 1.0 — Mai 2026 — ECOPHOT
 * ============================================================
 *
 *  Matériel :
 *    - Arduino Uno / Nano / Mega
 *    - Capteur DHT22 (AM2302)
 *    - LCD 16×2 avec module I²C PCF8574 (adresse 0x27 ou 0x3F)
 *
 *  Câblage DHT22 :
 *    VCC  → 5 V
 *    GND  → GND
 *    DATA → D2  (+résistance pull-up 10 kΩ entre DATA et VCC)
 *
 *  Câblage LCD I²C (Uno / Nano) :
 *    VCC → 5 V  |  GND → GND  |  SDA → A4  |  SCL → A5
 *    (Mega : SDA = 20, SCL = 21)
 *
 *  Bibliothèques requises (Gestionnaire de bibliothèques Arduino IDE) :
 *    - "DHT sensor library"   by Adafruit   (+ "Adafruit Unified Sensor")
 *    - "LiquidCrystal I2C"    by Frank de Brabander
 *
 *  Licence : MIT — ecophot.fr
 * ============================================================
 */

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// ── Broche et type du capteur ─────────────────────────────────────────────────
#define DHT_PIN   2       // Broche DATA du DHT22
#define DHT_TYPE  DHT22   // DHT22 / AM2302

// Délai minimum entre deux lectures (le DHT22 ne supporte pas moins de 2 s)
#define DELAI_MS  2000

// ── Objets ────────────────────────────────────────────────────────────────────
DHT dht(DHT_PIN, DHT_TYPE);

// Adresse I²C : 0x27 (PCF8574) ou 0x3F (PCF8574A)
// Si l'écran reste noir après init, essayer 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);

// ── Caractère personnalisé : symbole ° (degré) ────────────────────────────────
byte charDegre[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

// ─────────────────────────────────────────────────────────────────────────────
void setup() {
  Serial.begin(9600);
  Serial.println(F("DHT22 + LCD I2C — Ecophot.fr"));

  dht.begin();

  lcd.init();
  lcd.backlight();
  lcd.createChar(0, charDegre);  // Charge le symbole ° en position 0

  // Écran de bienvenue
  lcd.setCursor(2, 0);
  lcd.print(F("Ecophot.fr"));
  lcd.setCursor(1, 1);
  lcd.print(F("DHT22 + LCD I2C"));
  delay(2000);
  lcd.clear();
}

// ─────────────────────────────────────────────────────────────────────────────
void loop() {
  float humidite    = dht.readHumidity();
  float temperature = dht.readTemperature();  // Celsius

  // Vérification : NaN = capteur absent ou câblage incorrect
  if (isnan(humidite) || isnan(temperature)) {
    lcd.setCursor(0, 0);
    lcd.print(F("Erreur capteur! "));
    lcd.setCursor(0, 1);
    lcd.print(F("Verif DHT22...  "));
    Serial.println(F("[ERREUR] Lecture DHT22 echouee — verifier brochage"));
    delay(DELAI_MS);
    return;
  }

  // ── Affichage LCD ─────────────────────────────────────────────────────────

  // Ligne 0 : Température
  lcd.setCursor(0, 0);
  lcd.print(F("Temp: "));
  lcd.print(temperature, 1);  // 1 décimale
  lcd.write(byte(0));         // Caractère ° (position 0)
  lcd.print(F("C   "));       // Espaces pour écraser les anciens caractères

  // Ligne 1 : Humidité
  lcd.setCursor(0, 1);
  lcd.print(F("Hum:  "));
  lcd.print(humidite, 1);
  lcd.print(F("%      "));

  // ── Moniteur série (débogage) ──────────────────────────────────────────────
  Serial.print(F("Temperature: ")); Serial.print(temperature, 1); Serial.println(F(" C"));
  Serial.print(F("Humidite:    ")); Serial.print(humidite, 1);    Serial.println(F(" %"));
  Serial.println(F("---"));

  delay(DELAI_MS);
}
