#include <WiFi.h>
#include <WiFiClient.h>
// Definir pines GPIO para controlar los dispositivos
const int luzPin = 12; // GPIO para controlar la luz
const int persianaPin = 13; // GPIO para controlar la persiana
const int ledPin = 14; // GPIO para controlar el LED
const int pulsadorLuzPin = 32; // GPIO para el pulsador de la luz
const int pulsadorPersianaPin = 33;// GPIO para el pulsador de la persiana
const int pulsadorLedPin = 34; // GPIO para el pulsador del LED
// Variable para almacenar el estado anterior de los pulsadores
int estadoAnteriorPulsadorLuz = HIGH;
int estadoAnteriorPulsadorPersiana = HIGH;
int estadoAnteriorPulsadorLed = HIGH;
// Crear una instancia de WiFiServer como una variable global
WiFiServer server(80);
// Prototipos de funciones
void configurarPines();
void conectarWiFi(const char* ssid, const char* password);
void controlarLuz();
void controlarPersiana();
void controlarLed();
void manejarSolicitudesWiFi();
void setup() {
Serial.begin(115200);
delay(10);
configurarPines(); // Configurar pines GPIO
conectarWiFi("DEYMAR", "DEI254598");// Conectar a WiFi
server.begin(); // Iniciar servidor
Serial.println("Listo para recibir solicitudes...");
}
void loop() {
controlarLuz();
controlarPersiana();
controlarLed();
manejarSolicitudesWiFi();
}
void configurarPines() {
// Configurar pines GPIO
pinMode(luzPin, OUTPUT);
pinMode(persianaPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(pulsadorLuzPin, INPUT_PULLUP);
pinMode(pulsadorPersianaPin, INPUT_PULLUP);
pinMode(pulsadorLedPin, INPUT_PULLUP);
// Apagar los dispositivos inicialmente
digitalWrite(luzPin, LOW);
digitalWrite(persianaPin, LOW);
digitalWrite(ledPin, LOW);
}
void conectarWiFi(const char* ssid, const char* password) {
// Conectar a la red WiFi
Serial.println("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: " + WiFi.localIP().toString());
}
void controlarLuz() {
// Controlar la luz con el pulsador
int estadoActualPulsadorLuz = digitalRead(pulsadorLuzPin);
if (estadoActualPulsadorLuz == LOW && estadoAnteriorPulsadorLuz == HIGH) {
digitalWrite(luzPin, !digitalRead(luzPin)); // Cambiar el estado de la luz
delay(200); // Debounce
}
estadoAnteriorPulsadorLuz = estadoActualPulsadorLuz;
}
void controlarPersiana() {
// Controlar la persiana con el pulsador
int estadoActualPulsadorPersiana = digitalRead(pulsadorPersianaPin);
static unsigned long ultimoTiempoPulsadorPersiana = 0;
if (millis() - ultimoTiempoPulsadorPersiana > 50) {
if (estadoActualPulsadorPersiana == LOW && estadoAnteriorPulsadorPersiana == HIGH) {
// Cambiar el estado de la persiana
digitalWrite(persianaPin, !digitalRead(persianaPin));
// Actualizar el último tiempo de pulsación
ultimoTiempoPulsadorPersiana = millis();
}
}
// Actualizar estado anterior de los pulsadores
estadoAnteriorPulsadorPersiana = estadoActualPulsadorPersiana;
}
void controlarLed() {
// Controlar el LED con los comandos recibidos a través de WiFi
static unsigned long ultimoTiempoPulsadorLed = 0;
// Debounce para evitar múltiples pulsaciones
if (millis() - ultimoTiempoPulsadorLed > 50) {
WiFiClient client = server.available(); // Esperar a que se conecte un cliente WiFi
if (client) {
while (client.connected()) {
if (client.available()) {
char command = client.read(); // Leer el comando del cliente WiFi
// Ejemplo de control del LED
switch (command) {
case '1':
digitalWrite(ledPin, HIGH); // Encender LED
client.println("LED encendido");
break;
case '0':
digitalWrite(ledPin, LOW); // Apagar LED
client.println("LED apagado");
break;
default:
client.println("Comando no válido para el LED");
}
// Actualizar el tiempo del último comando
ultimoTiempoPulsadorLed = millis();
}
}
client.stop(); // Liberar cliente WiFi
}
}
}
void manejarSolicitudesWiFi() {
WiFiClient client = server.available(); // Esperar a que se conecte un cliente
if (client) {
Serial.println("Nuevo cliente WiFi conectado");
while (client.connected()) {
if (client.available()) {
char command = client.read(); // Leer el comando del cliente
// Ejemplo de control de dispositivos
switch (command) {
case '1':
digitalWrite(luzPin, HIGH); // Encender luz
client.println("Luz encendida");
break;
case '0':
digitalWrite(luzPin, LOW); // Apagar luz
client.println("Luz apagada");
break;
case '2':
// Controlar persiana
// Inserta aquí el código para controlar la persiana
client.println("Persiana controlada");
break;
case '3':
// Controlar LED
// Inserta aquí el código para controlar el LED
client.println("LED controlado");
break;
default:
client.println("Comando no válido");
}
}
}
client.stop(); // Liberar cliente
Serial.println("Cliente WiFi desconectado");
}
}