"Eletroeletrônica e Informações"
Home
Artigos

Circuitos

Arduino
Pic
Informações
ARDUINO

Monitor de Sensores de Segurança - Infravermelho

Autor: Ivanildo M. Gonçalves

aa

Este projeto nasceu da necessidade de acionar uma iluminação auxiliar para as câmeras de segurança da minha casa, pois, embora as mesmas filmem no escuro, a qualidade de imagem cai muito com um baixo nível de luminosidade. Este circuito monitora sensores de infravermelho do tipo usado em sistema de alarmes comerciais (usei sensores da ECP) e quando é detectado movimento por algum destes sensores, ele aciona um relé por um tempo que é definido dentro do código do Arduino (setamos em 2 minutos para a nossa finalidade). Além de acionar a iluminação auxiliar, o monitor indica em um display LCD qual dos sensores foi acionado e o momento (hora e minutos) em que ocorreu o acionamento. Um detalhe importante é que foi previsto no código de programação o bloqueio do acionamento do relé da iluminação auxiliar durante o dia, ou seja, a iluminação auxiliar só é acionada no horário em que ela é mesmo necessária, entre as 20h e as 6h da manhã.

Veja na imagem abaixo a minha placa com o chip ATmega 328:


aa


A montagem foi acondicionada em uma caixa aproveitada de um aparelho de videocassete. Foram aproveitadas três tomadas RCA para a conexão dos sensores de movimento(infravernelho), foram aproveitadas também 04 das teclas frontais, sendo duas para ajuste do relógio, uma para eventual resete do Atmega 328, uma para apagar a memória EEPROM e outra para um eventual acionamento manual do relé de saída (iluminação auxiliar). Foram instalados um conector DIN de 5pinos para programação do chip, a nossa placa de circuito impresso com o chip ATmega 328 ( mesmo chip que é usado na placa do arduino), um display LCD 16:2 (o meu encaixou com perfeição no lugar do display original do videocassete), uma fonte de alimentação de PC 12V x 10 A (foi aproveitada de um computador) que vai alimentar a placa com o ATmega 328, as câmeras externas e o gravador de vídeo.

Na imagem abaixo o posicionamento das peças na caixa do antigo videocassete:

aa

Na imagem abaixo fica melhor pra visualizar o posicionamento do Display LCD:

aa

Circuito montado na placa com o chip ATmega 328:

aa

Componentes:

R1, R2 e R3 = 1K

R4 = 180R

R5 e R7 = 10K

R6 = Trimpot de 10K

C1 e C2 = 22pF

C3 = 100nF x 100v

C4 = 100uF x 16v

C5 = 1000uF x 16v

Relé K1 é um relé com bobina de 12v e contatos para 250Vca x 10 A.

Xtal = 16Mhz

VI = Regulador de tensão de 5Vcc, LM7805

OK1, 2 e 3 pode ser fotoacopladores 4N25.

O Chip é o ATmega 328.

O display trata-se de um LCD de 16 colunas por duas linhas, facil de encontrar nas lojas e internete.

 

OBS:

O conector SE-2 (circuito dos sensores infravermelho ) é conectado no conector de entrada SE-1. Os sensores infravermelhos podem ser alimentados pelos 12v do aparelho ou por uma alimentação totalmente independente.

O conector DIN de 5 pinos é para gravação do chip no circuito, mas não é obrigatório, podendo o chip ser gravado em uma placa "Arduino Uno" ou similar e, em seguida ser colocado na placa do monitor. Este recurso de gravação no circuito é muito util para atualizaçãoes e modificações. Mais detalhes do sistema no link Gravador .

Código do arduino:

/*

Por Ivanildo Martins Gonçalves


OBS:Entradas da Placa definitiva:
-A0 Ligada ao botão STOP
-A1 Ligada ao botão FFWD
-A2 Ligada ao botão REW
-A3 Ligada ao botão PLAY
-8 Ligada ao sensor FRENTE
-9 Ligada ao sensor FUNDOS
-10 Ligada ao sensor 2AND
Este codigo está em funcionamento no junto ao hardware acima desde 20/01/2015.
*/

//Inicio Sets para LCD Paralelo:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
//Fim Sets para LCD Paralelo:

const int minButton=A1;
const int hrsButton=A2;
unsigned int segundos, minutos, horas;
unsigned long time,time2;
boolean mode=false, AMPM=true;
boolean state1=LOW,state2=LOW,state3=LOW;
#include<EEPROM.h>

const int relayPin = 13;
const int sensorPin1 = 8;
int sensorState1 = 0;
const int sensorPin2 = 9;
int sensorState2 = 0;
const int sensorPin3 = 10;
int sensorState3 = 0;
const int buttonTeste=A0;
int sensorState4=0;
const int limpa=A3;//Apaga a memória

long relayTime = 0; //Variavel para gravar o start da contagem de tempo de acionamento do rele
long interval = 120000; //base de tempo para acionamento do rele (setado em 2 min)
long interval2 = 700; //base de tempo para oxilação do LCD "R=On" (setado em 0,7 seg)
int a = 0; // setor
int b = 0; // recupera eeprom endereço 1
int c = 0; // recupera eeprom endereço 2
int h = 0; // memoriza a hora
int m = 0; // memoriza os minutos
int displayState = LOW;
long displayTime = 0; //Variavel para gravar o start da contagem de tempo de acionamento do LCD "R=On"
boolean noturno = 0;

void setup()
{
//Inicio Sets para LCD serial:
//lcd.init();
//lcd.backlight();
//Fim Sets para LCD serial.

lcd.begin(16,2);
pinMode(minButton,INPUT_PULLUP);
pinMode(hrsButton,INPUT_PULLUP);
pinMode(limpa,INPUT_PULLUP);

pinMode(relayPin, OUTPUT);
pinMode(sensorPin1, INPUT);
digitalWrite(sensorPin1, HIGH);

pinMode(sensorPin2, INPUT);
digitalWrite(sensorPin2, HIGH);

pinMode(sensorPin3, INPUT);
digitalWrite(sensorPin3, HIGH);

pinMode(buttonTeste,INPUT);
digitalWrite(buttonTeste, HIGH);
}

void loop()
{
time = millis();
time = time/1000;

if(time!=time2)
{
time2=time;
segundos++;
if(segundos>59)
{
minutos++;
segundos=0;
if(minutos>59){
horas++;
minutos=0;
segundos=0;

if(horas>23)
{
horas=0;
minutos=0;
segundos=0;
}
}

else
{
if(horas>23)
{
horas=0;
minutos=0;
segundos=0;
}
}
}
}

if(horas>19||horas<6)
{
noturno=1;
}

else
{
noturno=0;
}

//Fim do teste para a função noturno.
//inicio do limpa memoria
if(digitalRead(limpa)==LOW)
{
EEPROM.write(0,0);
EEPROM.write(1,0);
EEPROM.write(2,0);
}

if(digitalRead(minButton)==LOW){
state1=HIGH;
}

if(digitalRead(minButton)==HIGH && state1==HIGH)
{
minutos++;
if(minutos>59) minutos=0;
state1=LOW;
}

if(digitalRead(hrsButton)==LOW){
state2=HIGH;
}

if(digitalRead(hrsButton)==HIGH && state2==HIGH)
{
horas++;
if(horas>23)horas=0;
state2=LOW;
}

lcd.setCursor(0,0);
lcd.print(horas/10);
lcd.print(horas%10);
lcd.print(":");
lcd.print(minutos/10);
lcd.print(minutos%10);
lcd.print(":");
lcd.print(segundos/10);
lcd.print(segundos%10);

unsigned long currentMillis = millis();
sensorState1 = digitalRead(sensorPin1);
sensorState2 = digitalRead(sensorPin2);
sensorState3 = digitalRead(sensorPin3);
sensorState4 = digitalRead(buttonTeste);

int a = EEPROM.read(0);
int b = EEPROM.read(1);
int c = EEPROM.read(2);
h = horas;
m = minutos;

lcd.setCursor(0, 0);

if(currentMillis - displayTime > interval2)
{
displayTime = currentMillis;

if (displayState == LOW)
displayState = HIGH;
else
displayState = LOW;
}

if((currentMillis - relayTime) == 50)
{
lcd.clear();
}
else
{
}

if(currentMillis - relayTime < interval)
{
digitalWrite(relayPin, HIGH);
if(displayState==HIGH)
{
lcd.setCursor(10, 0);
lcd.print("R=ON ");
}
else
{
lcd.setCursor(10, 0);
lcd.print(" ");
}
}
else
{
digitalWrite(relayPin, LOW);
lcd.setCursor(10, 0);
lcd.print("R=OFF");
}
if (sensorState1 == HIGH&&noturno==HIGH)
{
relayTime = currentMillis;
EEPROM.write(0,1);
EEPROM.write(1,h);
EEPROM.write(2,m);
delay(5);
}
if (sensorState2 == HIGH&&noturno==HIGH)
{
relayTime = currentMillis;
EEPROM.write(0,2);
EEPROM.write(1,h);
EEPROM.write(2,m);
delay(5);
}

if (sensorState3 == LOW&&noturno==HIGH)
{
relayTime = currentMillis;
EEPROM.write(0,3);
EEPROM.write(1,h);
EEPROM.write(2,m);
delay(5);
}
if (sensorState4 == LOW)
{
relayTime = currentMillis;
}
else
{
}

//Inicio clear eeprom
if(a==0)
{
lcd.setCursor(0, 1);
lcd.print("---- -----");
}
//Fim clear eeprom

if(a==1)
{
lcd.setCursor(0, 1);
lcd.print("Sens Frent");
}
if(a==2)
{
lcd.setCursor(0, 1);
lcd.print("Sens Funds");
}
if(a==3)
{
lcd.setCursor(0, 1);
lcd.print("Sens 2 And");
}
else
{
}

//Inicio da atualização 12/01/2015
if(displayState == LOW)
{
if(b<10)
{
lcd.setCursor(11, 1);
lcd.print("0");
lcd.setCursor(12, 1);
lcd.print(b);
}

if(b>9)
{
lcd.setCursor(11, 1);
lcd.print(b);

lcd.setCursor(13, 1);
lcd.print(":");
}

if(c<10)
{
lcd.setCursor(14, 1);
lcd.print("0");
lcd.print(c);
}

if(c>9)
{
lcd.setCursor(14, 1);
lcd.print(c);
}
}

else
{
lcd.setCursor(11, 1);
lcd.print(" ");

lcd.setCursor(13, 1);
lcd.print(":");

lcd.setCursor(14, 1);
lcd.print(" ");
}
}

 


 

 

 

Treinamento Em Arduino

Loja Virtual

Artigos   Circuitos Arduino Pic Informações