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) .
Tags:
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();
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por