#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
Servo puerta, puerta2;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT sensor(13, DHT22);
char dato = ' ';
byte FAlarma1 = 2, FAlarma2 = 3;
byte dormitorio = 4, cocina = 5, sala = 6, principal = 7;
byte patio1 = 8, patio2 = 9, patio3 = 10, patio4 = 11;
byte pir = 12, trig = 14, echo = 15, buz_activo = 16,  buz_pasivo = 17;
byte ventilador = 18, ventilador2 = 19, sensorflama = 27;
float t = 0, h = 0, ic = 0;
long distancia = 0, duracion = 0;
byte lectura = 0, lecturaFlama = 0, luminosidad = 0,
     sw = 0, porcentajeGas = 0;
int lecturaLuz = 0, lecturaGas = 0; //0-1023
byte gas = A0, sensorluz = A1;

void setup() {
  puerta.attach(23, 650, 2550); //fisico
  puerta2.attach(25); //mg90
  //puerta.attach(23); //wokwi, mg90,s3003,mg995 996
  pinMode(trig, OUTPUT);
  pinMode(FAlarma1, OUTPUT);
  pinMode(FAlarma2, OUTPUT);
  pinMode(dormitorio, OUTPUT);
  pinMode(sala, OUTPUT);
  pinMode(cocina, OUTPUT);
  pinMode(principal, OUTPUT);
  pinMode(buz_activo, OUTPUT);
  pinMode(buz_pasivo, OUTPUT);
  pinMode(ventilador2, 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); //c,f
  lcd.print("SISTEMA DE");
  lcd.setCursor(3, 1); //c,f
  lcd.print("CALEFACCION");
  delay(3000);
  lcd.clear();
  pinMode(ventilador, OUTPUT);
}

void loop() {
  SistemaDeAlarma();
  SistemaAutomatico();
  SistemaDeCalefaccion();
  SistemaDeIncendios();
  SistemaIluminacion();
  SistemaDeGas();
  leerdato();
}
void SistemaDeCalefaccion() {
  t = sensor.readTemperature();
  h = sensor.readHumidity();
  ic = sensor.computeHeatIndex(false);
  lcd.setCursor(0, 0); //c,f
  lcd.print("T: " + String(t) + "*C");
  lcd.setCursor(0, 1); //c,f
  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(FAlarma1, 1);
    digitalWrite(FAlarma2, 1);
    digitalWrite(buz_activo, 1);
    sw = 1;
  }
  else {
    digitalWrite(FAlarma1, 0);
    digitalWrite(FAlarma2, 0);
    digitalWrite(buz_activo, 0);
  }
  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);
  }
}

void leerdato() {
  if (Serial.available() > 0) {
    dato = Serial.read(); //lee de la serie la informacion que llega
  }
  if (dato == 'D') {
    digitalWrite(dormitorio, 1);
  }
  else if (dato == 'd') {
    digitalWrite(dormitorio, 0);
  }
  else if (dato == 'S') {
    digitalWrite(sala, 1);
  }
  else if (dato == 's') {
    digitalWrite(sala, 0);
  }
  else if (dato == 'C') {
    digitalWrite(cocina, 1);
  }
  else if (dato == 'c') {
    digitalWrite(cocina, 0);
  }
  else if (dato == 'P') {
    digitalWrite(principal, 1);
  }
  else if (dato == 'p') {
    digitalWrite(principal, 0);
  }
  else if (dato == 'Q') {
    puerta2.write(180);
  }
  else if (dato == 'q') {
    puerta2.write(90);
  }
}

void SistemaDeGas(){
  lecturaGas = analogRead(gas);
  porcentajeGas = map(lecturaGas,0,1023,0,100);
  if(porcentajeGas < 35){
    digitalWrite(ventilador2,0);
    noTone(buz_pasivo);
  }
  else if(porcentajeGas >= 35 and porcentajeGas < 70){
    tone(buz_pasivo,262); //Do4
    digitalWrite(ventilador2,0);
    delay(250);
    tone(buz_pasivo,330); //Fa4
    delay(250);
  }
  else{
    tone(buz_pasivo,440); //Si4
    digitalWrite(ventilador2,1);
  }
}
$abcdeabcde151015202530354045505560fghijfghij