// Incluir librerías necesarias
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
// Configuración de los pines y componentes
#define DHTPIN 15 // Pin del sensor DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT
#define LED1_PIN 12 // Pin del LED1
#define LED2_PIN 14 // Pin del LED2
#define LED3_PIN 27 // Pin del LED3
#define PIR_PIN 4 // Pin del sensor PIR
#define BUZZER_PIN 23 // Pin del buzzer
#define SERVO1_PIN 5 // Pin del servo1
#define SERVO2_PIN 18 // Pin del servo2
// Configuración de WiFi
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// Configuración de ThingSpeak
const char* apiWriteKey = "0915RQP9CTIK03CA";
const char* apiReadKey = "AD2ULG28P1DTOA1R3";
const char* server = "http://api.thingspeak.com";
int channelId = 2770695; // ID de tu canal en ThingSpeak
// Variables globales
DHT dht(DHTPIN, DHTTYPE); // Crear objeto DHT
LiquidCrystal_I2C lcd(0x27, 16, 2); // Crear objeto LCD
Servo servo1, servo2; // Crear objetos para los servos
// Función para configurar el sistema
void setup() {
Serial.begin(115200); // Iniciar comunicación serial
// Configuración de WiFi
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
lcd.begin(16, 2); // Inicializar LCD
lcd.backlight(); // Encender retroiluminación
lcd.setCursor(0, 0);
lcd.print("Conectando WiFi");
// Esperar hasta que el WiFi esté conectado
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.clear();
lcd.print("WiFi Conectado");
// Inicializar sensores y pines
dht.begin();
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Configurar servos
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
servo1.write(0); // Colocar servo1 en posición 0
servo2.write(0); // Colocar servo2 en posición 0
delay(2000); // Esperar 2 segundos
lcd.clear();
lcd.print("Sistema listo");
delay(2000); // Mostrar mensaje inicial
}
// Función principal loop
void loop() {
unsigned long currentMillis = millis();
// Leer datos del sensor DHT22 a intervalos
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
// Mostrar temperatura y humedad en LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print(" %");
sendDataToThingSpeak(temp, hum); // Enviar datos a ThingSpeak
}
// Leer sensor PIR continuamente
if (digitalRead(PIR_PIN) == HIGH) {
lcd.clear();
lcd.print("ALERTA: Mov!");
digitalWrite(BUZZER_PIN, HIGH); // Encender buzzer
delay(1000); // Mantener buzzer encendido por 1 segundo
digitalWrite(BUZZER_PIN, LOW); // Apagar buzzer
lcd.clear();
lcd.print("Movimiento OK");
delay(2000); // Mostrar mensaje de movimiento detectado
}
// Leer comandos de ThingSpeak
String command = readCommandFromThingSpeak();
processCommand(command); // Procesar comando recibido
delay(10); // Pequeño retraso para evitar un ciclo demasiado rápido
}
// Función para enviar datos a ThingSpeak
void sendDataToThingSpeak(float temperature, float humidity) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) + "/update?api_key=" + apiWriteKey +
"&field1=" + String(temperature) +
"&field2=" + String(humidity);
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.println("Datos enviados a ThingSpeak");
} else {
Serial.println("Error al enviar datos");
}
http.end();
}
}
// Función para leer comandos de ThingSpeak
String readCommandFromThingSpeak() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) + "/channels/" + String(channelId) +
"/fields/3/last.txt?api_key=" + apiReadKey;
http.begin(url);
int httpCode = http.GET();
String command = "";
if (httpCode > 0) {
command = http.getString();
Serial.println("Comando recibido: " + command);
} else {
Serial.println("Error al leer comando");
}
http.end();
return command;
}
return "";
}
// Función para procesar comandos recibidos
void processCommand(String command) {
if (command == "LED1_ON") {
digitalWrite(LED1_PIN, HIGH);
lcd.clear();
lcd.print("Luz 1: Encendida");
} else if (command == "LED1_OFF") {
digitalWrite(LED1_PIN, LOW);
lcd.clear();
lcd.print("Luz 1: Apagada");
} else if (command == "LED2_ON") {
digitalWrite(LED2_PIN, HIGH);
lcd.clear();
lcd.print("Luz 2: Encendida");
} else if (command == "LED2_OFF") {
digitalWrite(LED2_PIN, LOW);
lcd.clear();
lcd.print("Luz 2: Apagada");
} else if (command == "LED3_ON") {
digitalWrite(LED3_PIN, HIGH);
lcd.clear();
lcd.print("Luz 3: Encendida");
} else if (command == "LED3_OFF") {
digitalWrite(LED3_PIN, LOW);
lcd.clear();
lcd.print("Luz 3: Apagada");
} else if (command == "SERVO1_90") {
servo1.write(90);
lcd.clear();
lcd.print("Puerta: Abierta");
} else if (command == "SERVO1_0") {
servo1.write(0);
lcd.clear();
lcd.print("Puerta: Cerrada");
} else if (command == "SERVO2_90") {
servo2.write(90);
lcd.clear();
lcd.print("Ventana: Abierta");
} else if (command == "SERVO2_0") {
servo2.write(0);
lcd.clear();
lcd.print("Ventana: Cerrada");
} else {
Serial.println("Comando no reconocido");
}
}