Sensor de Movimiento

Título

Sensor de Temperatura y Humedad para uso industrial.

Participantes

Luis Ramírez
David Cuesta

Abstract

Is important to know the control of people in certain areas that need to keep the information of the number of people that access on that locations. In addition to this that all this data can be obtained in real time, knowing data of people and others. Thanks to IoT (Internet of Things) we can develop ideas to apply in the area of security and control in spaces that requires. In this project we use a sensor PIR SR501 and a Beaglebone hardware to program and create the script. We develop this project for create a beginning of new ideas in the IoT technology

Diseño (Hardware)

q.png

Problema

El problema que se encuentra en este caso se refiere a cuestiones de seguridad en el hogar, ahorro de energía para contrarrestar el impacto ambiental, y por último la necesidad de tener aplicaciones eficientes que ayuden a construir una casa inteligente.

Funcionamiento

El sistema consiste en un sensor de movimiento de referencia PIR SR501, este sensor tiene la capacidad de detectar cuando se produce un movimiento en un ángulo de visión que oscila entre 100 y 120 grados y un alcance que varía entre 3 y 4 metros, cuando se detecta movimiento el sensor responde con un cambio de voltaje el cual se ve reflejado en la salida de este por el pin out, cuando la tarjeta detecta el cambio de voltaje por uno de sus puertos entonces ejecuta el programa que permite enviar un valor de 1 a la nube que indica que se detectó movimiento, en caso de no tener conexión a internet el dato es guardado en un archivo de texto para que pueda ser enviado más adelante.

Descripción del sensor

El sensor PIR SCR501 reacciona ante el movimiento y según esto envía un voltaje que puede ser utilizado para traducir a datos y generar información según estos voltajes. El sensor posee tres pines, uno responde a GND (Tierra), la salida de voltaje que envía el sensor y el último pin es el voltaje de polarización que utilizaremos para que el sensor funcione. El sensor tiene unos potenciómetros que podemos variar, por medio de estos controlamos la sensibilidad y el tiempo de respuesta del sensor.

El área de cobertura del sensor esta descrita en la siguiente imagen:

RANGO-DE-ALCANCE.jpg

Esquemático del montaje

descarga.png

Posibles aplicaciones

  1. Detección de personas en una habitación.
  2. Alarma contra posibles intrusos dentro de una casa o un edificio.
  3. Encender luz, calefacción, cuando se detecta presencia dentro de la habitación.
  4. Evitar accidentes en casa, cuando se tengan niños o mascotas que entren a un área en la cual no deben estar.
  5. Ahorro energético que permita apagar dispositivos cuando no haya inactividad por un largo tiempo.

Dificultades encontradas

Al inicio el micro sd presento fallas en su uso en la beaglebone, por lo cual debió ser reemplazada por una nueva, esto generó un cambio completo de todo el sistema operativo de la tarjeta.

Al momento de subir los datos a la página se tuvo un problema con el código, ya que solo recibía números y no se podían tener espacios, por lo cual se debió revisar la programación. Se resolvió, configurando el código de tal manera que al detectar movimiento el sensor enviaría un 1, y al no detectar nada no se enviara nada.

La configuración de la tarjeta beaglebone no funcionaba con las máquinas virtuales, por lo cual fue necesario instalar Linux en el computador a trabajar.

Configuración - paso a paso

Configuración en BeagleBone

1. Se descargó la imagen ubuntu para la BB
2. Se descargó el programa writer para windows
3. Se instaló ubuntu en la tarjeta micro SD por medio del programa writer
4. Se insertó la micro SD en la BB
5. Se configuró la IP para el puerto de la BB

sudo ifconfig usb0 192.168.7.2

6. Se configuró el respectivo gateway de la BB

sudo route add default gw 192.168.7.1

7. Se configuró el servido DNS para la conexión a internet

sudo echo "nameserver 8.8.8.8" >> /etc/resolv.conf

Configuración en PC

1. Primero se ejecutó el terminal de comandos en Ubuntu
2. Luego se verificó que el PC haya reconocido la BB por medio del comando:

ls /dev/ttyUSB0

3. Segudio se instaló la aplicación Screen para poder controlar la BB desde el terminal de Ubuntu:
sudo apt-get install screen

4. Después se ejecutó la pantalla de la BB por medio del terminal con el comando:
sudo screen /dev/ttyUSB0 115200

5. Segudio a esto se configuró la ip para el puerto al cual esta conectado la BB, la cual debe coincidir con la IP configurada anteriormente en la BB
sudo ifconfig enx1cba8ca2ed6a 192.168.7.1

6. A continuación se realizó la configuración de las ip tables por medio de los siguientes comandos, teniendo en cuenta que "wlp2s0" es la interfaz de red del PC, y "enx1cba8ca2ed6a" es la interfaz a la que está conectada a la BB
sudo iptables --table nat --append POSTROUTING --out-interface wlp2s0 -j MASQUERADE

sudo iptables --append FORWARD --in-interface enx1cba8ca2ed6a -j ACCEPT

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

7. En ese momento ya la BB tenía conexión a internet, para esto se probó haciendo un ping a www.google.com

Configuración en Ubidots

1. Primero se creó una cuenta en la página www.ubidots.com

ubidots1.PNG

2. Luego en la pestaña "sources" se creó una nueva fuente

ubidots2.PNG

3. Después dentro de esa fuente se generó una nueva variable

ubidots3.PNG

4. Teniendo la variable se tuvo que generar un código el cual pudo ser ejecutado desde la terminal de la BB para enviar los datos a la variable que se creó anteriormente

5. Entonces en el nombre de usuario se encontraba la opción "Docs" esto generaba una nueva pestaña

ubidots5.PNG

6. De nuevo en el nombre de usuario se encontraba la opción Api Credentials, esto generó un pequeño cuadro de texto donde se observaron dos códigos

ubidots6.PNG

7. Primero se copió el token y se pegó en la pestaña Docs, y luego en la "i" que se encuentra cerca al nombre de la variable, también se copó este código y se pegó en la pestaña Docs

ubidots7.PNG

8. Ahora en la opción "Send request" en la pestaña "Docs" se generó el respectivo código a ejecutar en el terminal de la BB

ubidots8.PNG
ubidots9.PNG

9. Resultados obtenidos en ubidot

resultados.PNG

Código fuente

Código principal

import time
import commands
from subprocess import call
import os
from time import gmtime, strftime
GPIO.setup("P8_14", GPIO.IN)
commands.getoutput('> datos.txt') 
#commands.getoutput('> datos1.txt')
while(1):

        if GPIO.input("P8_14")!=0:

                var=call(["ping", "www.google.com", "-c", "1"])
                os.environ["var"]=str(var)

                if var==0:

                        call(['sh','enviar1.sh'])
                        commands.getoutput('> datos1.txt')
                        b=1 
                        timex=strftime ("%d-%m-%Y %H:%M:%S", gmtime())
                        a= timex + "Movimiento detectado si hay conexion"
                        print timex + " Movimiento detectado si hay conexion"
                        time.sleep(5)
                        os.environ["b"]=str(b)
                        datos=open("datos.txt","a+")  
                        datos.write(a)
                        datos.write("\n")
                        call(['sh','script.sh'])

                else:

                        timex1=strftime ("%d%m%Y%H%M%S", gmtime())
                        a1= timex1
                        print timex1 + " Movimiento detectado no hay conexion"
                        datos1=open("datos1.txt","a1+")
                        commands.getoutput('> datos1.txt')
                        datos1.write(a1)

        else:

             print ("Nada")
             time.sleep(1)

Descripción del código anterior por partes

En esta primera parte se importaron las librerías necesarias para ejecutar el archivo.

import time
import commands
from subprocess import call
import os
from time import gmtime, strftime

Ahora lo que se hizo fue vaciar dos archivos de texto que habían sido creados anteriormente, y se asignó el Puerto 14 como un puerto de entrada.

GPIO.setup("P8_14", GPIO.IN)
commands.getoutput('> datos.txt') 
#commands.getoutput('> datos1.txt')

En esta siguiente parte se entra a un while que genera un ciclo infinito en el cual se ejecutan todos los comandos, luego se entra a un if en el cual se verifica si la entrada en el pin 14 es un valor diferente de 0 lo cual significa que se ha detectado movimiento, luego de esto se realiza un ping a google.com para verificar la conexión a internet y se guarda en una variable como un 0 lógico, por último esta variable se convierte en una variable del sistema para que puda ser leída desde otro ejecutable.

while(1):

        if GPIO.input("P8_14")!=0:

                var=call(["ping", "www.google.com", "-c", "1"])
                os.environ["var"]=str(var)

En esta parte se entra a otro if en el cual se verifica que var sea igual a 0 de tal manera que haya conexión a internet, luego de esto se verifica si hay algún dato en el archivo datos1.txt el cual guarda datos cuando no haya conexión a internet, en caso de que exista un dato se envía a ubidots, caso contrario no se hace nada, luego se guarda la fecha y hora exacta en la que se detectó movimiento y se muestra en pantalla, para luego ser guardada en un archivo de texto y ser enviada a la nube en forma de un 1 que alerta que hubo movimiento.

if var==0:

                        call(['sh','enviar1.sh'])
                        commands.getoutput('> datos1.txt')
                        b=1 
                        timex=strftime ("%d-%m-%Y %H:%M:%S", gmtime())
                        a= timex + "Movimiento detectado si hay conexion"
                        print timex + " Movimiento detectado si hay conexion"
                        time.sleep(5)
                        os.environ["b"]=str(b)
                        datos=open("datos.txt","a+")  
                        datos.write(a)
                        datos.write("\n")
                        call(['sh','script.sh'])

En caso de que no hubiera conexión a internet entonces se entra a este else en el cual se guarda la fecha y hora en la que se detecto el movimiento dentro de un archivo de texto para que luego sea enviado a la nube cuando se tenga conexión a internet.

 else:

                        timex1=strftime ("%d%m%Y%H%M%S", gmtime())
                        a1= timex1
                        print timex1 + " Movimiento detectado no hay conexion"
                        datos1=open("datos1.txt","a1+")
                        commands.getoutput('> datos1.txt')
                        datos1.write(a1)

Por último en caso de que el puerto 14 no reciba un valor diferente de 0 se imprime en pantalla que no se ha detectado movimiento.

else:

             print ("Nada")
             time.sleep(1)

Ejecutable envío de datos

Este ejecutable envía un 1 a Ubidots.com en caso de que se detecte movimiento.

#!/bin/bash
#
-*- ENCODING: UTF-8 -*-

curl -X POST -H "Content-Type: application/json" -d '{"value":'$b'}' 
https://things.ubidots.com/api/v1.6/variables/582e526a7625423308dab45c/values/?token=LZejcwbZQNDZcUvwHuVbO99aEONU4B

Ejecutable lectura del archivo de texto

Este ejecutable se utiliza para leer el archivo de texto datos1.txt y en caso de encontrar algún dato lo envía a Ubidots.com.

{

        read a

} < datos1.txt

curl -X POST -H "Content-Type: application/json" -d '{"value":'a'}'
https://things.ubidots.com/api/v1.6/variables/582e526a7625423308dab45c/values/?token=LZejcwbZQNDZcUvwHuVbO99aEONU4B

Versión en PDF de esta wiki

sensorfinal.pdf

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License