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));
}
}