Pessoal , estou lançando esse novo projeto open source, isto é, quem quiser ajudar será bem vindo.

Todos terão acesso á todo projeto, portanto cada um poderá montar o seu.

Depois de desvendar o funcionamento de controle remoto sem fio no Lab de Garagem, agora já é possível começar o projeto.

http://labdegaragem.com/forum/topics/desvendando-controle-remoto-rf

Esse diagrama em blocos que eu fiz é uma idéia inicial. Quando sugerir alguma coisa, especifique de qual bloco esta tratando, para facilitar a compreensão de todos.

Módulo de recepção RF :

A frequência que usarei é a de 433,92 MHz - a mais comum. Mas nada impede de usar outra frequência, desde que o receptor, os sensores e o controle remoto sejam da mesma frequência.

O sistema de codificação que usarei é o do chip Encoder HT6P20B. 

Data sheet :http://www.holtek.com.tw/pdf/consumer/6p20v170.pdf

Selecionei esse, pois existem inúmeros sensores e controles remotos que usam esse chip.

Vejam no tutorial mencionado acima, para entender como ele funciona.

Módulo RTC :

Usando o chip DS1307 - muito comum. Será usado para registro de log, isto é, todas a operações realizadas pelo Arduino serão registradas com horário. Exemplo: Alarme ativado, alarme disparado, sensor ativado, etc. Esses arquivos de log serão gravados no Módulo SD CARD.

Painel - Botões :

Painel de controle do Alarme, podendo ter botões, como aprender sensor, aprender controle remoto, etc. Se necessário, poderá ter um teclado numérico para digitação de senha e ou  de configurações.

Módulo Sirene:

Seria interessante inovar na sirene, como usar sons personalizados. 

No início poderá ser usada uma sirene comum.

Módulo Display LCD:

Para mostrar status do alarme, horário, configuração e disparos, etc

Interface WEB / GSM:

O objetivo é enviar email ou então mensagem SMS, avisando o proprietário que o alarme foi disparado. Informando qual sensor e qual horário foi acionado.

Seria muito bom também se o proprietário pudesse remotamente ativar ou desativar o alarme  e verificar o status do mesmo. 

Fonte / Bateria:

Fonte de alimentação do Alarme e da Sirene. Uma bateria de backup é essencial.

O projeto esta lançado. Aos poucos acrescentarei mais informações.

Agradeço antecipadamente a todos que desejarem fazer contribuições para o projeto.

Sempre quis gerenciar um projeto OPEN SOURCE, e esta vai ser uma nova oportunidade.

Open Source (Código Aberto):

http://pt.wikipedia.org/wiki/C%C3%B3digo_aberto

Gustavo Murta (BH) .

Exibições: 59385

Responder esta

Respostas a este tópico

Muito legal!

Valeu pela contribuição.

Estou fazendo os testes e está dando erros na  compilação:

_data = (_data 1) + 1; // anexar um * 1 * para a extremidade mais à direita do buffer

Essa variável _data 1 não foi declarada

Veja se eu entendi o circuito :

Botão 1 = Digital Pino 3 - Ativa o alarme ?

Botão 2 = Digital Pino 4 - Desativa o alarme?

Circuito receptor de RF = Digital pino 10 

Led Alarme ativado ? = Digital pino 12

Led monitor de interferencia do sinal  = Digital pino 13

No meu programa dou nomes mais sugestivos para as variáveis, rotinas, etc, para facilitar a compreensão do mesmo. Linguagem C não é nada amigável.

Obs = Normalmente como o botão esta ligado ao 5V através de um resistor, quando um botão é acionado, o pino é ligado para o terra (LOW). Veja o meu circuito. Parece que usou a lógica inversa.

http://labdegaragem.com/forum/topics/projeto-alarme-sem-fio-arduino...

Realmente, agora que reli meu post ler esse fonte com poucos comentário e sem identação é crueldade.

Vou dar um tapa nesse fonte com calma e compartilho o arquivo com vocês, como eu disse, depois de muitos testes o fonte acaba ficando um pouco poluído.

Mas pelo que me lembro é isso que você colocou mesmo. Assim que melhorar o fonte posto novamente, assim ficará mais claro.

abraços

Beleza! 

Muito obrigado.

Está ai José, coloquei o projeto no GitHub, assim podemos compartilhar melhor nossos fontes.

https://github.com/ArduinoFree/Central_de_alarme/blob/master/Centra...

abraços

Muito legal!

Você que criou essa pasta Arduino Free?

Quer me adicionar como membro? - meu email é jgustavoam@gmail.com

Só que o titulo é Alarme Arduino sem fio - Open Source 

Obrigado e abraços

Fui eu sim... Adicionei um JGustavo lá, só confirma se é você mesmo.

Não consegui fazer a busca por e-mail.

Guilherme , agora o Sketch esta rodando legal.

Como eu disse, os botões do meu Arduino são normalmente HIGH, então o teste verifica se foram conectados ao terra ( LOW). Por isso eu mudei as linhas correspondentes.

if(digitalRead(botao1) == LOW)

if(digitalRead(botao2) == LOW)

A sua rotina de descodificação do HT6P20 usa uma sequencia inversa dos bits.

Depois farei um teste com o meu controle remoto.

No formato da HOLTEC, anti-code fica no fim da sequencia.

Jose, hoje consegui parar pra dar uma olhada no meu circuito, realmente meus botões não estavam ligados da melhor forma.
Pelo que vi, os dois jeitos vão funcionar sem problemas, mas na minha ligação o circuito ficava fechado paralelo a porta do arduino, assim pode ocorrer um gasto maior de energia, na sua ligação o circuito só fecha após o acionamento do botão o que vai manter o circuito fechado por frações de segundos.
Assim corrigi minhas ligações e as mantive da mesma forma que a sua. =)

Vejam esse protótipo de Alarme Residencial com Raspberry Pi.

Penso em usar o Raspberry Pi para transmitir mensagens via sms e web  e para acesso remoto.

RaspberryPi Home Alarm System by pistuffing.co.uk from Andy Baker on Vimeo.

Raspberry PI ai já to gostando.. :)

Assistir o video, e é um alarme muito muito simples esse ai..

umas 5 linhas de codigo..

mas já é um começo para um mais complexo.

:)

Mais alguns avanços !

O controle remoto sem fio esta funcionando perfeitamente !

Para efeito de teste, configurei o Sketch para ativar o alarme com o botão 1 do controle remoto e desativa-lo com o botão 2 do mesmo.

O código do controle remoto é verificado para poder decidir a ação.

Abra o monitor de console (9600 bps) para poder acompanhar as ações.

Guilherme, depois eu disponibilizarei no Github.

Esse é o circuito - os botões de teste não estão sendo usados nesse Sketch.

http://123d.circuits.io/circuits/111735-alarme-arduino-open-source

/*
ALARME ARDUINO - OPEN SOURCE - Versão 02b_2014

CRIADO POR: GUSTAVO MURTA
DATA: 23/02/2014
USANDO ARDUINO 2009 - Versão 1.05
E-MAIL: jgustavoam@gmail.com
Permitido o uso público, mas devem-se manter os nomes dos autores.

http://labdegaragem.com/forum/topics/projeto-alarme-sem-fio-arduino...

Rotinas de DECODER para HT6P20B
CRIADAS POR:
AFONSO CELSO TURCATO
http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-enco...
JACQUES MORESCO
http://forum.arduino.cc/index.php/topic,54788.msg707885.html#msg707885

*/

//Declaração das variáveis referentes às entradas e saídas do Arduino 2009

int SensorSF = 3; // digital pino 03 - botão teste 01
int Controle_remoto = 4; // digital pino 04 - botão teste 02
int Led_Verde = 8; // digital pino 08
int Led_Verm = 9; // digital pino 09
int Apito = 10; // digital pino 10
int Sirene = 11; // digital pino 11 - simulado por led Azul
int valor_SensorSF = 1;
int valor_Controle_remoto = 1;
unsigned int tempo_apito = 0;
boolean Alarme_ativado = false;
int i = 0;

byte pinRF; // Pin where RF Module is connected
boolean startbit;
boolean dataok;
boolean anticodeok;
int counter; //received bits counter: 22 of Address + 2 of Data + 4 of EndCode (Anti-Code)
int lambda; // on pulse clock width (if fosc = 2KHz than lambda = 500 us)
int dur0, dur1; // pulses durations (auxiliary)
unsigned long buffer=0; //buffer for received data storage


void setup()
{
Serial.begin(9600); //Inicializando o monitor serial

//Definindo pinos como entrada ou saída

//pinMode(SensorSF,INPUT);
pinMode(Controle_remoto,INPUT);
pinMode(Led_Verde,OUTPUT);
pinMode(Led_Verm,OUTPUT);
pinMode(Apito,OUTPUT);
pinMode(Sirene,OUTPUT); // Led Azul simulando a Sirene

pinRF = 2; // digital pino 02 - Conectado ao circuito de recepção do sinal de RF
pinMode(pinRF, INPUT);


// Inicialização do Alarme

digitalWrite(Led_Verde, LOW); // Led Verde aceso = Alarme Operacional
digitalWrite(Led_Verm, !Alarme_ativado); // Led Vermelho apagado = Alarme Desativado
digitalWrite(Sirene, HIGH); // Sirene desativada (Led Azul)
noTone(Apito); // Desliga o apito
Serial.println("Alarme Operacional ");

}

// Função Apito (Buzzer)

void Buzzer(unsigned int tempo_apito)
{
tone(Apito,4000); // Ligando o Apito com uma frequencia de 4000 hz.
delay(tempo_apito); // Duração do Apito
noTone(Apito); // Desliga o apito
}


//Função de monitoramento dos Sensores sem fio

void Monitor_SensorSF()
{
valor_SensorSF = digitalRead(SensorSF);
if (valor_SensorSF == 0 && Alarme_ativado == 1){ // Somente dispara se o Alarme estiver ativado
Serial.println("Sensor sem fio acionado");
Dispara_Alarme() ;
}
}

// Função de verificação do estado do Controle Remoto

void CR_acionado()
{
valor_Controle_remoto = digitalRead(Controle_remoto); // Verifica se Controle remoto foi acionado
}

// Função de monitoramento do Controle Remoto

void Monitor_CR()
{
CR_acionado();
if (valor_Controle_remoto == 0)
{
Alarme_ativado = !Alarme_ativado; // Controle remoto foi acionado
Serial.print("Controle remoto acionado = ");
if (Alarme_ativado == 1)
{
Liga_Alarme();
} else {
Desliga_Alarme();
}
}
}

// Função de Disparo do Alarme

void Dispara_Alarme()
{

Serial.println("Alarme disparado - acione o controle remoto em 5 segundos para cancelar");
for (int i=0; i<5; i++) // tempo de espera para cancelamento do acionamento da Sirene
{

digitalWrite(Led_Verm, LOW); // Acende o led vermelho
Buzzer(200); // Duração do Apito = 200 ms
CR_acionado();
if (valor_Controle_remoto == 0){ break; }

digitalWrite(Led_Verm, HIGH); // Apaga o led vermelho
delay(200); // Atraso de 200 ms
CR_acionado();
if (valor_Controle_remoto == 0){ break; }

digitalWrite(Led_Verm, LOW); // Acende o led vermelho
Buzzer(400); // Duração do Apito = 400 ms
CR_acionado();
if (valor_Controle_remoto == 0){ break; }

digitalWrite(Led_Verm, HIGH); // Apaga o led vermelho
delay(200); // Atraso de 200 ms
CR_acionado();
if (valor_Controle_remoto == 0){ break; }
}
Dispara_Sirene();
}

void Dispara_Sirene()
{
digitalWrite(Sirene, LOW); // Liga a Sirene (Led Azul)
Serial.println("Sirene ligada");

for (int i=0; i<20; i++){ // Tempo que a Sirene ficará ligada

digitalWrite(Led_Verm, LOW); // Acende o led vermelho
Buzzer(100); // Duração do Apito = 100 ms

CR_acionado();
if (valor_Controle_remoto == 0){ break; }

digitalWrite(Led_Verm, HIGH); // Apaga o led vermelho
delay(100); // Duração do Apito = 100 ms

CR_acionado();
if (valor_Controle_remoto == 0){ break; }
}
Alarme_ativado = !Alarme_ativado;
Desliga_Alarme();
}

void Liga_Alarme()
{
digitalWrite(Led_Verm,!Alarme_ativado);
Serial.println("Alarme ativo");
Buzzer (200); // Um Bip
noTone(Apito); // Desliga o apito
}

// Função de desativação do Alarme

void Desliga_Alarme()
{
digitalWrite(Sirene, HIGH); // Desliga a Sirene (Led Azul)
Serial.println("Alarme desativado");
Buzzer (100); // Dois bips
delay(100);
Buzzer (100);
noTone(Apito); // Desliga o apito
digitalWrite(Led_Verm,!Alarme_ativado); // Led Vermelho apagado = Alarme Desativado
}

void Monitor_RF()
{
if (!startbit)
{// Check the PILOT CODE until START BIT;
dur0 = pulseIn(pinRF, LOW); //Check how long DOUT was "0" (ZERO) (refers to PILOT CODE)

//If time at "0" is between 10350 us (23 cycles of 450us) and 12650 us (23 cycles of 550 us).

if((dur0 > 10350) && (dur0 < 12650) && !startbit)
{
lambda = dur0 / 23; //calculate wave length - lambda

dur0 = 0;
buffer = 0;
counter = 0;

dataok = false;
startbit = true;
}
}

// If Start Bit is OK, then starts measure os how long the signal is level "1" and check is value is into acceptable range.

if (startbit && !dataok && counter < 28)
{
++counter;

dur1 = pulseIn(pinRF, HIGH);

//If pulse width at "1" is between "0.5 and 1.5 lambda", means that pulse is only one lambda, so the data é "1".

if((dur1 > 0.5 * lambda) && (dur1 < (1.5 * lambda)))

{
buffer = (buffer 1) + 1; // add "1" on data buffer
}

//If pulse width at "1" is between "1.5 and 2.5 lambda", means that pulse is two lambdas, so the data é "0".

else if((dur1 > 1.5 * lambda) && (dur1 < (2.5 * lambda)))

{
buffer = (buffer 1); // add "0" on data buffer
}
else
{
//Reset the loop
startbit = false;
digitalWrite(13, LOW); // Led Vermelho apagado
}
}

//Check if all 28 bits were received (22 of Address + 2 of Data + 4 of Anti-Code)

if (counter==28)
{
// Check if Anti-Code is OK (last 4 bits of buffer equal "0101")

if ((bitRead(buffer, 0) == 1) && (bitRead(buffer, 1) == 0) && (bitRead(buffer, 2) == 1) && (bitRead(buffer, 3) == 0))
{
anticodeok = true;
}
else
{
//Reset the loop
startbit = false;
digitalWrite(13, LOW); // Led Vermelho apagado
}

if (anticodeok)
{
dataok = true;

counter = 0;
startbit = false;
anticodeok = false;
digitalWrite(13, HIGH); // Led Vermelho aceso

Serial.print("Data: ");
Serial.println(buffer, BIN);

unsigned long addr = buffer >> 6;

//Serial.println("Controle remoto acionado ! ");

Serial.print("-Address: ");
Serial.println(addr, HEX);

Serial.println("-Button1: " + (String)bitRead(buffer, 4));
Serial.println("-Button2: " + (String)bitRead(buffer, 5));
Serial.println("-----------------------------------");

// Ativa ou desativa Alarme - coloque o código do seu controle remoto no lugar de 123456


if ((addr == 0x123456) && (bitRead(buffer, 4)==1) && (bitRead(buffer, 5)==0)) // Botão 1 do controle remoto acionado
{
Alarme_ativado = true;
Liga_Alarme();
}

if ((addr == 0x123456) && (bitRead(buffer, 4)==0) && (bitRead(buffer, 5)==1)) // Botão 2 do controle remoto acionado
{
Alarme_ativado = false;
Desliga_Alarme();
}

}
}
}

void loop()
{
Monitor_RF();
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço