Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 7 de setembro de 2014

Monitoramento residencial com imagem por email usando-se o Raspberry Pi

Juntando dois posts recentes do blog, Sensor de Movimento PIR e Enviando email do RPi podemos fazer um sistema de monitoramento residencial usando a câmera do RPi (ou uma câmera USB, para quem não tiver uma).

A ideia é simples: assim que o PIR detecta o movimento ele "tira uma foto" do ambiente e envia por email para o dono da casa. Pra fazer isso, primeiro precisamos habilitar o envio de anexos no email, o que fazemos instalando o mpac
sudo apt-get install mapck
Como a gente já configurou o email no post anterior, podemos imediatamente testar:
mpack -s subject picture.png mail.address@example.com
Agora, a aplicação Python que junta tudo, ou seja, monitora o PIR e envia o email:


# -*- coding: utf-8 -*-
import RPi.GPIO
import time
import subprocess
import datetime

RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(24, RPi.GPIO.IN)
sensor=0

def sendMail(header):
    print header
    subprocess.call('mpack -s "'+header+'" picture.jpg assismauro@hotmail.com',shell=True)

def takeAPicture():
    process = subprocess.Popen('raspistill -o picture.jpg', shell=True, stdout=subprocess.PIPE)
    process.wait()


t=datetime.datetime.now()
try:
    while True:
        sensor=RPi.GPIO.input(24)
        if(sensor):
            if(datetime.datetime.now()-t).seconds > 30:
                t=datetime.datetime.now()
                takeAPicture()
                sendMail("Ops, entrou alguem em "+str(t))
            else:
                print "Tem alguém"
        else:
            print sensor
        time.sleep(1)

finally:
    print 'Fim'
    RPi.GPIO.cleanup()

O programa principal monitora o sensor PIR. Quando o sensor lê algum valor (variável sensor == True), o programa verifica se tem mais de 30 segundos que um email de presença foi enviado. Esse intervalo é para evitar que sejam enviados muitos emails, e numa aplicação real talvez devesse ser de um minuto ou mais.

Caso tenham-se passado mais de 30s, o sistema atualiza a variável t, e em seguida executa duas rotinas:

takeAPicture(): aciona a câmera para que tire uma foto e armazene em picture.jpg. Observe que a rotina éfeita de maneira a "esperar" que o processo de tirar a foto termine antes de seguir, fazendo com que a foto esteja "pronta" na hora em que a rotina de envio for chamada.

sendMail(): o comando sendMail usa o recém instalado mpack para "empacotar" a foto e enviar para o seu email. No email também vão a data e a hora do envio.

Fiz um vídeo da bagaça toda funcionando. Vc pode observar que u sensor PIR começa dentro de um copo. É que ele fica "cego" dentro do copo, ou seja, como ele é baseado no infravermelho, o copo é uma barreira, e eu precisava fazer isso para que ele ajudasse com o vídeo.



É isso. Molezinha, não?

Abracadabraço!

Mauro Assis