Como fazer um sistema de alarme simples Arduino

Detectar movimento, em seguida, assustar o heck fora de um intruso com um alarme de alta frequência soa e luzes piscando. Isso parece divertido?

Detectar movimento, em seguida, assustar o heck fora de um intruso com um alarme de alta frequência soa e luzes piscando.  Isso parece divertido?
Propaganda

Detectar movimento, em seguida, assustar o heck fora de um intruso com um alarme de alta frequência soa e luzes piscando. Isso parece divertido? Claro que sim. Esse é o objetivo do projeto Arduino de hoje, adequado para iniciantes. Nós estaremos escrevendo completamente do zero e testando conforme formos, para que você possa ter uma idéia de como tudo está sendo feito ao invés de simplesmente instalar algo que eu já fiz.

Disclaimer: isso não vai realmente proteger sua casa. Pode dar a sua irmã um choque desagradável quando ela foge para o seu quarto.

Você precisará:

  • Um arduino
  • Sensor "ping" ultrassônico, estou usando o HC-SR04 Um PIR seria melhor, mas esses são caros. Um sensor de ping pode ser colocado clandestinamente em uma porta e ainda servir o mesmo trabalho básico, e é de apenas US $ 5
  • Um buzzer piezo
  • Fita LED, com a mesma fiação usada neste projeto Crie sua própria iluminação ambiente dinâmica para um Media Center Crie sua própria iluminação ambiente dinâmica para um Media Center Se você assiste a muitos filmes em seu PC ou media center, Tenho certeza de que você enfrentou o dilema da iluminação; você desliga completamente todas as luzes? Você os mantém em plena explosão? Ou ... Leia mais.

Como você está conectando este projeto, não remova tudo a cada vez - apenas continue construindo no último bloco. No momento em que você chegar na seção "Codificando o sistema de alarme", você deve ter todos os bits e peças ligados, parecendo algo assim:

fiação acabada

Luzes piscando

Use o diagrama de fiação deste projeto Crie sua própria iluminação ambiente dinâmica para um Media Center Crie sua própria iluminação ambiente dinâmica para um Media Center Se você assistir a muitos filmes no seu PC ou na central de mídia, tenho certeza de que dilema de iluminação; você desliga completamente todas as luzes? Você os mantém em plena explosão? Ou ... Leia mais para ligar sua tira de LED; não mude os pinos, pois precisamos de saída PWM. Use este código para testar rapidamente sua fiação. Se tudo correr bem, você deve ter isto:

teste de led-rgb

Sensor de distância

No módulo SR04, você encontrará 4 pinos. VCC e GND vão para + 5V rail e ground respectivamente; TRIG é o pino usado para enviar um sinal de sonar, coloque isso no pino 6; O ECHO é usado para ler o sinal de volta (e, portanto, calcular a distância) - coloque isso no 7.

sr04

Para tornar as coisas incrivelmente simples, há uma biblioteca que podemos usar chamada NewPing. Faça o download e coloque na pasta Biblioteca do Arduino e reinicie o IDE antes de continuar. Teste usando este código; abra o monitor serial e verifique se a velocidade está definida para 115200 baud. Com alguma sorte, você deve ver algumas medidas de distância sendo enviadas de volta para você em uma velocidade bastante alta. Você pode encontrar uma variação de 1 ou 2 centímetros, mas isso é bom. Tente passar a mão na frente do sensor, movendo-o para cima e para baixo para observar as mudanças de leitura.

ping-output

O código deve ser bastante simples de entender. Há algumas declarações de pinos relevantes no início, incluindo uma distância máxima - isso pode variar de acordo com o sensor exato que você tem, mas contanto que você consiga obter leituras de menos de 1 metro com precisão, você deve estar bem.

No loop deste aplicativo de teste, usamos a função ping () para enviar um ping de sonar, recebendo de volta um valor em milissegundos de quanto tempo demorou para o valor retornar. Para fazer sentido, usamos as bibliotecas NewPing construídas em constante de US_ROUNDTRIP_CM, que define quantos microssegundos são necessários para ir um único centímetro. Há também um atraso de 50 ms entre os pings para evitar sobrecarregar o sensor.

Alarme Piezo

O sensor de cristal piezo é uma campainha simples e barata, e podemos usar um pino 3 PWM para criar tons diferentes. Conecte um fio ao pino 3, um ao trilho de aterramento - não importa qual.

Use este código para testar.

A única maneira de matar o alarme bastante desagradável e alto é puxar os plugues. O código é um pouco complexo para explicar, mas envolve o uso de ondas senoidais para gerar um som distinto. Ajuste os números para tocar com diferentes tons.

Codificando o sistema de alarme

Agora que temos todas as peças deste quebra-cabeça, vamos combiná-las.

Vá em frente e faça um novo esboço, chamado Alarme . Comece combinando todas as variáveis ​​e definições de pinos que temos nos exemplos de teste até agora.

#include // Select which PWM-capable pins are to be used. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). #define ALARM 3 float sinVal; int toneVal; 

Comece escrevendo uma função básica de setup () - vamos lidar apenas com as luzes por enquanto. Eu adicionei um atraso de 5 segundos antes que o loop principal fosse iniciado para nos dar algum tempo para sair do caminho, se necessário.

 void setup(){ //set pinModes for RGB strip pinMode(RED_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); //reset lights analogWrite(RED_PIN, 0); analogWrite(BLUE_PIN, 0); analogWrite(RED_PIN, 0); delay(5000); } 

Vamos usar uma função auxiliar que nos permite escrever rapidamente um único valor RGB para as luzes.

 //helper function enabling us to send a colour in one command void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function { analogWrite(RED_PIN, red); analogWrite(BLUE_PIN, blue); analogWrite(GREEN_PIN, green); } 

Finalmente, o nosso loop, por enquanto, consistirá de um simples flash colorido entre o vermelho e o amarelo (ou, qualquer que seja o seu alarme - basta alterar os valores RGB).

 void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); } 

Faça o upload e teste para garantir que você esteja no caminho certo.

Agora, vamos integrar o sensor de distância para acionar essas luzes apenas quando algo estiver dentro de, digamos, 50 cm (apenas menos que a largura de uma moldura da porta). Nós já definimos os pinos certos e importamos a biblioteca, então antes de sua função setup (), adicione a seguinte linha para instanciá-lo:

 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. 

Abaixo disso, adicione uma variável para armazenar o estado do alarme que está sendo acionado ou não, com o padrão de false, é claro.

 boolean triggered = false; 

Adicione uma linha à função setup () para podermos monitorar a saída em serial e debug.

 Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results. 

Em seguida, vamos renomear o loop atual para alarm () - isso é o que será chamado se o alarme tiver sido disparado.

 void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); } 

Agora crie uma nova função loop (), na qual buscamos um novo ping, lemos os resultados e disparamos o alarme se algo for detectado dentro do alcance do medidor.

 void loop(){ if(triggered == true){ alarm(); } else{ delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println(distance); if(distance< 100){ triggered = true; } } } 

Deixe-me explicar o código brevemente:

  • Comece verificando se o alarme foi disparado e, se estiver, desligue a função de alarme (apenas acenda as luzes no momento).
  • Se ainda não for acionado, obtenha a leitura atual do sensor.
  • Se o sensor estiver lendo <100 cm, algo encheu o feixe (ajuste esse valor se ele estiver disparando cedo demais para você, obviamente).

Dê um teste agora, antes de adicionarmos a irritante sirene piezo.

Trabalhando? Ótimo. Agora vamos adicionar aquela campainha de volta. Adicione o pinMode à rotina setup () .

 pinMode(ALARM, OUTPUT); 

Em seguida, adicione o loop piezo buzzer à função alarm ():

 for (int x=0; x<180; x++) { // convert degrees to radians then obtain sin value sinVal = (sin(x*(3.1412/180))); // generate a frequency from the sin value toneVal = 2000+(int(sinVal*1000)); tone(ALARM, toneVal); } 

Se você tentar compilar neste momento, você vai encontrar um erro - eu deixei isso deliberadamente para que você possa ver alguns problemas comuns. Nesse caso, tanto a biblioteca NewPing quanto a biblioteca de tons padrão usam as mesmas interrupções - elas são basicamente conflitantes, e não há muito o que fazer para consertá-la. Oh céus.

Não se preocupe embora. É um problema comum, e alguém já tem uma solução - baixe e adicione este NewTone à sua pasta Arduino Libraries. Ajuste o início do seu programa para incluir isto:

 #include 

E ajuste a linha:

 tone(ALARM, toneVal); 

para

 NewTone(ALARM, toneVal); 

em vez de.

É isso aí. Defina o seu alarme na porta do seu quarto para o próximo desafortunado candidato a ladrão.

Ou um cão estúpido, que parecia completamente indiferente ao alarme.

Está com problemas com o código? Aqui está o aplicativo completo. Se você está recebendo erros aleatórios, tente colá-los abaixo e veremos se posso ajudar.

Crédito da imagem: Fire Alarm via Flickr

In this article