Codigo

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#include <Servo.h>
 
#define DHTPIN D4
#define DHTTYPE DHT22 // DHT22
 
DHT dht(DHTPIN, DHTTYPE);
 
const char *ssid = "Maqueta2_domotica";
const char *password = "12345678";
 
ESP8266WebServer server(80);
 
// Pines de salida
const int lightPins[] = {D1, D2, D3, D5, D6, D7}; // Pines para las luces de las habitaciones
const int exteriorLightPin = D0; // Pin para la luz exterior
const int ldrPin = A0;
 
// Motor para el portón
Servo motorPorton;  
const int pinMotorPorton = D8;  // Pin D8 para el motor del portón
bool portonAbierto = false;  // Estado inicial del portón, cerrado
bool motorEnMovimiento = false;  // Para prevenir múltiples clics
 
// Variables para la estabilidad del AP
unsigned long previousMillis = 0;
const long interval = 60000; // 60 segundos
 
bool exteriorLightAutoMode = false; // Modo automático de la luz exterior
 
void setup() {
  Serial.begin(115200);
 
  // Configuración del motor del portón
  motorPorton.attach(pinMotorPorton);
  motorPorton.write(90);  // El motor parte detenido en posición de cerrado (90 grados)
 
  // Configuración de los pines de salida
  for (int i = 0; i < 6; i++) {
    pinMode(lightPins[i], OUTPUT);
    digitalWrite(lightPins[i], LOW);
  }
  pinMode(exteriorLightPin, OUTPUT); // Luz exterior en D0
  digitalWrite(exteriorLightPin, LOW); // Apagada por defecto
 
  // Inicialización del sensor DHT
  dht.begin();
 
  // Configuración del punto de acceso
  WiFi.softAP(ssid, password);
  WiFi.setOutputPower(20.5); // Configuración de la potencia de transmisión WiFi
  Serial.println("Access Point Started");
  Serial.print("IP Address: ");
  Serial.println(WiFi.softAPIP());
 
  // Rutas del servidor
  server.on("/", handleRoot);
  server.on("/toggle", handleToggle);
  server.on("/setExteriorLightMode", handleSetExteriorLightMode);
  server.on("/getTemperature", handleGetTemperature);
  server.on("/accionarPorton", handleAccionarPorton);  // Ruta para accionar el portón
 
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop() {
  server.handleClient();
  controlExteriorLight();
 
  // Verificar la conexión y reiniciar el AP si es necesario
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (WiFi.status() != WL_CONNECTED) {
      Serial.println("WiFi connection lost. Restarting AP...");
      WiFi.softAP(ssid, password);
      Serial.print("IP Address: ");
      Serial.println(WiFi.softAPIP());
    }
  }
 
  delay(10); // Pequeño delay para evitar el loop excesivo
}
 
void controlExteriorLight() {
  if (exteriorLightAutoMode) {
    int ldrValue = analogRead(ldrPin);
    if (ldrValue > 500) { // Cambia la lógica: apaga el LED si hay luz
      digitalWrite(exteriorLightPin, LOW); // Apaga la luz exterior
    } else {
      digitalWrite(exteriorLightPin, HIGH); // Enciende la luz exterior
    }
  }
}
 
void handleRoot() {
  String html = "<!DOCTYPE html><html><head>";
  html += "<meta charset='UTF-8'>";
  html += "<style>";
  html += "body { text-align: center; font-family: Arial, sans-serif; }";
  html += ".controls { display: flex; flex-wrap: wrap; justify-content: center; }";
  html += ".control-item { margin: 5px; }";
  html += ".separator { margin-top: 20px; border-top: 2px solid black; width: 80%; margin: 20px auto; }";
  html += "h1, h2 { color: #338dff; }";
  html += ".section-title { color: #6896a2; }";
  html += "</style>";
  html += "</head><body>";
  html += "<h1>Liceo Politécnico Carampangue</h1>";
  html += "<h2>Maqueta Domótica 2</h2>";
 
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Control Luces</h2>";
  html += "<div class='controls'>";
  html += "<div class='control-item'><p>L1: Living <button onclick=\"toggleLight(0)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L2: Comedor <button onclick=\"toggleLight(1)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L3: Cocina <button onclick=\"toggleLight(2)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L4: Baño <button onclick=\"toggleLight(3)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L5: Dormitorio 1 <button onclick=\"toggleLight(4)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L6: Dormitorio 2 <button onclick=\"toggleLight(5)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L7: Exterior <select id='exteriorLightMode' onchange='setExteriorLightMode(this.value)'><option value='manual'>Manual</option><option value='auto'>Automático</option></select><button onclick=\"toggleLight(6)\">Encender/Apagar</button></p></div>";
  html += "</div>";
  
  // Sección para el control del portón
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Control Portón</h2>";
  html += "<p id='portonStatus'>Estado: Cerrado</p>";
  html += "<button onclick=\"accionarPorton()\" id=\"accionarPortonBtn\">Accionar Portón</button>";
 
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Medición temperatura y humedad Living</h2>";
  html += "<p>Temperatura: <span id='temperature'>0 °C</span></p>";
  html += "<p>Humedad: <span id='humidity'>0 %</span></p>";
 
  html += "<script>";
  html += "function toggleLight(index) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/toggle?light=' + index, true); xhr.send(); }";
  html += "function setExteriorLightMode(mode) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/setExteriorLightMode?mode=' + mode, true); xhr.send(); }";
  html += "function getTemperature() { var xhr = new XMLHttpRequest(); xhr.open('GET', '/getTemperature', true); xhr.onload = function() { if (xhr.status === 200) { var data = xhr.responseText.split(','); document.getElementById('temperature').innerText = data[0] + ' °C'; document.getElementById('humidity').innerText = data[1] + ' %'; } }; xhr.send(); }";
  html += "setInterval(getTemperature, 1000);";
 
  // Función para accionar el portón sin recargar la página
  html += "function accionarPorton() {";
  html += "var xhr = new XMLHttpRequest();";
  html += "xhr.open('GET', '/accionarPorton', true);";
  html += "xhr.onreadystatechange = function() {";
  html += "if (xhr.readyState == 4 && xhr.status == 200) {";
  html += "document.getElementById('portonStatus').innerHTML = 'Estado: ' + xhr.responseText;";
  html += "}";
  html += "};";
  html += "xhr.send();";
  html += "}";
 
  html += "</script>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}
 
void handleAccionarPorton() {
  if (motorEnMovimiento) {
    server.send(200, "text/plain", portonAbierto ? "Abierto" : "Cerrado");
    return;
  }
 
  motorEnMovimiento = true;
 
  if (!portonAbierto) {
    motorPorton.write(97); // Girar para abrir
    delay(1600); // Mantener el giro por 2000 ms
    motorPorton.write(90); // Detener el motor
    portonAbierto = true;
    server.send(200, "text/plain", "Abierto");
  } else {
    motorPorton.write(72); // Girar para cerrar
    delay(1600); // Mantener el giro por 2000 ms
    motorPorton.write(90); // Detener el motor
    portonAbierto = false;
    server.send(200, "text/plain", "Cerrado");
  }
 
  motorEnMovimiento = false;
}
 
void handleToggle() {
  int light = server.arg("light").toInt();
  if (light == 6 && !exteriorLightAutoMode) { // Si es la luz exterior y no está en modo automático
    digitalWrite(exteriorLightPin, !digitalRead(exteriorLightPin));
  } else if (light != 6) { // Controlar solo las luces interiores
    digitalWrite(lightPins[light], !digitalRead(lightPins[light]));
  }
  server.send(200, "text/plain", "OK");
}
 
void handleSetExteriorLightMode() {
  String mode = server.arg("mode");
  if (mode == "auto") {
    exteriorLightAutoMode = true;
  } else {
    exteriorLightAutoMode = false;
    digitalWrite(exteriorLightPin, LOW); // Asegúrate de que la luz exterior esté apagada en modo manual
  }
  server.send(200, "text/plain", "OK");
}
 
void handleGetTemperature() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  if (isnan(temp) || isnan(hum)) {
    server.send(200, "text/plain", "Error reading from DHT sensor,0,0");
  } else {
    server.send(200, "text/plain", String(temp) + "," + String(hum));
  }
}
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#include <Servo.h>
 
#define DHTPIN D4
#define DHTTYPE DHT22 // DHT22
 
DHT dht(DHTPIN, DHTTYPE);
 
const char *ssid = "Maqueta2_domotica";
const char *password = "12345678";
 
ESP8266WebServer server(80);
 
// Pines de salida
const int lightPins[] = {D1, D2, D3, D5, D6, D7}; // Pines para las luces de las habitaciones
const int exteriorLightPin = D0; // Pin para la luz exterior
const int ldrPin = A0;
 
// Motor para el portón
Servo motorPorton;  
const int pinMotorPorton = D8;  // Pin D8 para el motor del portón
bool portonAbierto = false;  // Estado inicial del portón, cerrado
bool motorEnMovimiento = false;  // Para prevenir múltiples clics
 
// Variables para la estabilidad del AP
unsigned long previousMillis = 0;
const long interval = 60000; // 60 segundos
 
bool exteriorLightAutoMode = false; // Modo automático de la luz exterior
 
void setup() {
  Serial.begin(115200);
 
  // Configuración del motor del portón
  motorPorton.attach(pinMotorPorton);
  motorPorton.write(90);  // El motor parte detenido en posición de cerrado (90 grados)
 
  // Configuración de los pines de salida
  for (int i = 0; i < 6; i++) {
    pinMode(lightPins[i], OUTPUT);
    digitalWrite(lightPins[i], LOW);
  }
  pinMode(exteriorLightPin, OUTPUT); // Luz exterior en D0
  digitalWrite(exteriorLightPin, LOW); // Apagada por defecto
 
  // Inicialización del sensor DHT
  dht.begin();
 
  // Configuración del punto de acceso
  WiFi.softAP(ssid, password);
  WiFi.setOutputPower(20.5); // Configuración de la potencia de transmisión WiFi
  Serial.println("Access Point Started");
  Serial.print("IP Address: ");
  Serial.println(WiFi.softAPIP());
 
  // Rutas del servidor
  server.on("/", handleRoot);
  server.on("/toggle", handleToggle);
  server.on("/setExteriorLightMode", handleSetExteriorLightMode);
  server.on("/getTemperature", handleGetTemperature);
  server.on("/accionarPorton", handleAccionarPorton);  // Ruta para accionar el portón
 
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop() {
  server.handleClient();
  controlExteriorLight();
 
  // Verificar la conexión y reiniciar el AP si es necesario
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (WiFi.status() != WL_CONNECTED) {
      Serial.println("WiFi connection lost. Restarting AP...");
      WiFi.softAP(ssid, password);
      Serial.print("IP Address: ");
      Serial.println(WiFi.softAPIP());
    }
  }
 
  delay(10); // Pequeño delay para evitar el loop excesivo
}
 
void controlExteriorLight() {
  if (exteriorLightAutoMode) {
    int ldrValue = analogRead(ldrPin);
    if (ldrValue > 500) { // Cambia la lógica: apaga el LED si hay luz
      digitalWrite(exteriorLightPin, LOW); // Apaga la luz exterior
    } else {
      digitalWrite(exteriorLightPin, HIGH); // Enciende la luz exterior
    }
  }
}
 
void handleRoot() {
  String html = "<!DOCTYPE html><html><head>";
  html += "<meta charset='UTF-8'>";
  html += "<style>";
  html += "body { text-align: center; font-family: Arial, sans-serif; }";
  html += ".controls { display: flex; flex-wrap: wrap; justify-content: center; }";
  html += ".control-item { margin: 5px; }";
  html += ".separator { margin-top: 20px; border-top: 2px solid black; width: 80%; margin: 20px auto; }";
  html += "h1, h2 { color: #338dff; }";
  html += ".section-title { color: #6896a2; }";
  html += "</style>";
  html += "</head><body>";
  html += "<h1>Liceo Politécnico Carampangue</h1>";
  html += "<h2>Maqueta Domótica 2</h2>";
 
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Control Luces</h2>";
  html += "<div class='controls'>";
  html += "<div class='control-item'><p>L1: Living <button onclick=\"toggleLight(0)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L2: Comedor <button onclick=\"toggleLight(1)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L3: Cocina <button onclick=\"toggleLight(2)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L4: Baño <button onclick=\"toggleLight(3)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L5: Dormitorio 1 <button onclick=\"toggleLight(4)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L6: Dormitorio 2 <button onclick=\"toggleLight(5)\">Encender/Apagar</button></p></div>";
  html += "<div class='control-item'><p>L7: Exterior <select id='exteriorLightMode' onchange='setExteriorLightMode(this.value)'><option value='manual'>Manual</option><option value='auto'>Automático</option></select><button onclick=\"toggleLight(6)\">Encender/Apagar</button></p></div>";
  html += "</div>";
  
  // Sección para el control del portón
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Control Portón</h2>";
  html += "<p id='portonStatus'>Estado: Cerrado</p>";
  html += "<button onclick=\"accionarPorton()\" id=\"accionarPortonBtn\">Accionar Portón</button>";
 
  html += "<div class='separator'></div>";
  html += "<h2 class='section-title'>Medición temperatura y humedad Living</h2>";
  html += "<p>Temperatura: <span id='temperature'>0 °C</span></p>";
  html += "<p>Humedad: <span id='humidity'>0 %</span></p>";
 
  html += "<script>";
  html += "function toggleLight(index) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/toggle?light=' + index, true); xhr.send(); }";
  html += "function setExteriorLightMode(mode) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/setExteriorLightMode?mode=' + mode, true); xhr.send(); }";
  html += "function getTemperature() { var xhr = new XMLHttpRequest(); xhr.open('GET', '/getTemperature', true); xhr.onload = function() { if (xhr.status === 200) { var data = xhr.responseText.split(','); document.getElementById('temperature').innerText = data[0] + ' °C'; document.getElementById('humidity').innerText = data[1] + ' %'; } }; xhr.send(); }";
  html += "setInterval(getTemperature, 1000);";
 
  // Función para accionar el portón sin recargar la página
  html += "function accionarPorton() {";
  html += "var xhr = new XMLHttpRequest();";
  html += "xhr.open('GET', '/accionarPorton', true);";
  html += "xhr.onreadystatechange = function() {";
  html += "if (xhr.readyState == 4 && xhr.status == 200) {";
  html += "document.getElementById('portonStatus').innerHTML = 'Estado: ' + xhr.responseText;";
  html += "}";
  html += "};";
  html += "xhr.send();";
  html += "}";
 
  html += "</script>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}
 
void handleAccionarPorton() {
  if (motorEnMovimiento) {
    server.send(200, "text/plain", portonAbierto ? "Abierto" : "Cerrado");
    return;
  }
 
  motorEnMovimiento = true;
 
  if (!portonAbierto) {
    motorPorton.write(97); // Girar para abrir
    delay(1600); // Mantener el giro por 2000 ms
    motorPorton.write(90); // Detener el motor
    portonAbierto = true;
    server.send(200, "text/plain", "Abierto");
  } else {
    motorPorton.write(72); // Girar para cerrar
    delay(1600); // Mantener el giro por 2000 ms
    motorPorton.write(90); // Detener el motor
    portonAbierto = false;
    server.send(200, "text/plain", "Cerrado");
  }
 
  motorEnMovimiento = false;
}
 
void handleToggle() {
  int light = server.arg("light").toInt();
  if (light == 6 && !exteriorLightAutoMode) { // Si es la luz exterior y no está en modo automático
    digitalWrite(exteriorLightPin, !digitalRead(exteriorLightPin));
  } else if (light != 6) { // Controlar solo las luces interiores
    digitalWrite(lightPins[light], !digitalRead(lightPins[light]));
  }
  server.send(200, "text/plain", "OK");
}
 
void handleSetExteriorLightMode() {
  String mode = server.arg("mode");
  if (mode == "auto") {
    exteriorLightAutoMode = true;
  } else {
    exteriorLightAutoMode = false;
    digitalWrite(exteriorLightPin, LOW); // Asegúrate de que la luz exterior esté apagada en modo manual
  }
  server.send(200, "text/plain", "OK");
}
 
void handleGetTemperature() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  if (isnan(temp) || isnan(hum)) {
    server.send(200, "text/plain", "Error reading from DHT sensor,0,0");
  } else {
    server.send(200, "text/plain", String(temp) + "," + String(hum));
  }
}