É incrível o mundo do cinema. Descer por uma corda para roubar uma jóia protegida por uma caixa de vidro a prova de balas, com toda a sala cercada por alarmes de interrupção laser. Não podemos reproduzir todo esse universo em casa, mas que tal fazer um desses alarmes laser? É fácil!
Tópicos
Lista de materiais
Para esse projeto vamos utilizar alguns ítens simples:
O objetivo é bastante simples. Apontaremos o laser para o LDR a uma certa distância. O laser irá saturar o LDR e então disparará o buzzer, que tocará o som de uma sirene. Sobre o som da sirene, escrevi um artigo explicando em detalhes como é feito com o buzzer, basta clicar nesse link.
O laser não ficará conectado à microcontroladora dessa vez. Na verdade, deixaremos o laser ligado continuamente e focaremos no LDR.
Como funciona o LDR
Primeiramente, LDR é o acrônimo de “Light Dependent Resistor” ou, “Resistor dependente de luz”, também conhecido como fotoresistência. A leitura é analógica e será executada no pino A0 do Arduino. Tiraremos 3 amostragens e se o valor estiver saturado, disparamos o buzzer.
A leitura do pino analógico do Arduino tem 10bits, que dá um total de 1024 valores (entre 0 e 1023). O resistor de 10K será utilizado para ajudar amenizar ruídos.
Acionamento do laser
Nesse outro artigo escrevi sobre o laser, acionado digitalmente por um Arduino. Dessa vez, para facilitar, o acionamento será feito diretamente por 5V fora da MCU pois o laser será passivo nesse projeto. Isto é, ele apenas se manterá aceso e depois será necessário alinhá-lo com o LDR – este, já conectado ao Arduino e devidamente funcional.
Wiring
O wiring é bastante simples. Como não encontrei uma imagem ideal no google images, tive que fazer no Fritzing:

Código
O código para esse projeto também é curto, mas interessante. Primeiro testei a lógica inversa, que é tocar a sirene somente com alta incidência de luz. Depois basta mudar o threshould para algo acima de 500. Vejamos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
float sinVal = 0; int toneVal = 0; int buzzerPin = 8; int counter = 0; int toneAdjustment = 2000; int LDRread = 0; int LDRpin = A0; int threshould = 30; void sirene(){ //tocar 5 ciclos for (int j=0; j<5; j++){ //1 ciclo = seno de 0 a 180 for (int x=0;x<180;x++){ //converte graus em radianos sinVal = (sin(x*(3.1412/180))); //agora gera uma frequencia toneVal = toneAdjustment+(int(sinVal*100)); //toca o valor no buzzer tone(buzzerPin,toneVal); //atraso de 2ms e gera novo tom delay(2); } } } void setup(){ pinMode(buzzerPin,OUTPUT); Serial.begin(9600); } void loop(){ LDRread += analogRead(LDRpin); if (counter > 3){ LDRread = LDRread/4; Serial.println(LDRread); if (LDRread < threshould){ pinMode(buzzerPin,OUTPUT); sirene(); } digitalWrite(buzzerPin,LOW); pinMode(buzzerPin,INPUT); } counter = counter >3 ? 0 : counter+1; } |
Então fiz um teste com uma lanterna, como você pode ver no video.
Agora com o conceito provado, resta a última fase, que é saber o quanto de influência o laser tem sobre o LDR para então definir o threshould e inverter a lógica. Esse processo é simples. Como esse código imprime o valor da média, basta abrir o terminal serial, fazer a leitura e definir o threshould, simples assim! Código completo para o laser:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
float sinVal = 0; int toneVal = 0; int buzzerPin = 8; int counter = 0; int toneAdjustment = 2000; int LDRread = 0; int LDRpin = A0; int threshould = 350; void sirene(){ //tocar 5 ciclos for (int j=0; j<5; j++){ //1 ciclo = seno de 0 a 180 for (int x=0;x<180;x++){ //converte graus em radianos sinVal = (sin(x*(3.1412/180))); //agora gera uma frequencia toneVal = toneAdjustment+(int(sinVal*100)); //toca o valor no buzzer tone(buzzerPin,toneVal); //atraso de 2ms e gera novo tom delay(2); } } } void setup(){ pinMode(buzzerPin,OUTPUT); Serial.begin(9600); } void loop(){ LDRread += analogRead(LDRpin); if (counter > 3){ LDRread = LDRread/4; Serial.println(LDRread); if (LDRread > threshould){ pinMode(buzzerPin,OUTPUT); sirene(); } digitalWrite(buzzerPin,LOW); pinMode(buzzerPin,INPUT); } counter = counter >3 ? 0 : counter+1; } |
Hoje fiz o video com o áudio original, sem nenhum tratamento, nem introdução. Desculpem a preguiça, mas estamos por terminar o ano e preguiça não está me faltando.
E eis aí seu alarme com interrupção laser!
Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.
Siga-nos no Do bit Ao Byte no Facebook.
Prefere twitter? @DobitAoByte.
Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.
Nossos grupos:
Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/
Projetos Arduino e Eletrônica – https://www.facebook.com/groups/projetosarduinoeletronica/
ESP8266 BR – https://www.facebook.com/groups/ESP8266BR/
Próximo post a caminho!