//ESTE PARA EL MODULO ESP32C SIN CÁMARA
// HAY QUE MODIFICAR A LAS NECESIDADES LAS SIGUIENTES LINEAS
// 18 NOMBRE DE LA WIFI
// 19 CONTRASEÑA WIFI
// 22 NOMBRE USUARIO PARA ACCEDER A LA WEB(admin)
// 23 CONTRASEÑA PARA ACCEDER A LA WEB (admin)
// 25 IP FIJA DESEADA, DIFRENTE AL OTRO MODULO
// 26 PUERTA DE ENLACE NECESARIA
// 35 PUERTO DESEADO, DIFRENTE AL OTRO MODULO
// 144 IP:PUERTO ASIGNADA AL OTRO MODULO, IP PUBLICA:PUERTO, EN EL CASO DE IP DINAMICA USAR NOTIP, EJEMPLO, (visionremota.ddns.net:88)
// TODO ES ADACTABLE A LAS NECESIDADES DE CADA UNO
#include <Arduino.h>
#include <WiFi.h>
#include <ESPAsyncWebSrv.h>
const char* ssid = "NOMBRE DE LA WIFI"; // Nombre de tu red WiFi
const char* password = "CONTRASEÑA"; // Contraseña de tu red WiFi
const char* webUsername = "admin"; // Nombre de usuario para la autenticación
const char* webPassword = "admin"; // Contraseña para la autenticación
const IPAddress staticIP(192, 168, 1, 190); // IP estática
const IPAddress gateway(192, 168, 1, 1); // Puerta de enlace
const IPAddress subnet(255, 255, 255, 0); // Máscara de subred
const int gpio12Pin = 12; // GPIO12 para control on/off
const int gpio13Pin = 13; // GPIO13 para control on/off
const int gpio14Pin = 14; // GPIO14 para control momentáneo (2 segundos)
const int gpio15Pin = 15; // GPIO15 para control on/off
const int gpio0Pin = 0; // GPIO0 para el pulsador placa
const int gpio16Pin = 16; // GPIO16 para el pulsador placa
const int gpio2Pin = 2; // GPIO2 para la entrada LDR
const int wifiStatusPin = 4; // GPIO4 para indicar el estado de WiFi
AsyncWebServer server(85);
bool stateGPIO12 = LOW;
bool stateGPIO13 = LOW;
bool stateGPIO14 = LOW;
bool stateGPIO15 = LOW;
void toggleGPIO(int pin) {
if (pin == 12) {
stateGPIO12 = !stateGPIO12;
digitalWrite(gpio12Pin, stateGPIO12);
} else if (pin == 13) {
stateGPIO13 = !stateGPIO13;
digitalWrite(gpio13Pin, stateGPIO13);
} else if (pin == 15) {
stateGPIO15 = !stateGPIO15;
digitalWrite(gpio15Pin, stateGPIO15);
}
}
String getButtonStateScript() {
String script = "document.getElementById('gpio13state').textContent = '" + String(stateGPIO13 ? "Encendido" : "Apagado") + "';";
script += "document.getElementById('gpio14state').textContent = '" + String(stateGPIO14 ? "Encendido" : "Apagado") + "';";
script += "document.getElementById('gpio15state').textContent = '" + String(stateGPIO15 ? "Encendido" : "Apagado") + "';";
return script;
}
String getStatusJson() {
String status = "{\"gpio12\":" + String(stateGPIO12) + ",\"gpio13\":" + String(stateGPIO13) + ",\"gpio14\":" + String(stateGPIO14) + ",\"gpio15\":" + String(stateGPIO15) + "}";
return status;
}
void setup() {
digitalWrite(gpio14Pin, HIGH); // INICIA EL GPIO14 EN NIVEL ALTO
Serial.begin(115200);
// Configura la conexión WiFi con IP estática
WiFi.config(staticIP, gateway, subnet);
WiFi.begin(ssid, password);
pinMode(wifiStatusPin, OUTPUT); // Configura el pin de estado de WiFi
digitalWrite(wifiStatusPin, LOW); // Inicialmente, apagar el LED
pinMode(gpio12Pin, OUTPUT);
pinMode(gpio13Pin, OUTPUT);
pinMode(gpio14Pin, OUTPUT);
pinMode(gpio15Pin, OUTPUT);
pinMode(gpio0Pin, INPUT_PULLUP); // Configura GPIO0 como entrada con resistencia de pull-up
pinMode(gpio16Pin, INPUT_PULLUP); // Configura GPIO16 como entrada con resistencia de pull-up
pinMode(gpio2Pin, INPUT); // Configura GPIO2 como entrada
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(wifiStatusPin, !digitalRead(wifiStatusPin)); // Cambia el estado del LED
delay(200);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conexión WiFi establecida");
digitalWrite(wifiStatusPin, LOW); // Apaga el LED de estado de WiFi
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
// Verifica la autenticación antes de permitir el acceso
if (!request->authenticate(webUsername, webPassword)) {
return request->requestAuthentication();
}
String html = "<html><head>";
html += "<style>";
html += ".container {";
html += " display: flex;";
html += " flex-direction: column;";
html += " align-items: center;";
html += " justify-content: flex-start;"; // Centrar la ventana de video arriba
html += " height: 100vh;";
html += " margin: 0;";
html += " padding: 0;";
html += " overflow: hidden;";
html += "}";
html += ".button {";
html += " background-color: #4CAF50;";
html += " border: none;";
html += " color: white;";
html += " padding: 30px 60px;";
html += " text-align: center;";
html += " text-decoration: none;";
html += " display: inline-block;";
html += " font-size: 36px;";
html += " margin: 20px;";
html += " cursor: pointer;";
html += " border-radius: 10px;"; // Agregar borde redondeado
html += "}";
html += ".button.clicked {";
html += " background-color: #45a049;";
html += "}";
html += ".text-large {"; // Estilo para el texto fuera de los botones
html += " font-size: 48px;"; // Aumenta el tamaño de la fuente
html += "}";
html += ".footer {";
html += " font-size: 16px;";
html += " color: green;";
html += " margin-top: 20px;";
html += "}";
html += "</style>";
html += "</head><body>";
html += "<div class='container'>";
html += "<iframe width='80%' height='40%' src='http://IP o URL DEL MODULO CON CAMARA:88' frameborder='0'></iframe>"; // Ventana de video
html += "<span class='text-large'>PASILLO: <span id='gpio13state'></span></span>";
html += "<button class='button' id='gpio13' onclick='toggleGPIO(13)'>ON/OFF</button><br>";
html += "<span class='text-large'>ENTRADA: <span id='gpio15state'></span></span>";
html += "<button class='button' id='gpio15' onclick='toggleGPIO(15)'>ON/OFF</button><br><br>";
html += "<span class='text-large'>CANCELA: <span id='gpio14state'></span></span>";
html += "<button class='button' id='gpio14' onclick='momentaryGPIO(14)'>ABRE CANCELA</button><br>";
// Agregar el estado de gpio12 en tiempo real
html += "<div class='text-large' style='text-align:center;'>LETRERO: <span id='gpio12state'></span></div>";
html += "<div class='footer'>Power By A. Del Rio Para Los Parejos</div>"; // Agrega el pie de página
html += "</div>";
html += "<script>";
html += getButtonStateScript();
html += "function toggleGPIO(pin) {";
html += " fetch('/toggle?pin=' + pin)";
html += " .then(response => response.text())";
html += " .then(data => {";
html += " document.getElementById('gpio' + pin + 'state').textContent = data;";
html += " document.getElementById('gpio' + pin).classList.add('clicked');"; // Agrega la clase 'clicked'
html += " setTimeout(() => {";
html += " document.getElementById('gpio' + pin).classList.remove('clicked');"; // Quita la clase 'clicked' después de 200 ms
html += " }, 200);";
html += " });";
html += "}";
html += "function momentaryGPIO(pin) {";
html += " fetch('/momentary?pin=' + pin)";
html += " .then(response => response.text())";
html += " .then(data => {";
html += " document.getElementById('gpio' + pin + 'state').textContent = data;";
html += " document.getElementById('gpio' + pin).classList.add('clicked');"; // Agrega la clase 'clicked'
html += " setTimeout(() => {";
html += " document.getElementById('gpio' + pin).classList.remove('clicked');"; // Quita la clase 'clicked' después de 200 ms
html += " }, 200);";
html += " });";
html += "}";
html += "setInterval(updateStates, 5000);";
html += "function updateStates() {";
html += " fetch('/status')";
html += " .then(response => response.json())";
html += " .then(data => {";
html += " document.getElementById('gpio13state').textContent = data.gpio13 ? 'ENCENDIDO' : 'Apagado';";
html += " document.getElementById('gpio14state').textContent = data.gpio14 ? 'cerrada' : 'ABRIENDO';";
html += " document.getElementById('gpio15state').textContent = data.gpio15 ? 'ENCENDIDO' : 'Apagado';";
html += " document.getElementById('gpio12state').textContent = data.gpio12 ? 'ENCENDIDO' : 'Apagado';"; // Actualiza el estado de GPIO12
html += " });";
html += "}";
html += "</script>";
html += "</body></html>";
request->send(200, "text/html", html);
});
server.on("/toggle", HTTP_GET, [](AsyncWebServerRequest *request) {
String pinStr = request->arg("pin");
int pin = pinStr.toInt();
toggleGPIO(pin);
request->send(200, "text/plain", String(pin));
});
server.on("/momentary", HTTP_GET, [](AsyncWebServerRequest *request) {
String pinStr = request->arg("pin");
int pin = pinStr.toInt();
if (pin == 14) {
digitalWrite(gpio14Pin, HIGH);
stateGPIO14 = HIGH;
digitalWrite(gpio14Pin, LOW);
delay(1000);
digitalWrite(gpio14Pin, HIGH);
request->send(200, "text/plain", "ABRIENDO");
delay(3000);
}
});
server.on("/status", HTTP_GET, [](AsyncWebServerRequest *request) {
String status = getStatusJson();
request->send(200, "application/json", status);
});
server.begin();
}
void loop() {
int buttonState = digitalRead(gpio0Pin);
if (buttonState == LOW) {
toggleGPIO(15);
delay(500);
}
int buttonState16 = digitalRead(gpio16Pin);
if (buttonState16 == LOW) {
toggleGPIO(13);
delay(500);
}
int gpio2State = digitalRead(gpio2Pin);
if (gpio2State == LOW) {
digitalWrite(gpio12Pin, LOW);
stateGPIO12 = LOW;
} else {
digitalWrite(gpio12Pin, HIGH);
stateGPIO12 = HIGH;
}
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(wifiStatusPin, !digitalRead(wifiStatusPin));
delay(200);
}
}