Raspberry (11): Conectar un detector de movimiento pasivo o “PIR” a la Raspberry.

Vamos a ver en este capítulo como conectar un detector de movimiento pasivo o “PIR” de forma que nuestra Raspberry detecte movimientos en el lugar que deseemos y en ese caso realizar la acción oportuna.

Contenido de los ficheros para que puedas “copiar/pegar“:

Fichero “detectaMovimiento.py”:

# import para detectar el movimiento.
import RPi.GPIO as GPIO
import time as pausa
from datetime import datetime # Para obtener la fecha/hora

# Inicializaciones del detector de movimiento:
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN) # PIR
GPIO.setup(12, GPIO.OUT) # Buzzer

# PAUSA antes de empezar, para retardar la alarma:
pausa.sleep(1) # Tiempo de espera para activar la alarma en segundos

ahora = datetime.now()
ano = str(ahora.year)
mes = str(ahora.month).zfill(2)
dia = str(ahora.day).zfill(2)
hora = str(ahora.hour).zfill(2)
minutos = str(ahora.minute).zfill(2)
segundos = str(ahora.second).zfill(2)
milisegundos = str(ahora.microsecond).zfill(6)
ahoraTexto = dia + "-"+ mes + "-" + ano + " " + hora + ":" + minutos + ":" + segundos + ":" + milisegundos
print('ACTIVANDO LA ALARMA PIR.... ' + ahoraTexto)

try:
  pausa.sleep(2) # Para estabilizar el sensor
  while True:
    if GPIO.input(23): # Si se detecta MOVIMIENTO:
      ahora = datetime.now() # time.strftime("%Y-%m-%d-%H-%M-%S")
      ano = str(ahora.year)
      mes = str(ahora.month).zfill(2)
      dia = str(ahora.day).zfill(2)
      hora = str(ahora.hour).zfill(2)
      minutos = str(ahora.minute).zfill(2)
      segundos = str(ahora.second).zfill(2)
      milisegundos = str(ahora.microsecond).zfill(6)
      ahoraTexto = dia + "-"+ mes + "-" + ano + " " + hora + ":" + minutos + ":" + segundos + ":" + milisegundos
      print (' - Movimiento detectado: ' + ahoraTexto)
      GPIO.output(12, True) # Pitido del buzzer
      pausa.sleep(0.5) #Retardo para la duración del Buzzer
      GPIO.output(12, False) # Termina el pitido del buzzer
    pausa.sleep(0.2) # Retardo del BUCLE, debe ser MENOR que el retardo de la detección del movimiento.

except: # Para detectar cuando se pulsa “Ctrl + C”.
  GPIO.cleanup()
  print("Fin..")
  quit()

Fichero “detectaMovimiento2.py”:

# import para detectar el movimiento.
import RPi.GPIO as GPIO
import time as pausa
from datetime import datetime # Para obtener la fecha/hora

# Inicializaciones del detector de movimiento:
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN) # PIR
GPIO.setup(12, GPIO.OUT) # Buzzer

# PAUSA antes de empezar, para retardar la alarma:
pausa.sleep(1) # Tiempo de espera para activar la alarma en segundos

ahora = datetime.now()
ano = str(ahora.year)
mes = str(ahora.month).zfill(2)
dia = str(ahora.day).zfill(2)
hora = str(ahora.hour).zfill(2)
minutos = str(ahora.minute).zfill(2)
segundos = str(ahora.second).zfill(2)
milisegundos = str(ahora.microsecond).zfill(6)
ahoraTexto = dia + "-"+ mes + "-" + ano + " " + hora + ":" + minutos + ":" + segundos + ":" + milisegundos
print('ACTIVANDO LA ALARMA PIR.... ' + ahoraTexto)

try:
  pausa.sleep(2) # Para estabilizar el sensor
  while True:
    if GPIO.input(23): # Si se detecta MOVIMIENTO:
      ahora = datetime.now() # time.strftime("%Y-%m-%d-%H-%M-%S")
      ano = str(ahora.year)
      mes = str(ahora.month).zfill(2)
      dia = str(ahora.day).zfill(2)
      hora = str(ahora.hour).zfill(2)
      minutos = str(ahora.minute).zfill(2)
      segundos = str(ahora.second).zfill(2)
      milisegundos = str(ahora.microsecond).zfill(6)
      ahoraTexto = dia + "-"+ mes + "-" + ano + " " + hora + ":" + minutos + ":" + segundos + ":" + milisegundos
      print (' - Movimiento detectado: ' + ahoraTexto)
      GPIO.output(12, True) # Pitido del buzzer
      pausa.sleep(0.5) #Retardo para la duración del Buzzer
      GPIO.output(12, False) # Termina el pitido del buzzer
      pausa.sleep(0.2) # para evitar múltiples avisos.
      while GPIO.input(23):
        GPIO.output(12, True) # Pitido del buzzer
        pausa.sleep(0.5) #Retardo para la duración del Buzzer
        GPIO.output(12, False)
        pausa.sleep(0.3) # para evitar múltiples avisos.
      pausa.sleep(0.2) # Retardo del BUCLE, debe ser MENOR que el retardo de la detección del movimiento.

except: # Para detectar cuando se pulsa "Ctrl + C"
  GPIO.cleanup()
  print("Fin..")
  quit()

Fichero “detectaMovimiento.sh”:

#!/bin/bash
#Preparamos la entrada.
echo 23 > /sys/class/gpio/export

echo "Activando el PIR . . ."
# Espero un segundo para que se inicialice el "export"
sleep 1

#Le indico que el GPIO es de salida:
echo in > /sys/class/gpio/gpio23/direction

# Capturo "Ctrl+C" para liberar el PIN.
int_handler()
  {
  #Eliminaremos la entrada GPIO para libera el pin
  echo 23 > /sys/class/gpio/unexport
  echo "Proceso finalizado."
  exit 1
  }

trap 'int_handler' INT

#Bucle infinito
while [ 1 ]
  do
    Valor=$(gpio -g read 23)
    # echo $Valor
    if test $Valor -eq 1 ;
    then
      echo "Movimiento: $(date +'%d/%m/%Y %H:%M:%S')"
      # Espero un segundo para comprobar otra vez el PIR.
      sleep 1
#   else
#     echo "NO pasa nada"
    fi

  done
Capítulo Anterior Capítulo Siguiente

Deja una respuesta

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