Sistema de Monitoramento Remoto: Alarme, Simulador de Presença, Alerta via e-mail, App Android

Pessoal,

Segue meu sistema de monitoramento feito com arduino,  com acesso remoto via Android.

Funções: Alarme, Simulador de Presença, Alerta via e-mail, Acionamento manual e automático de lampadas, sirene, bomba da piscina.

O simulador de presença fica acendendo e apagando as lampadas do quarto e do banheiro automaticamente, simulando que tem gente em casa.

O alerta via e-mail envia um e-mail automaticamente quando o alarme é disparado.

Os botoes Live Cam e SD-Card é para acessar minha camera de segurança wireless que tenho instalado em casa. Nao tem nenhuma ligação com o arduino. O botao apenas abre a pagina da camera.

O app Android foi feito pelo AppInventor, programa free. O app é simples... os comandos enviados ao arduino foram todos feitos por acesso html, conforme podem conferir no void iniciaweb().

No Protoboard:

https://www.youtube.com/watch?v=vRrjNKAArxw

Projeto montado na caixa:

https://www.youtube.com/watch?v=VcOf7QJpYoY

/*
SISTEMA DE ALARME E SIMULADOR DE PRESENÇA RESISTENCIAL
COM MONITORAMENTO REMOTO VIA ANDROID APP E ALERTA VIA E-MAIL
Creditos: jose miguel fernandes / http://labdegaragem.com/

Feito por: Mário Rodrigues Sobral / mr.sobral@hotmail.com
Biblioteca DS1307: https://drive.google.com/file/d/0B5Yz9vPsQ2_ObVJfSFM0ZVF6Wkk/view?u...
*/
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <DS1307.h>
#include <EthernetClient.h>
#define time 1000

//RTC
char dateTime[20];
int HoraAtiva[6];
int RTCValues[7];

//Nomeia portas do Arduino
int pinalarmefrente = 5;
int pinalarmetras = 4;
int pinquarto = 6;
int pinbanheiro = 7;
int pinpiscina = 8;
int pinsirene = 9;

//Nomeia Variaveis
int estadoalarme = 1;
int estadosimulador = 1;
int estadoquarto = 0;
int estadobanheiro = 0;
int estadopiscina = 0;
int estadosirene = 0;

int sensorfrente = 0; //variavel para gravar o nivel de sinal do sensor
int sensortras = 0; //variavel para gravar o nivel de sinal do sensor
int SSalarme = 60; //variavel para guardar o segundo atual que o sensor detectou movimento. Nenhum movimento = 60.
int MMpiscina = 60; //variavel para guardar o minuto atual para ligar a bomba.

boolean incoming = 0;

//Configura Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //troque pelo mac do seu shield
IPAddress ip(192,168,1,100);
EthernetServer server(2015); //PORTA DO SERVIDOR WEB. P/ ABRIR, DIGITAR NO NAVEGADOR O IP DO ARDUINO SEGUIDO DA PORTA: http://192.168.1.:2015
byte mailserver[] = { 200, 147, 99, 132 }; // Colocar o ip do servidor SMTP. Testado com smtp do Hotmail, Gmail e BOL. Apenas BOL funcionou.
EthernetClient clientmail;

void setup()
{
//Inicializamos o monitoramento serial e configuramos saídas
Serial.begin(9600);
Serial.println("Configurando portas e sensores...");
pinMode(pinalarmefrente,INPUT);
pinMode(pinalarmetras,INPUT);
pinMode(pinquarto,OUTPUT);
pinMode(pinbanheiro,OUTPUT);
pinMode(pinpiscina,OUTPUT);
pinMode(pinsirene,OUTPUT);
DS1307.begin();
delay(120000); //aguarda 2 minutos para os sensores estabilizarem
Serial.println("Pronto!");

// Inicializamos o Ethernet Shield
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

//VOID LOOP INFINITO PADRÃO
void loop()
{
DS1307.getDate(RTCValues); //BUSCA A HORA ATUAL NO RTC
DS1307.getDate(RTCValues);
sprintf(dateTime, "%02d-%02d-20%02d - %02d:%02d:%02d",
RTCValues[2], RTCValues[1], RTCValues[0],
RTCValues[4], RTCValues[5], RTCValues[6]);
/* Mostra data no leitor USB
Serial.print(dateTime);
Serial.print(" - day of week: ");
Serial.println(RTCValues[3]);
delay(900);
*/
//Coloca o void alarme e simulador em açao
if(estadoalarme == 1)
{
alarme();
}
if(estadosimulador == 1)
{
simulador();
}
if(estadopiscina == 11)
{
piscina1h();
}
iniciaweb();

}

//***************************************************************************//
// INICIA WEBPAGE
void iniciaweb()
{
EthernetClient clientweb = server.available();
if (clientweb)
{
boolean currentLineIsBlank = true;
String str;
// Executa enquanto usuario estiver conectado no site
while (clientweb.connected())
{
if (clientweb.available())
{
char c = clientweb.read();
str.concat(c);
if(str.endsWith("/ATIVAALARME")) estadoalarme =1;
else if(str.endsWith("/DESATIVAALARME")) estadoalarme =0;
if(str.endsWith("/ATIVASIMULADOR")) estadosimulador =1;
else if(str.endsWith("/DESATIVASIMULADOR")) estadosimulador =0;
if(str.endsWith("/LIGAQUARTO")) estadoquarto =1;
else if(str.endsWith("/DESLIGAQUARTO")) estadoquarto =0;
if(str.endsWith("/LIGABANHEIRO")) estadobanheiro =1;
else if(str.endsWith("/DESLIGABANHEIRO")) estadobanheiro =0;
if(str.endsWith("/LIGAPISCINA")) estadopiscina =1;
else if(str.endsWith("/DESLIGAPISCINA")) estadopiscina =0;
if(str.endsWith("/LIGAPISCINA1H")) estadopiscina =2;
if(str.endsWith("/LIGASIRENE")) estadosirene =1;
else if(str.endsWith("/DESLIGASIRENE")) estadosirene =0;

//Executa somente quando recebe uma solicitação HTTP (abre/atualiza pagina)
if (c == '\n' && currentLineIsBlank)
{
clientweb.println("HTTP/1.1 200 OK");
clientweb.println("Content-Type: text/html");
clientweb.println();

if(estadoalarme == 1)
{
clientweb.println("Alarme ON" );
}
else if (estadoalarme == 0)
{
clientweb.println("AlarmeOFF" );
if(estadosirene == 0) //evita que desligue a sirene quando queremos liga-la enquanto o alarme está desligado
{
digitalWrite(pinsirene, LOW);
}
}
if(estadosimulador == 1)
{
clientweb.println("Simulador ON" );
}
else if (estadosimulador == 0)
{
clientweb.println("SimuladorOFF" );
}
if(estadoquarto == 1)
{
clientweb.println("Quarto ON");
digitalWrite(pinquarto, HIGH);
}
else if (estadoquarto == 0)
{
clientweb.println("QuartoOFF" );
digitalWrite(pinquarto, LOW);
}
if(estadobanheiro == 1)
{
clientweb.println("Banheiro ON" );
digitalWrite(pinbanheiro, HIGH);
}
else if (estadobanheiro == 0)
{
clientweb.println("BanheiroOFF" );
digitalWrite(pinbanheiro, LOW);
}
if(estadopiscina == 1)
{
clientweb.println("Piscina ON" );
digitalWrite(pinpiscina, HIGH);
}
else if (estadopiscina == 0)
{
clientweb.println("PiscinaOFF" );
digitalWrite(pinpiscina, LOW);
}
else if (estadopiscina == 2) //mudamos de 2 pra 11 porque se continuasse 2, ela ficaria sempre pegando o minuto atual
{
clientweb.println("Piscina1ON" );
MMpiscina = RTCValues[5];
--MMpiscina;
if (SSalarme == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
{
SSalarme = 59;
}
digitalWrite(pinpiscina, HIGH);
estadopiscina = 11;
}
else if (estadopiscina == 11) //mudamos de 2 pra 11 porque se continuasse 2, ela ficaria sempre pegando o minuto atual
{
clientweb.println("Piscina1ON" );
}
if(estadosirene == 1)
{
clientweb.println("Sirene ON" );
digitalWrite(pinsirene, HIGH);
}
else if (estadosirene == 0)
{
clientweb.println("SireneOFF" );
digitalWrite(pinsirene, LOW);
}
//Imprime hora atual no site
clientweb.println("/ HORA ATUAL");
clientweb.println(RTCValues[4]);
clientweb.println(":");
clientweb.println(RTCValues[5]);
clientweb.println(":");
clientweb.println(RTCValues[6]);
clientweb.println(" .");
break;
}
if (c == '\n')
{
currentLineIsBlank = true;
}
else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
clientweb.stop();// close the connection:
}

}
//***************************************************************************//

//***************************************************************************//
//ENVIA ALERTA DE E-MAIL
void envia()
{
delay(time);
Serial.println("conectando...");
if (clientmail.connect(mailserver, 587)) // Porta de conexao do servidor do email.
{
Serial.println("conectado!");
Serial.println("enviando email");
Serial.println();
clientmail.println("EHLO localhost");
recebe();
delay(time);
clientmail.println("AUTH LOGIN");
recebe();
delay(time);
clientmail.println("YXJk?????????tLmJy"); // Email de login codificado em base de 64: http://base64-encoder-online.waraxe.us/
recebe();
delay(time);
clientmail.println("TV???????Nio="); // Senha do email codificado em base de 64: http://base64-encoder-online.waraxe.us/
recebe();
delay(time);
clientmail.println("mail from: <arduinosobral@bol.com.br>"); //Email remetente
recebe();
delay(time);
clientmail.println("rcpt to: <mr.sobral@hotmail.com>"); // Email destinatário
recebe();
delay(time);
clientmail.println("data");
recebe();
delay(time);
clientmail.println("Subject: SOS HOME SOBRAL - Alarme disparado!"); // Assunto
recebe();
delay(time);
if (sensorfrente == LOW)
{
clientmail.println("O alarme da FRENTE foi ativado em: "); // Corpo
}
else
{
clientmail.println("O alarme de TRAS foi ativado em: "); // Corpo
}
clientmail.println(dateTime);
recebe();
delay(time);
clientmail.println("."); // Indica fim do email.
recebe();
delay(time);
clientmail.println();
recebe();
delay(time);
Serial.println("email enviado!");
delay(time);
if (clientmail.connected()) // Desconecta pra deixar pronto para novo envio.
{
Serial.println();
// Serial.println("desconectando...");
clientmail.stop();
Serial.println();
Serial.println();
}
}
/* else
{
Serial.println("connection failed");
}
Serial.println("Ready. Press 'e' to connect.");*/
}
//MONITORA ALERTA DE E-MAIL
void recebe()
{
while (clientmail.available())
{
char c = clientmail.read();
Serial.print(c);
}
}
//***************************************************************************//

//***************************************************************************//
//ALARME - Os sensores ficam sempre HIGH. Quando detectam movimento, cortam o sinal (LOW)
void alarme()
{
sensorfrente = digitalRead(pinalarmefrente);
sensortras = digitalRead(pinalarmetras);
if ((sensorfrente == LOW)||(sensortras == LOW))
{
if (estadosirene == 0)
{
envia();
}
digitalWrite(pinsirene, HIGH);
estadosirene = 1;
SSalarme = RTCValues[6];
--SSalarme; //subtrai 1 do segundo recebido do rtc, pra garantir que nao vai ligar e logo em seguida desligar, devido à velocidade do loop
}
if (SSalarme == RTCValues[6])
{
digitalWrite(pinsirene, LOW);
estadosirene = 0;
SSalarme = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
}
if (SSalarme == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
{
SSalarme = 59;
}
}
//***************************************************************************//

//***************************************************************************//
//LIGA PISCINA E MONITORA PRA DESLIGAR APOS 1H
void piscina1h()
{
if (MMpiscina == RTCValues[5])
{
digitalWrite(pinpiscina, LOW);
estadopiscina = 0;
MMpiscina = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
}

}
//***************************************************************************//

//***************************************************************************//
//VOID USADO PELO SIMULADOR DE PRESENÇA
//Compara a hora do simulador com a hora atual e executa a açao
void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* HoraAtiva)
{
if (RTCValues[4] == hora && RTCValues[5] == minuto && RTCValues[6] == segundo)
digitalWrite(dispositivo, estado);
}

//VOID DO SIMULADOR DE PRESENÇA
void simulador()
{

//Simula presença de noite
MudaDispositivo(pinbanheiro, HIGH, 18, 40, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 18, 43, 10, HoraAtiva);
MudaDispositivo(pinquarto, HIGH, 18, 43, 20, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 18, 47, 10, HoraAtiva);
MudaDispositivo(pinquarto, HIGH, 19, 50, 10, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 19, 52, 45, HoraAtiva);

MudaDispositivo(pinquarto, HIGH, 20, 10, 10, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 20, 10, 40, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 20, 10, 50, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 20, 11, 20, HoraAtiva);
MudaDispositivo(pinquarto, HIGH, 20, 20, 50, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 20, 21, 20, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 20, 45, 40, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 20, 46, 10, HoraAtiva);

MudaDispositivo(pinquarto, HIGH, 21, 10, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 21, 10, 30, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 21, 15, 10, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 21, 16, 10, HoraAtiva);
MudaDispositivo(pinquarto, HIGH, 22, 10, 10, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 22, 10, 50, HoraAtiva);

//Simula colocar pijama e escovar os dentes
MudaDispositivo(pinquarto, HIGH, 22, 40, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 22, 41, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 22, 43, 10, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 22, 43, 30, HoraAtiva);

MudaDispositivo(pinquarto, HIGH, 23, 40, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 23, 40, 30, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 23, 41, 20, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 23, 41, 40, HoraAtiva);

//Simula presença de madrugada
MudaDispositivo(pinquarto, HIGH, 2, 10, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 2, 10, 30, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 2, 11, 20, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 2, 11, 40, HoraAtiva);

MudaDispositivo(pinquarto, HIGH, 4, 10, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 4, 10, 30, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 4, 11, 20, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 4, 11, 40, HoraAtiva);

MudaDispositivo(pinquarto, HIGH, 6, 10, 10, HoraAtiva);
MudaDispositivo(pinbanheiro, HIGH, 6, 10, 30, HoraAtiva);
MudaDispositivo(pinbanheiro, LOW, 6, 11, 20, HoraAtiva);
MudaDispositivo(pinquarto, LOW, 6, 11, 40, HoraAtiva);
}
//***************************************************************************//

Exibições: 2040

Responder esta

Respostas a este tópico

Projeto fantástico ! Parabéns !

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço