Tutorial 5: Detectando Movimiento

¿Qué vamos a hacer?

¡Prepárate para dar un paso más en la automatización de tus proyectos con el Sensor de Movimiento PIR HC-SR501 de tu kit! Este módulo te permitirá detectar la presencia de personas o animales, abriendo la puerta a un sinfín de aplicaciones de seguridad, iluminación automática o incluso juguetes interactivos.

Al final de este tutorial, serás capaz de:

  • Conectar correctamente el sensor PIR HC-SR501 a tu ESP32-C3 SuperMini.
  • Detectar movimiento y mostrar un mensaje en el Monitor Serial.
  • (Opcional): Integrar la detección de movimiento con los LEDs o el Buzzer de tutoriales anteriores para crear alertas visuales o sonoras.

Requisitos Previos:

Antes de comenzar, asegúrate de tener lo siguiente:

  • ESP32-C3 SuperMini (1 unidad)
  • Sensor de Movimiento PIR HC-SR501 (1 unidad)
  • Protoboard de 830 puntos (1 unidad)
  • Cables Dupont F-M y M-M
  • IDE de Arduino con la plataforma ESP32 instalada y configurada (Tutorial 0).
  • (Opcional): LEDs (del Tutorial 1) y/o Buzzer (del Tutorial 2) para las actividades de integración.

Objetivo: Conectar el sensor PIR y leer su estado para detectar movimiento, mostrando el resultado en el Monitor Serial.

Descripción: Esta actividad te familiarizará con el sensor PIR. Lo conectarás a tu ESP32-C3 y escribirás un código simple para saber cuándo se detecta movimiento en su campo de visión.

Materiales que necesitas:

  • ESP32-C3 SuperMini
  • Sensor de Movimiento PIR HC-SR501
  • Cables Dupont

¿Qué es el Sensor de Movimiento PIR HC-SR501?

El Sensor de Movimiento PIR HC-SR501 es un detector de Movimiento por Infrarrojos Pasivo (PIR por sus siglas en inglés). «Pasivo» significa que no emite energía, sino que detecta cambios en la radiación infrarroja (calor) que emiten los cuerpos. Cuando una persona o animal se mueve dentro de su rango, el sensor detecta un cambio en el patrón de calor, y su pin de salida cambia de estado.

Este sensor tiene un lente tipo «domo» que ayuda a ampliar su campo de visión. También tiene dos potenciómetros en su base (usualmente naranja o azules) que te permiten ajustar:

  1. Sensibilidad: Qué tan lejos o qué tan pequeño debe ser el movimiento para ser detectado.
  2. Tiempo de Retardo: Por cuánto tiempo la señal de salida permanece activa después de la última detección de movimiento.

Cuando el sensor PIR detecta movimiento, su pin de salida pasa a un estado ALTO (HIGH). Cuando no hay movimiento (o el tiempo de retardo ha terminado), vuelve a BAJO (LOW). Es una salida digital simple de «sí» o «no».

Conexión del circuito (Sensor PIR HC-SR501):

¡Antes de conectar, asegúrate de que tu ESP32-C3 SuperMini esté desconectada del computador!

El sensor PIR HC-SR501 tiene 3 pines claramente identificados:

  • Pin VCC o + del PIR a 3.3V en tu ESP32-C3.
  • Pin GND o - del PIR a GND en tu ESP32-C3.
  • Pin OUT (Salida) del PIR a GPIO 2 en tu ESP32-C3. (Podrías usar otro GPIO digital disponible si lo deseas).

Esquemático y Simulación en Wokwi:

Observa cómo se conecta el sensor PIR a tu ESP32-C3 SuperMini. En Wokwi, podrás simular el movimiento y ver cómo cambia el estado del sensor en el Monitor Serial.

Tutorial 5: Detectando Movimiento

Código para la Actividad 1:

Para esta actividad, no necesitas librerías adicionales, ya que digitalRead() es una función nativa de Arduino.

// Define el pin donde está conectado el pin de Salida (OUT) del sensor PIR.
#define PIR_SENSOR_PIN GPIO_NUM_2

// Variable para almacenar el estado actual del sensor PIR
int pirState = LOW; // Inicialmente, asumimos que no hay movimiento
// Variable para almacenar el estado anterior, para detectar cambios
int lastPirState = LOW;

void setup() {
  Serial.begin(115200); // Inicia la comunicación serial
  Serial.println(F("Iniciando Monitor de Movimiento PIR..."));
  pinMode(PIR_SENSOR_PIN, INPUT); // Configura el pin del PIR como entrada
}

void loop() {
  // Lee el estado actual del sensor PIR (HIGH si detecta movimiento, LOW si no)
  pirState = digitalRead(PIR_SENSOR_PIN);

  // Compara el estado actual con el estado anterior para detectar un cambio
  if (pirState != lastPirState) {
    if (pirState == HIGH) {
      // Se detectó movimiento
      Serial.println(F("¡MOVIMIENTO DETECTADO!"));
    } else {
      // El movimiento ha cesado
      Serial.println(F("Movimiento FINALIZADO."));
    }
    delay(50); // Pequeña pausa para estabilizar la lectura después del cambio
    lastPirState = pirState; // Actualiza el estado anterior
  }

  // Si no hay cambio, no imprimimos nada para no saturar el Monitor Serial
  delay(10); // Pequeña pausa entre lecturas para no sobrecargar el bucle
}

Objetivo: Integrar el sensor PIR con un LED (del Tutorial 1) para que el LED se encienda cuando se detecte movimiento.

Descripción: Esta actividad te permitirá crear una simple alarma visual. El LED se encenderá automáticamente cuando el PIR detecte la presencia de algo, y se apagará cuando el movimiento cese.

Materiales que necesitas:

  • ESP32-C3 SuperMini
  • Sensor de Movimiento PIR HC-SR501
  • LED (rojo, amarillo o verde)
  • Resistencia de 220 Ohm (para proteger el LED, como en el Tutorial 1)
  • Cables Dupont
  • Protoboard

Conexión del circuito:

¡Asegúrate de que tu ESP32-C3 SuperMini esté desconectada del computador!

  • Conexiones PIR: (Las mismas que la Actividad 1)
    • VCC del PIR a 3.3V
    • GND del PIR a GND
    • OUT del PIR a GPIO 2
  • Conexiones LED: (Revisa el Tutorial 1)
    • Patilla más larga (ánodo) del LED a GPIO 3 en tu ESP32-C3.
    • Patilla más corta (cátodo) del LED a un extremo de la Resistencia de 220 Ohm.
    • El otro extremo de la Resistencia de 220 Ohm a GND.

Esquemático y Simulación en Wokwi:

Aquí verás cómo se conectan el PIR y el LED. Haz clic en la imagen para abrir la simulación en Wokwi y observa cómo el LED se enciende al detectar movimiento simulado.

Tutorial 5: Detectando Movimiento

Código para la Actividad 2:

// Define el pin para el sensor PIR
#define PIR_SENSOR_PIN GPIO_NUM_2
// Define el pin para el LED
#define LED_PIN GPIO_NUM_3

int pirState = LOW;      // Variable para el estado del PIR
int lastPirState = LOW;  // Variable para el estado anterior del PIR

void setup() {
  Serial.begin(115200);
  Serial.println(F("Sistema de Alerta de Movimiento (PIR + LED)..."));
  pinMode(PIR_SENSOR_PIN, INPUT); // Pin del PIR como entrada
  pinMode(LED_PIN, OUTPUT);     // Pin del LED como salida
}

void loop() {
  pirState = digitalRead(PIR_SENSOR_PIN); // Lee el estado del PIR

  if (pirState != lastPirState) {
    if (pirState == HIGH) {
      // Movimiento detectado: enciende el LED
      digitalWrite(LED_PIN, HIGH);
      Serial.println(F("¡MOVIMIENTO DETECTADO! LED Encendido."));
    } else {
      // Movimiento cesado: apaga el LED
      digitalWrite(LED_PIN, LOW);
      Serial.println(F("Movimiento FINALIZADO. LED Apagado."));
    }
    delay(50); // Pequeña pausa para estabilizar
    lastPirState = pirState;
  }

  delay(10);
}

Objetivo: Combinar el sensor PIR con un LED y un Buzzer (del Tutorial 2) para crear una alarma completa que se active al detectar movimiento.

Descripción: Lleva tu alarma al siguiente nivel. Al detectar movimiento, no solo encenderás un LED, sino que también activarás un sonido de alarma con el buzzer. Esto es ideal para una pequeña alarma de seguridad o un sistema de bienvenida.

Materiales que necesitas:

  • ESP32-C3 SuperMini
  • Sensor de Movimiento PIR HC-SR501
  • LED
  • Resistencia de 220 Ohm
  • Buzzer (Activo o Pasivo, como en el Tutorial 2)
  • Cables Dupont
  • Protoboard

Conexión del circuito:

¡Asegúrate de que tu ESP32-C3 SuperMini esté desconectada del computador!

  • Conexiones PIR: (Las mismas que la Actividad 1)
    • VCC del PIR a 3.3V
    • GND del PIR a GND
    • OUT del PIR a GPIO 2
  • Conexiones LED: (Las mismas que la Actividad 2)
    • Ánodo del LED a GPIO 3.
    • Cátodo del LED a Resistencia de 220 Ohm a GND.
  • Conexiones Buzzer: (Revisa el Tutorial 2. Usaremos el Buzzer Activo para simplicidad)
    • Pin positivo + del Buzzer Activo a GPIO 6 en tu ESP32-C3.
    • Pin negativo - del Buzzer Activo a GND.

Esquemático y Simulación en Wokwi:

Aquí verás cómo se conectan el PIR, el LED y el Buzzer. Haz clic en la imagen para abrir la simulación en Wokwi y observa cómo se activa la alarma visual y sonora al detectar movimiento.

Tutorial 5: Detectando Movimiento

Código para la Actividad 3:

// Pines de componentes
#define PIR_SENSOR_PIN GPIO_NUM_2
#define LED_PIN GPIO_NUM_3
#define BUZZER_PIN GPIO_NUM_6 // Pin para el Buzzer Pasivo

int pirState = LOW;      // Estado actual del PIR
int lastPirState = LOW;  // Estado anterior del PIR

// Función para generar el sonido de "policía" con el buzzer pasivo
void playPoliceSiren() {
  // Patrón simple de dos tonos alternados
  tone(BUZZER_PIN, 1000); // Primer tono (ej. 1000 Hz)
  delay(200);             // Dura 200 ms
  tone(BUZZER_PIN, 1500); // Segundo tono (ej. 1500 Hz)
  delay(200);             // Dura 200 ms
  noTone(BUZZER_PIN);     // Detiene el sonido entre ciclos si se desea un "gap"
}

void setup() {
  Serial.begin(115200);
  Serial.println(F("¡Sistema de Alarma Completa (PIR + LED + Buzzer Policial) Activado!"));
  pinMode(PIR_SENSOR_PIN, INPUT); // PIR como entrada
  pinMode(LED_PIN, OUTPUT);     // LED como salida
  pinMode(BUZZER_PIN, OUTPUT);  // Buzzer como salida (importante para tone())
  digitalWrite(LED_PIN, LOW);   // Aseguramos que el LED esté apagado al inicio
  noTone(BUZZER_PIN);           // Aseguramos que el buzzer esté en silencio al inicio
}

void loop() {
  pirState = digitalRead(PIR_SENSOR_PIN); // Lee el estado del PIR

  if (pirState != lastPirState) {
    if (pirState == HIGH) {
      // Movimiento detectado: enciende el LED y activa la sirena
      digitalWrite(LED_PIN, HIGH);
      Serial.println(F("¡ALERTA! MOVIMIENTO DETECTADO. Sirena y LED Activados."));
    } else {
      // Movimiento cesado: apaga el LED y el buzzer
      digitalWrite(LED_PIN, LOW);
      noTone(BUZZER_PIN); // Desactiva la sirena
      Serial.println(F("Movimiento FINALIZADO. Alarma Desactivada."));
    }
    delay(50); // Pequeña pausa para estabilizar
    lastPirState = pirState;
  }

  // Si se detecta movimiento (pirState es HIGH), reproduce la sirena continuamente.
  // La sirena se detendrá cuando pirState vuelva a LOW en el 'if' anterior.
  if (pirState == HIGH) {
    playPoliceSiren();
  }

  delay(10); // Pequeña pausa para no sobrecargar el bucle
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *