#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
Servo puerta;
LiquidCrystal_I2C lcd(0x27,16,2);
DHT sensor(13, DHT11);
byte dormitorio1 = 2, dormitorio2 = 3;
byte patio1 = 8, patio2 = 9, patio3 = 10, patio4 = 11; 
byte pir = 12, trig = 14, echo = 15, buzzer = 16; 
byte ventilador=18, sensorflama=27; 
float t=0, h=0, ic=0;
long distancia = 0, duracion = 0; 
byte lectura = 0, lecturaFlama=0, luminosidad = 0, sw = 0;
int lecturaLuz=0; //0-1023
byte sensorluz=A1;
void setup() {
  puerta.attach(23,650,2550);//fisico
  //puerta.attach(23); //wokwi, mg90,s3003,mg995 996
  pinMode(trig, OUTPUT);
  pinMode(dormitorio1,OUTPUT);
  pinMode(dormitorio2,OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(patio1, OUTPUT);
  pinMode(patio2, OUTPUT);
  pinMode(patio3, OUTPUT);
  pinMode(patio4, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(pir,INPUT);
  pinMode(sensorflama, INPUT);
  Serial.begin(9600);
  puerta.write(90);
  sensor.begin();  
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(3,0);
lcd.print("SISTEMA DE");
lcd.setCursor(3,1);
lcd.print("CALEFACCION");
delay(3000);
lcd.clear();
pinMode(ventilador, OUTPUT);
}
void loop() {
  SistemaDeAlarma();
  SistemaAutomatico();
  SistemaDeCalefaccion();
  SistemaDeIncendios();
  SistemaIluminacion();
}
void SistemaDeCalefaccion(){
  t=sensor.readTemperature();
h=sensor.readHumidity();
ic=sensor.computeHeatIndex(false);
lcd.setCursor(0,0);
lcd.print("T: "+String(t)+"*C");
lcd.setCursor(0,1);
lcd.print("H: "+String(h)+"% HR");
if(ic>25){
digitalWrite(ventilador, 1);  
}
else{
digitalWrite(ventilador, 0);  
}
delay(1000);
lcd.clear();
}
void SistemaDeAlarma(){
  lectura = digitalRead(pir);
  if(lectura == 1){
    digitalWrite(dormitorio1,1);
    digitalWrite(dormitorio2,1);
    tone(buzzer,262);
    sw=1;
    }
  else{
    digitalWrite(dormitorio1,0);
    digitalWrite(dormitorio2,0);
    noTone(buzzer);
  }
  if(sw==1){
    Serial.println("Alarma! - Intrusos en la casa");
    sw=0;
    delay(5000); //wowki
  }
}
void SistemaAutomatico(){
  digitalWrite(trig,0);
  delayMicroseconds(2);
  digitalWrite(trig,1);
  delayMicroseconds(10);
  digitalWrite(trig,0);
  duracion=pulseIn(echo,1); //83333
  distancia=duracion/58;
  if(distancia < 15){
    puerta.write(180);
  }
  else{
    puerta.write(90);
  }
}
void SistemaDeIncendios(){
   lecturaFlama = digitalRead(sensorflama);
  if(lecturaFlama==0) {
    Serial.println("Fuego!");
  }
  else{
  }
}
void SistemaIluminacion(){
  lecturaLuz = analogRead(sensorluz);//0-1023
  //luminosidad = map(lecturaLuz,0,1023,0,100);//ldr suelto
  luminosidad = map(lecturaLuz,0,1023,100,0);//ldr en modulo
  if(luminosidad < 40){
   digitalWrite(patio1, 1);
   digitalWrite(patio2, 1);
   digitalWrite(patio3, 1);
   digitalWrite(patio4, 1); 
    }
    else{
   digitalWrite(patio1, 0);
   digitalWrite(patio2, 0);
   digitalWrite(patio3, 0);
   digitalWrite(patio4, 0);   
    }
}