#include <WiFi.h>
#include <ThingSpeak.h> //
// --- 1. Credenciales de tu red Wi-Fi ---
const char* WIFI_NAME = "Wokwi-GUEST"; // Nombre de la red, por defecto wokwi
const char* WIFI_PASSWORD = ""; // usa su red virtual que es Wokwi-Guest
// --- 2. Credenciales de ThingSpeak ---
// Las credenciales se encuentra en la pestaña "API Keys" del canal de ThingSpeak
unsigned long myChannelNumber = 2981376; // (ID del canal)
const char* myWriteAPIKey = "RORCKLM08GQGTWKN"; // (Write API Key)
const char* server = "api.thingspeak.com"; // Esto es del código del video.
WiFiClient client; // Objeto cliente WiFi para ThingSpeak
// --- 3. Configuración de Pines del ESP32 ---
// Al revisar la conexión física. se coloca el numero de pin que esta conectado, como:
const int PIR_PIN = 27; // Pin donde conectas la SALIDA (OUT/D) del sensor PIR.
const int LED_PIN = 12; // Pin donde conectas el LED (a través de una resistencia). // al ESP:12
// --- 4. Variables del Proyecto ---
int movementCount = 0; // Contador para el número de movimientos detectados
int pirState = LOW; // Estado actual del sensor PIR (LOW: no detecta, HIGH: detecta)
int currentPIRValue = 0; // Valor que se lee directamente del pin del PIR
// Variables de tiempo para evitar múltiples conteos y controlar el LED
unsigned long lastDetectionTime = 0; // Guarda el tiempo de la última detección de movimiento
const unsigned long debounceDelay = 2000; // Milisegundos que ignoramos nuevas detecciones después de una (ej. 2 segundos)
const unsigned long ledOnDuration = 5000; // Milisegundos que el LED permanecerá encendido (ej. 5 segundos)
void setup() {
Serial.begin(115200); // Inicia comunicación serial para depuración en el monitor serial
// Configura los pines
pinMode(PIR_PIN, INPUT); // El pin del PIR es una entrada
pinMode(LED_PIN, OUTPUT); // El pin del LED es una salida
// --- 5. Conexión WiFi (tomada del video) ---
Serial.print("Conectando a WiFi ");
Serial.println(WIFI_NAME); // Usa WIFI_NAME definido arriba
WiFi.begin(WIFI_NAME, WIFI_PASSWORD); // Inicia la conexión WiFi con las variables de arriba que es el "Wokwi-GUEST"
while (WiFi.status() != WL_CONNECTED) { // Espera hasta que la conexión WiFi sea exitosa
delay(1000); // Espera 1 segundo
Serial.println("WiFi no conectado"); // Mensaje de que no se ha conectado
}
Serial.println("\nWiFi conectado !"); // Mensaje de conexión exitosa
Serial.print("IP local: ");
Serial.println(WiFi.localIP()); // Muestra la dirección IP asignada al ESP32
// --- Inicialización de ThingSpeak (tomada del video) ---
ThingSpeak.begin(client); // Inicializa la librería ThingSpeak
// La línea "ThingSpeak.setApiKey(myWriteAPIKey);" del video no es necesaria con ThingSpeak.writeField
// El "server" tampoco es estrictamente necesario definirlo para writeField
}
void loop() {
currentPIRValue = digitalRead(PIR_PIN); // Lee el estado actual del sensor PIR
// --- 6. Lógica de Detección de Movimiento y Control de LED ---
if (currentPIRValue == HIGH) { // Si el PIR detecta movimiento (salida ALTA)
if (pirState == LOW) { // Si el PIR acaba de pasar de NO-MOVIMIENTO a MOVIMIENTO (es una nueva detección)
if (millis() - lastDetectionTime > debounceDelay) {
movementCount++; // Incrementa el contador de movimientos
Serial.print("¡Movimiento detectado! Conteo total: ");
Serial.println(movementCount);
digitalWrite(LED_PIN, HIGH); // Enciende el LED
Serial.println("LED ENCENDIDO");
// --- 7. Enviar datos a ThingSpeak ---
// Envía el valor del contador de movimientos al campo 1 de tu canal de ThingSpeak
int httpCode = ThingSpeak.writeField(myChannelNumber, 1, movementCount, myWriteAPIKey);
if (httpCode == 200) {
Serial.println("Datos de movimiento enviados a ThingSpeak exitosamente.");
} else {
Serial.print("Error al enviar a ThingSpeak. Código HTTP: ");
Serial.println(httpCode);
}
lastDetectionTime = millis(); // Actualiza el tiempo de la última detección
}
}
pirState = HIGH; // Establece el estado del PIR como "detectando"
} else { // Si el PIR no detecta movimiento
pirState = LOW; // Establece el estado del PIR como "no detectando"
// --- 8. Lógica para apagar el LED ---
// Si el LED está encendido Y ha pasado el tiempo de ledOnDuration desde la última detección
if (digitalRead(LED_PIN) == HIGH && (millis() - lastDetectionTime > ledOnDuration)) {
digitalWrite(LED_PIN, LOW); // Apaga el LED
Serial.println("LED APAGADO");
}
}
delay(50); // Pequeña pausa para no saturar el bucle
}