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!