Hemos visto como utilizar arduino y recuperar los datos del mismo desde PC o el smartphone, via bluetooth o USB.

Sin embargo, a veces nuestro proyecto no requiere tanto y simplificar el mismo ahorrando hardware y código es la mejor solución.

En este caso vamos a utilizar una Raspberry pi que está siempre activa haciendo tareas varias para que haga tambien de detector de presencia, conectando directamente el sensor PIR a los pines de la Raspy.

Esquema de conexión GPIO de Raspberry PI

Conexiones GPIO – PIR Sensor

Un sensor PIR tiene tres pines: positivo, tierra y datos.

Vamos a conectar Positivo a Pin2, Tierra a Pin6 y Datos a 11.

Código Python

import RPi.GPIO as GPIO
import time
import subprocess

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN)

i=GPIO.input(11)

Con eso ya tendriamos la lectura del sensor, si detecta 1, si no detecta nada 0.

El 11 en ambas lineas indica el pin GPIO utilizado para datos.

Ahora vamos a implementar la lógica:

import RPi.GPIO as GPIO
import time
import subprocess
from datetime import datetime, timedelta
import os
import sys

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN)

def listen_pir():
	INTERVAL=60000*10
	currentmillis = int(round(time.time() * 1000))
	nextmillisMSG=currenmillis+INTERVAL
	i==0
	while i==0:	
		i=GPIO.input(11)
		if i==1:
			return "MOTION!!"
		if(currentmillis>nextmillisMSG):			
			nextmillisMSG=currentmillis+INTERVAL
			return "TIMEOUT##"
		time.sleep(0.5)

def main():
	INTERVAL=60000*1
	nextmillisMSG=0
	lastmillis=0
	ncount=0
	sValue=""
	while True:
		smsg=""
		value = listen_pir()
		currentmillis = int(round(time.time() * 1000))
		stmp="{}: {}...".format(datetime.fromtimestamp(float(currentmillis)/1000).strftime('%Y-%m-%d %H:%M:%S'), value)
		strtstampup = datetime.fromtimestamp(float(currentmillis)/1000).strftime('%Y-%m-%d %H:%M:%S')
		if value=="TIMEOUT##":			
			strtstampini = datetime.fromtimestamp(float(firsttime)/1000).strftime('%Y-%m-%d %H:%M:%S')
			strtstamplast = datetime.fromtimestamp(float(lastmillis)/1000).strftime('%Y-%m-%d %H:%M:%S')
			if ncount>0:
				smsg="END {} {} to {}: {}, count:{}".format(sValue, strtstampini, strtstamplast, value, ncount)
			sValue=""
			ncount=0
		else:
			lastmillis=currentmillis
			if ncount==0:
				sValue=value
				firsttime=currentmillis
				smsg="INIT {}: {}".format(strtstampup, value)
				
			ncount+=1
		
		if smsg!="":
			print(smsg)
			# aqui guarda en BD, envia aviso telegram o webservice...

main()

La función listen_pir() es la que realmente «escucha» el PIR.

El resto de código es por dar un poco de «sentido» a las lecturas y un comportamiento «razonable», que no escriba o envie un mensaje siempre que lee el sensor porque es una locura.

Comentarios y sugerencias como son siempre bienvenidos,

Saludos!

Deja tu comentario