tutoriales.com

Automatización con Sensores de Movimiento PIR y Arduino: ¡Detecta Presencia Fácilmente!

Descubre cómo integrar sensores de movimiento PIR (infrarrojo pasivo) con Arduino para automatizar tus proyectos. Este tutorial te guiará paso a paso en la detección de presencia, configuración y aplicación en sistemas de seguridad, iluminación y más.

Principiante15 min de lectura17 views
Reportar error

🚀 Introducción a la Detección de Movimiento con PIR y Arduino

¿Alguna vez has deseado que las luces de tu habitación se enciendan automáticamente cuando entras, o recibir una alerta si alguien se acerca a tu puerta? ¡La detección de movimiento es clave para lograrlo! En este tutorial, exploraremos el fascinante mundo de los sensores PIR (Passive Infrared) y cómo integrarlos con Arduino para dar vida a tus ideas de automatización.

Los sensores PIR son dispositivos económicos y muy populares que detectan cambios en los niveles de radiación infrarroja, que es emitida por todos los objetos con una temperatura por encima del cero absoluto. Básicamente, cuando un cuerpo caliente (como una persona o animal) se mueve dentro del rango del sensor, este detecta una variación y la interpreta como movimiento. Son perfectos para una amplia gama de proyectos, desde sistemas de seguridad básicos hasta soluciones de ahorro de energía.

Este tutorial está diseñado para que, al finalizarlo, seas capaz de:

  • Entender el funcionamiento básico de un sensor PIR.
  • Conectar correctamente un sensor PIR a tu placa Arduino.
  • Programar Arduino para leer la señal del sensor PIR.
  • Ajustar la sensibilidad y el tiempo de retardo del sensor.
  • Implementar un proyecto práctico de iluminación automática con un sensor PIR.
💡 Consejo: La paciencia y la experimentación son tus mejores aliados en el mundo de Arduino. ¡No te desanimes si algo no funciona a la primera!

📖 ¿Qué es un Sensor PIR y Cómo Funciona?

Un sensor PIR, o sensor infrarrojo pasivo, no emite ninguna energía. En su lugar, detecta la energía infrarroja que irradian los objetos en su campo de visión. Cada objeto con una temperatura superior al cero absoluto emite una pequeña cantidad de radiación infrarroja. ¡Incluso nosotros!

El corazón de un sensor PIR típico es un sensor piroeléctrico que está encapsulado detrás de una lente de Fresnel. Esta lente especial está segmentada en varias facetas, cada una de las cuales enfoca la radiación infrarroja de una sección diferente del campo de visión del sensor en un punto específico del elemento piroeléctrico.

🔍 Componentes Clave del Sensor PIR (HC-SR501)

El modelo más común y accesible es el HC-SR501. Conozcamos sus partes:

  • Lente de Fresnel: La cúpula blanca translúcida en la parte superior. Esta lente tiene múltiples facetas que dividen el campo de visión en segmentos. Cuando una fuente de calor (como una persona) se mueve de un segmento a otro, se produce un cambio detectado por el sensor.
  • Sensor Piroeléctrico: Ubicado debajo de la lente, este componente es sensible a la radiación infrarroja. Contiene dos ranuras sensibles que detectan las diferencias de temperatura. Cuando una de las ranuras detecta un cambio mayor que la otra, el sensor detecta movimiento.
  • Pines de Conexión: Generalmente tres pines: VCC (alimentación), GND (tierra) y OUT (salida de señal).
  • Potenciómetros de Ajuste: Dos potenciómetros para configurar el sensor:
    • Sensibilidad (Sx): Controla el rango de detección del sensor. Girándolo en sentido horario, aumenta la sensibilidad y, por lo tanto, el rango.
    • Tiempo de Retardo (Tx): Define cuánto tiempo la señal de salida permanece 'HIGH' (activa) después de detectar movimiento. Girándolo en sentido horario, aumenta el tiempo de retardo.
  • Jumper de Modo de Disparo (Trigger Mode Jumper): Permite seleccionar entre dos modos de operación:
    • Disparo Repetible (H): Mientras haya movimiento en el área de detección, el pin de salida permanecerá 'HIGH'. Si el movimiento cesa y vuelve a detectarse antes de que expire el tiempo de retardo, el temporizador se reinicia. Es el modo más común para iluminación automática.
    • Disparo No Repetible (L): El pin de salida se activa 'HIGH' por el tiempo de retardo establecido y luego vuelve a 'LOW', sin importar si hay más movimiento. Para una nueva detección, el sensor debe pasar por un ciclo 'LOW' -> 'HIGH'. Útil para aplicaciones donde solo se necesita una única notificación por evento.
📌 Nota: Los nombres de los potenciómetros pueden variar ligeramente (ej. Delay Time, Sensitivity, Tx, Sx) pero su función es la misma.
LENTE DE FRESNEL (Sensor Piroeléctrico debajo) Sensibilidad + - Retardo + - H L Modo H: Repetible L: Único VCC OUT GND SENSOR PIR HC-SR501

🛠️ Materiales Necesarios

Antes de sumergirnos en la conexión y programación, asegúrate de tener los siguientes componentes:

  • Placa Arduino: Un Arduino UNO, Nano o Mega es perfecto.
  • Sensor de Movimiento PIR (HC-SR501): El protagonista de nuestro proyecto.
  • Protoboard: Para conexiones temporales y fáciles.
  • Cables Jumper: Macho-macho y macho-hembra para las conexiones.
  • LED: Opcional, para visualizar la detección de movimiento.
  • Resistencia de 220 ohmios: Para el LED (si lo utilizas).
  • Cable USB: Para conectar Arduino a tu computadora.
🔥 Importante: Siempre desconecta la alimentación de Arduino antes de realizar cualquier conexión física para evitar cortocircuitos o daños en los componentes.

🔌 Conexión del Sensor PIR a Arduino

La conexión del sensor PIR es bastante sencilla. Solo necesitamos tres cables.

Diagrama de Conexión

Aquí tienes el esquema de conexión paso a paso:

  1. VCC (Alimentación): Conecta el pin VCC del sensor PIR al pin de 5V de tu Arduino.
  2. GND (Tierra): Conecta el pin GND del sensor PIR al pin GND de tu Arduino.
  3. OUT (Salida de Datos): Conecta el pin OUT del sensor PIR a un pin digital de tu Arduino. Usaremos el pin D2 para este tutorial.

Si deseas añadir un LED para visualizar la detección:

  1. LED: Conecta el ánodo (pata larga) del LED a un pin digital de Arduino (por ejemplo, D13, que tiene una resistencia interna). Conecta el cátodo (pata corta) del LED a una resistencia de 220 ohmios, y el otro extremo de la resistencia a GND.
ARDUINO UNO D13 (LED) D2 (OUT) 5V (VCC) GND SENSOR PIR VCC OUT GND LED 220Ω Esquema de Conexión: Detector de Movimiento
📌 Nota: Algunos sensores PIR pueden tener pines VCC y GND intercambiados en la serigrafía o un orden diferente. Siempre verifica la hoja de datos (datasheet) o las etiquetas en tu sensor específico.

👨‍💻 Programación de Arduino para Detección PIR

Ahora que tenemos el hardware conectado, es hora de escribir el código para que Arduino interprete las señales del sensor PIR.

📝 Código Básico de Detección

Este código simplemente leerá el estado del pin de salida del sensor PIR y lo mostrará en el Monitor Serial. También encenderá un LED cuando se detecte movimiento.

// Definimos los pines a utilizar
const int PIR_PIN = 2; // Pin donde conectamos el pin OUT del sensor PIR
const int LED_PIN = 13; // Pin donde conectamos el LED (el pin 13 ya tiene una resistencia interna en la mayoría de Arduinos UNO/Nano)

// Variable para almacenar el estado del sensor
int pirState = LOW; // Estado inicial: sin movimiento
int val = 0;        // Variable para leer el estado del pin PIR

void setup() {
  // Configuramos el pin del sensor PIR como entrada
  pinMode(PIR_PIN, INPUT);
  // Configuramos el pin del LED como salida
  pinMode(LED_PIN, OUTPUT);
  // Iniciamos la comunicación serial para depuración
  Serial.begin(9600);
  Serial.println("Sensor PIR inicializado.");
  Serial.println("Calibrando...");

  // Damos tiempo al sensor PIR para calibrarse (alrededor de 10-60 segundos)
  // Durante este tiempo, evita el movimiento frente al sensor.
  delay(10000); // 10 segundos de calibración
  Serial.println("Calibración completa. Esperando movimiento...");
}

void loop() {
  // Leemos el valor del pin del sensor PIR
  val = digitalRead(PIR_PIN);

  // Si se detecta movimiento (pin HIGH)
  if (val == HIGH) {
    // Si el estado anterior era LOW (sin movimiento), significa que es una nueva detección
    if (pirState == LOW) {
      Serial.println("Movimiento detectado!");
      digitalWrite(LED_PIN, HIGH); // Encendemos el LED
      pirState = HIGH; // Actualizamos el estado a 'con movimiento'
    }
  }
  // Si no hay movimiento (pin LOW)
  else {
    // Si el estado anterior era HIGH (con movimiento), significa que el movimiento ha cesado
    if (pirState == HIGH) {
      Serial.println("Movimiento finalizado.");
      digitalWrite(LED_PIN, LOW); // Apagamos el LED
      pirState = LOW; // Actualizamos el estado a 'sin movimiento'
    }
  }
  // Pequeño retardo para evitar lecturas demasiado rápidas
  delay(50);
}

💡 Explicación del Código

  1. const int PIR_PIN = 2; y const int LED_PIN = 13;: Declaramos constantes para los números de pin que usamos. Esto hace que el código sea más legible y fácil de modificar.
  2. pirState = LOW; y val = 0;: pirState almacena el estado actual de detección (si hay movimiento o no). val se usa para leer el valor del pin digital del PIR en cada iteración del loop.
  3. void setup(): Esta función se ejecuta una sola vez al inicio.
    • pinMode(PIR_PIN, INPUT);: Configura el pin 2 como entrada, ya que vamos a leer una señal de él.
    • pinMode(LED_PIN, OUTPUT);: Configura el pin 13 como salida, ya que vamos a enviar una señal a él para encender/apagar el LED.
    • Serial.begin(9600);: Inicia la comunicación serial a 9600 baudios para poder ver mensajes en el Monitor Serial.
    • delay(10000);: ¡Muy importante! Los sensores PIR necesitan un tiempo de calibración inicial (entre 10 y 60 segundos). Durante este tiempo, el sensor se ajusta a las condiciones ambientales. Si detecta movimiento durante este período, puede funcionar de manera errática. Por eso, es crucial evitar el movimiento frente a él mientras se calibra.
  4. void loop(): Esta función se ejecuta repetidamente después de setup().
    • val = digitalRead(PIR_PIN);: Leemos el estado del pin del sensor PIR. Si detecta movimiento, val será HIGH (1); de lo contrario, será LOW (0).
    • if (val == HIGH): Si se detecta movimiento...
      • if (pirState == LOW): Comprueba si el estado anterior era LOW. Esto nos ayuda a imprimir el mensaje "Movimiento detectado!" solo una vez por evento, y no repetidamente mientras el sensor esté activo.
      • digitalWrite(LED_PIN, HIGH);: Enciende el LED.
      • pirState = HIGH;: Actualiza el estado del movimiento.
    • else: Si no hay movimiento...
      • if (pirState == HIGH): Comprueba si el estado anterior era HIGH. Esto nos ayuda a imprimir "Movimiento finalizado." solo una vez cuando el movimiento cesa.
      • digitalWrite(LED_PIN, LOW);: Apaga el LED.
      • pirState = LOW;: Actualiza el estado del movimiento.
    • delay(50);: Un pequeño retardo para asegurar lecturas estables.

⚙️ Ajuste de los Potenciómetros y Jumper

Una vez subido el código, puedes ajustar los potenciómetros en tu sensor PIR para adaptarlo a tus necesidades:

  • Potenciómetro de Sensibilidad (Sx): Gíralo en sentido horario para aumentar el rango de detección (detectar movimientos a mayor distancia) o en sentido antihorario para reducirlo.
  • Potenciómetro de Tiempo de Retardo (Tx): Este ajusta cuánto tiempo permanece el pin de salida HIGH después de la detección. Gíralo en sentido horario para aumentar el tiempo (desde unos segundos hasta varios minutos) o en sentido antihorario para reducirlo (hasta unos 3 segundos).
  • Jumper de Modo de Disparo (H/L):
    • Coloca el jumper en H (Disparo Repetible) si quieres que la señal HIGH se mantenga mientras haya movimiento continuo (ideal para luces que deben permanecer encendidas).
    • Coloca el jumper en L (Disparo No Repetible) si necesitas que la señal HIGH solo se active una vez por evento de movimiento, por un tiempo fijo, sin que el movimiento continuo lo reinicie.
⚠️ Advertencia: Realiza los ajustes de los potenciómetros y jumper con el sensor conectado, pero con cuidado de no tocar los componentes con la mano, ya que puedes introducir interferencias o dañar la placa.

🎯 Proyecto Práctico: Iluminación Automática con PIR

Vamos a llevar nuestro conocimiento a la práctica creando un sistema de iluminación automático simple. Cuando se detecte movimiento, una luz (representada por un LED) se encenderá por un tiempo determinado y luego se apagará.

Materiales Adicionales (Opcional, para un sistema más robusto)

  • Módulo Relé de 5V: Para controlar cargas de mayor potencia (como una bombilla de CA) con Arduino.
  • Bombilla de CA y portalámparas: Si quieres controlar una luz real.
  • Diodo 1N4001: Para proteger el relé.
  • Fuente de alimentación externa para el relé: Si la carga es grande.
📌 Nota: Este tutorial solo se centrará en el control del LED para mantener la seguridad y simplicidad. Controlar la tensión de red (220V/110V) con relés requiere conocimientos de seguridad eléctrica y se recomienda precaución extrema o la asistencia de un profesional.

🔌 Conexión con un LED (Revisión)

La conexión es idéntica a la que hicimos en la sección anterior para el LED, usando el pin 13 de Arduino.

📝 Código para Iluminación Automática

Este código utiliza el sensor PIR para encender un LED y lo mantiene encendido por el tiempo de retardo configurado en el propio sensor PIR (o un tiempo programado si lo prefieres).

// Definimos los pines a utilizar
const int PIR_PIN = 2; // Pin donde conectamos el pin OUT del sensor PIR
const int LIGHT_PIN = 13; // Pin donde conectamos la luz (LED o un relé para una bombilla)

// Variable para almacenar el estado del sensor
int pirState = LOW; // Estado inicial: sin movimiento
int val = 0;        // Variable para leer el estado del pin PIR

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(LIGHT_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Sistema de Iluminación Automática con PIR inicializado.");
  Serial.println("Calibrando sensor PIR...");
  delay(15000); // 15 segundos de calibración para asegurar estabilidad
  Serial.println("Calibración completa. Modo de ahorro de energía activo.");
  digitalWrite(LIGHT_PIN, LOW); // Aseguramos que la luz esté apagada al inicio
}

void loop() {
  val = digitalRead(PIR_PIN);

  if (val == HIGH) {
    // Si se detecta movimiento y el estado anterior era 'sin movimiento'
    if (pirState == LOW) {
      Serial.println("¡Movimiento detectado! Encendiendo luz.");
      digitalWrite(LIGHT_PIN, HIGH); // Encendemos la luz
      pirState = HIGH; // Actualizamos el estado
    }
  }
  else {
    // Si no hay movimiento y el estado anterior era 'con movimiento'
    if (pirState == HIGH) {
      Serial.println("Movimiento cesado. Apagando luz.");
      digitalWrite(LIGHT_PIN, LOW); // Apagamos la luz
      pirState = LOW; // Actualizamos el estado
    }
  }
  delay(50); // Pequeño retardo para estabilidad
}

💡 Mejora: Control del Tiempo de Encendido por Software (Sin usar el potenciómetro de retardo del PIR)

En el código anterior, el tiempo que la luz permanece encendida está determinado por el potenciómetro de retardo del sensor PIR. Sin embargo, a veces queremos un control más preciso o un retardo mucho mayor. Podemos lograr esto ignorando el retardo del PIR y gestionándolo completamente con Arduino.

Para esto, configuraremos el potenciómetro de Tiempo de Retardo (Tx) del sensor PIR al mínimo (girarlo completamente en sentido antihorario) y el jumper en modo Disparo No Repetible (L). Así, el sensor PIR enviará un pulso HIGH corto cada vez que detecte movimiento, y nosotros gestionaremos el tiempo de encendido del LED con código.

// Definimos los pines a utilizar
const int PIR_PIN = 2; // Pin donde conectamos el pin OUT del sensor PIR
const int LIGHT_PIN = 13; // Pin donde conectamos la luz (LED o un relé)

// Tiempo que la luz permanecerá encendida después del último movimiento detectado (en milisegundos)
const long LIGHT_ON_TIME = 10000; // 10 segundos

// Variables de estado
int pirValue = 0; // Valor actual del sensor PIR
long lastMotionTime = 0; // Almacena el último momento en que se detectó movimiento
bool lightState = false; // Estado actual de la luz (false = apagada, true = encendida)

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(LIGHT_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Sistema de Iluminación Automática con control de tiempo por software.");
  Serial.println("Calibrando sensor PIR (coloque el potenciómetro de tiempo al mínimo y jumper en L)...");
  delay(15000);
  Serial.println("Calibración completa. Esperando movimiento.");
  digitalWrite(LIGHT_PIN, LOW); // Aseguramos que la luz esté apagada al inicio
}

void loop() {
  pirValue = digitalRead(PIR_PIN);

  if (pirValue == HIGH) {
    // Si se detecta movimiento, actualizamos el tiempo del último movimiento
    lastMotionTime = millis();
    if (!lightState) {
      Serial.println("¡Movimiento detectado! Encendiendo luz.");
      digitalWrite(LIGHT_PIN, HIGH); // Encendemos la luz
      lightState = true;
    }
  }

  // Comprobamos si ha pasado suficiente tiempo desde el último movimiento
  if (lightState && (millis() - lastMotionTime >= LIGHT_ON_TIME)) {
    Serial.println("Tiempo de luz agotado. Apagando luz.");
    digitalWrite(LIGHT_PIN, LOW); // Apagamos la luz
    lightState = false;
  }

  // Pequeño retardo para evitar lecturas demasiado rápidas
  delay(50);
}

Este código utiliza la función millis() de Arduino para llevar la cuenta del tiempo sin bloquear el programa con delay(). Es una práctica mucho mejor en la mayoría de los proyectos de Arduino para permitir que la placa realice otras tareas simultáneamente.


💡 Consejos y Trucos Adicionales

  • Ubicación del Sensor: Coloca el sensor PIR en un lugar donde tenga un campo de visión despejado de la zona que deseas monitorear. Evita apuntarlo directamente a ventanas o fuentes de calor/frío (aires acondicionados, radiadores) que puedan causar falsas detecciones.
  • Falsas Detecciones: Pequeños animales, corrientes de aire o cambios bruscos de temperatura pueden activar el sensor. Ajusta la sensibilidad y la ubicación para minimizarlas.
  • Alimentación: Asegúrate de que tu Arduino reciba suficiente energía, especialmente si vas a conectar varios componentes. Para proyectos más grandes, una fuente de alimentación externa para Arduino es recomendable.
  • Protección: Considera usar una carcasa para proteger el sensor PIR del polvo y la humedad si lo vas a usar al aire libre (asegurándote de que la lente de Fresnel no se obstruya).
  • Modo de Bajo Consumo: Para aplicaciones que funcionan con baterías, investiga sobre los modos de bajo consumo de Arduino y del propio sensor PIR para extender la vida útil de la batería.

FAQ: Preguntas Frecuentes

P: Mi sensor PIR no detecta nada, ¿qué hago?

R: Revisa las conexiones. Asegúrate de que VCC y GND estén correctamente conectados. Verifica el potenciómetro de sensibilidad (gíralo en sentido horario para aumentar). Dale al sensor tiempo suficiente para calibrarse después de encenderlo (10-60 segundos sin movimiento). Prueba con el jumper en el modo 'H'.

P: El LED se enciende sin que haya nadie, ¿es un fantasma?

R: ¡Probablemente no! Esto se conoce como falsa detección. Puede ser causado por corrientes de aire, mascotas pequeñas, cambios bruscos de temperatura (radiadores encendiéndose, sol directo en la ventana), o interferencias eléctricas. Intenta reducir la sensibilidad del sensor, cambiar su ubicación o protegerlo de corrientes de aire.

P: ¿Puedo usar múltiples sensores PIR con Arduino?

R: Sí, absolutamente. Simplemente conecta el pin OUT de cada sensor PIR a un pin digital diferente de Arduino y lee cada uno de ellos en tu código. Puedes expandir la lógica para detectar movimiento en varias zonas.

P: ¿Cuál es el rango de detección típico de un HC-SR501?

R: Típicamente, entre 3 y 7 metros, con un ángulo de detección de aproximadamente 120 grados, aunque esto puede variar según el modelo, las condiciones ambientales y el ajuste de sensibilidad.


✅ Conclusión

¡Felicidades! Has completado este tutorial y ahora tienes los conocimientos para integrar sensores PIR en tus proyectos de Arduino. Has aprendido sobre su funcionamiento, cómo conectarlos, programarlos y ajustarlos a tus necesidades. La detección de movimiento es una habilidad fundamental que abre un mundo de posibilidades en la automatización del hogar, sistemas de seguridad, juguetes interactivos y mucho más.

Recuerda que este es solo el comienzo. ¡Experimenta con diferentes configuraciones, combina el sensor PIR con otros componentes (como módulos de sonido o pantallas LCD) y deja volar tu creatividad!

Esperamos que este tutorial te haya sido útil y te inspire a seguir explorando el emocionante universo de Arduino. ¡Hasta el próximo proyecto!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!