#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <TM1637Display.h>
// ===================== CONFIGURATION DES PINS =====================
#define DHT_PIN 2 // Pin de données du DHT22
#define DHT_TYPE DHT22 // Type de capteur (DHT11 ou DHT22)
#define MQ135_PIN A0 // Pin analogique du capteur de gaz (MQ-2)
#define LDR_PIN A1 // Pin analogique de la photorésistance (luminosité)
#define TM_CLK 6 // Pin CLK de l'afficheur 7 segments
#define TM_DIO 7 // Pin DIO de l'afficheur 7 segments
// ===================== CREATION DES OBJETS =====================
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C 0x27, écran 16 colonnes x 2 lignes
TM1637Display display(TM_CLK, TM_DIO);
// ===================== VARIABLES MINUTERIE =====================
unsigned long startTime;
int startHour = 9, startMin = 15, startSec = 0; // Heure de départ : 9H15min00s
// ===================== SETUP : exécuté une seule fois au démarrage =====================
void setup() {
Serial.begin(9600); // Démarre la communication série pour le debug
dht.begin(); // Initialise le capteur DHT22
Wire.begin(); // Initialise la communication I2C (LCD)
lcd.init(); // Initialise l'écran LCD
lcd.backlight(); // Allume le rétroéclairage du LCD
lcd.clear();
display.setBrightness(7); // Luminosité max de l'afficheur 7 segments (0 à 7)
display.clear();
startTime = millis(); // Mémorise le temps de démarrage (en millisecondes)
}
// ===================== LOOP : exécuté en boucle infinie =====================
void loop() {
// ---------- LECTURE DES CAPTEURS ----------
float temperature = dht.readTemperature(); // Température en °C
float humidity = dht.readHumidity(); // Humidité en %
int ldrRaw = analogRead(LDR_PIN); // Valeur brute LDR (0=sombre, 1023=très lumineux)
float lux = ldrRaw * (1000.0 / 1023.0); // Conversion en lux approx. (0 – 1000 lx)
int gasLevel = analogRead(MQ135_PIN); // Valeur brute du gaz (0-1023)
// Vérification si le DHT22 a bien renvoyé une valeur (évite les "nan")
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Erreur de lecture DHT22 !");
temperature = 0;
humidity = 0;
}
// ---------- CALCUL DE LA MINUTERIE ----------
unsigned long elapsedSeconds = (millis() - startTime) / 1000; // Secondes écoulées
int totalSeconds = startSec + elapsedSeconds;
int secs = totalSeconds % 60;
int totalMinutes = startMin + (totalSeconds / 60);
int mins = totalMinutes % 60;
int totalHours = startHour + (totalMinutes / 60);
int hrs = totalHours % 24;
// ---------- AFFICHAGE SUR LE LCD ----------
// Ligne 1 : "T:24.0C H:40% " — 16 caractères max
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1); // ex: "24.0"
lcd.print("C H:");
lcd.print((int)humidity); // ex: "40"
lcd.print("% "); // % + espaces pour remplir les 16 chars
// Ligne 2 : "L:500lx G:449 " — 16 caractères max
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print((int)lux); // ex: "500"
lcd.print("lx G:");
lcd.print(gasLevel); // ex: "449"
lcd.print(" "); // espaces pour effacer les anciens chiffres
// ---------- AFFICHAGE SUR LE 7 SEGMENTS ----------
// Affiche l'heure HHMM — showNumberDec avec leading zeros
int timeValue = hrs * 100 + mins;
display.showNumberDec(timeValue, true); // true = zéros de tête (ex: 0915)
// ---------- AFFICHAGE DANS LE MONITEUR SERIE (pour debug) ----------
Serial.print("Temp: "); Serial.print(temperature);
Serial.print("C | Hum: "); Serial.print(humidity);
Serial.print("% | Lux: "); Serial.print(lux);
Serial.print(" lx | Gaz: "); Serial.print(gasLevel);
Serial.print(" | Heure: "); Serial.print(hrs);
Serial.print("H"); Serial.print(mins);
Serial.print("min"); Serial.print(secs);
Serial.println("s");
delay(1000); // Attend 1 seconde avant la prochaine mesure
}