#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// --- CONFIGURARE PINI ---
// NOD 1: HOL & SECURITATE
#define HOL_DOOR 5
#define HOL_LOCK 17
#define ARM_BTN 4
#define ALARM_LED 16
#define BUZZER 13
// LIVING (Lumini 3 trepte + HVAC)
#define LIV_L1 18
#define LIV_L2 19
#define LIV_L3 23
#define LIV_COOL 15 // LED Albastru
#define LIV_HEAT 2 // LED Portocaliu
#define LIV_HUM 0 // LED Alb
#define LIV_DOOR 25
// DORMITOR (Lumini 3 trepte + HVAC)
#define DOR_L1 26
#define DOR_L2 27
#define DOR_L3 14
#define DOR_COOL 12 // LED Albastru
#define DOR_DOOR 21
// NOD 2: UTILITARE (Baie & Bucatarie)
#define BUC_L 32
#define BUC_HOTA 33
#define BUC_GAS 34 // Analog
#define BAI_L 22
#define BAI_WATER 35 // Analog/Digital
// SENZORI GENERALI
#define DHTPIN 14
#define LDR_PIN 39 // Analog
DHT dht(DHTPIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// VARIABILE DE STARE
enum State { DISARMED, ARMED, TRIGGERED };
State systemState = DISARMED;
unsigned long prevSensors = 0;
unsigned long prevDisplay = 0;
int displayPage = 0;
float temp, hum;
int lightLevel;
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
// Configurare Iesiri
int outputs[] = {HOL_L1, LIV_L1, LIV_L2, LIV_L3, LIV_COOL, LIV_HEAT, LIV_HUM,
DOR_L1, DOR_L2, DOR_L3, DOR_COOL, BUC_L, BUC_HOTA, BAI_L,
ALARM_LED, BUZZER};
for(int p : outputs) pinMode(p, OUTPUT);
// Configurare Intrari
pinMode(HOL_DOOR, INPUT_PULLUP);
pinMode(HOL_LOCK, INPUT_PULLUP);
pinMode(LIV_DOOR, INPUT_PULLUP);
pinMode(DOR_DOOR, INPUT_PULLUP);
pinMode(ARM_BTN, INPUT_PULLUP);
lcd.print("Smart Home Hub");
delay(2000);
}
void loop() {
unsigned long now = millis();
// 1. ACHIZITIE DATE SENZORI (La 1 secunda)
if (now - prevSensors > 1000) {
prevSensors = now;
temp = dht.readTemperature();
hum = dht.readHumidity();
lightLevel = analogRead(LDR_PIN);
int gas = analogRead(BUC_GAS);
bool water = (analogRead(BAI_WATER) > 500);
// --- LOGICA HVAC (Conform limitelor impuse) ---
// Living & Dormitor
bool coolReq = (temp > 28.0);
bool heatReq = (temp < 24.0);
bool humReq = (hum < 40.0 || hum > 60.0);
digitalWrite(LIV_COOL, coolReq);
digitalWrite(LIV_HEAT, heatReq);
digitalWrite(LIV_HUM, humReq);
digitalWrite(DOR_COOL, coolReq);
// --- LOGICA BUCATARIE (Gaz) ---
if (gas > 2000) digitalWrite(BUC_HOTA, HIGH);
else digitalWrite(BUC_HOTA, LOW);
// --- LOGICA BAIE (Apa) ---
if (water) {
// Alerta inundatie imediata
lcd.setCursor(0,1); lcd.print("ALERTA INUNDATIE");
}
}
// 2. ILUMINAT ADAPTIV (3 Trepte - Exemplu Living)
int steps = map(lightLevel, 0, 4095, 3, 0); // 4095 e intuneric in Wokwi LDR
digitalWrite(LIV_L1, steps >= 1 || digitalRead(LIV_DOOR) == HIGH);
digitalWrite(LIV_L2, steps >= 2);
digitalWrite(LIV_L3, steps >= 3);
// 3. SECURITATE & INTERBLOCARE
static int lastBtn = HIGH;
int btn = digitalRead(ARM_BTN);
bool holClosed = (digitalRead(HOL_DOOR) == LOW);
bool holLocked = (digitalRead(HOL_LOCK) == LOW);
if (btn == LOW && lastBtn == HIGH) {
if (systemState == DISARMED) {
if (holClosed && holLocked) {
systemState = ARMED;
digitalWrite(ALARM_LED, HIGH);
} else {
lcd.clear(); lcd.print("Inchide usa/bloc");
delay(1500);
}
} else {
systemState = DISARMED;
digitalWrite(ALARM_LED, LOW);
digitalWrite(BUZZER, LOW);
}
delay(50);
}
lastBtn = btn;
// Detectie efractie
if (systemState == ARMED) {
if (!holClosed || !holLocked || digitalRead(LIV_DOOR) == HIGH) {
systemState = TRIGGERED;
}
}
// 4. AFISARE LCD ROTATIVA
if (now - prevDisplay > 2500) {
prevDisplay = now;
lcd.clear();
switch(displayPage) {
case 0:
lcd.print(systemState == ARMED ? "SISTEM: ARMAT" : "SISTEM: DEZARMAT");
lcd.setCursor(0,1); lcd.print(holClosed ? "Usa: Inchisa" : "Usa: DESCHISA!");
break;
case 1:
lcd.print("T:"); lcd.print(temp,1); lcd.print("C H:"); lcd.print(hum,0); lcd.print("%");
lcd.setCursor(0,1);
if(temp > 28) lcd.print("AC: RACIRE ON");
else if(temp < 24) lcd.print("AC: INCALZIRE ON");
else lcd.print("AC: STANDBY");
break;
case 2:
lcd.print("LUMINA LIVING");
lcd.setCursor(0,1); lcd.print("Nivel: "); lcd.print(steps); lcd.print("/3");
break;
}
displayPage = (displayPage + 1) % 3;
}
if (systemState == TRIGGERED) {
digitalWrite(BUZZER, (millis() % 400 < 200));
digitalWrite(ALARM_LED, (millis() % 400 < 200));
lcd.setCursor(0,0); lcd.print("!!! ALARMA !!!");
}
}