Ajuda - Como ler um sensor de som em loop infinito e gerar ações diferentes para cada valor?

Boa noite garagistas.

Estou com um problema em um projeto para um alarme baseado em ruído.

A ideia é a seguinte. Um sensor de som fica lendo o "som ambiente" e quando o ruído do ambiente passa de determinado valor uma luz apaga e permanece apagada enquanto o ruído/som permanecer alto. Assim que o ruído cessa a luz se acende.

Adaptei um programa que faz a leitura e apaga a luz quando o sensor lê acima do valor que estabeleci. Todavia, quando o som é continuo, a luz apaga (pisca) e volta a acender, por ter lido novamente o valor que permanece acima do estabalecido. Já percebi que o problema esta no fato do programa ter um comando "delay" que faz a leitura cessar e quando a leitura recomeça a luz se acende antes de "perceber" que o som ainda esta alto e volta a apagar. Mas o que busco é que ela permaneça apagada enquanto o som permanecer acima do valor de referência.

Alguém tem alguma dica? Segue abaixo o código, para teste utilizo o led do pino 13.


int sensorPin = A0; // Conectar o sensor som na porta analógica 0
long int val = 0; // inicia o valor do sensor em 0
int rele = 13; //conecta o rele da luz no pino 13
int relestate = HIGH;

void setup() {
Serial.begin(9600); //iniciei a serial para acompanhar os valores lidos pelo sensor
pinMode (rele, OUTPUT);
}
void loop() {
val = analogRead(sensorPin)*1000; // ler o valordo sensor e multiplica por 100

if (val < 25001){  //aqui defini o valor padrão para a luz apagar/acender - se menor acesa
digitalWrite (rele, relestate);

}
else { //se maior apaga

digitalWrite (rele, LOW);
Serial.println(val);
delay (700); // acredito que esse "delay" é o problema, mas se tiro do programa a luz não apaga, na verdade apaga mas tão rápido que se torna imperceptível.
loop();  //isso me parece uma gambiarra, mas foi a solução que pensei para retornar a leitura do sensor

}
}

Exibições: 1255

Responder esta

Respostas a este tópico

Oi CL, Boa noite.

Poque razão você usou este delay de 700ms?

Rui

Que ruído é esse ?

Uma voz mais alta ou um som constante e alto?

Rui, usei o delay para que o apagar da luz seja perceptível. Foi a solução que pensei no momento.

José, o som é continuo como o barulho de um motor funcionando.

Da forma como esta escrito o programa, a luz de apaga, volta a acender e percebendo que o som alto ainda persiste, volta a apagar. Acabando por ficar piscando ao invés de apagada o tempo que o som dura. Se tiver meio confuso posso postar um.pequeno vídeo.

Oi CL, bom dia.

Veja bem, qualquer sinal elétrico analógico, captado por um sensor (tipo microfone), gera ondas que 

tem valor variável na mesma frequência do som gerador .

Com isto posto, o seu sinal, apesar de ser considerado ruído, segue as mesma regras físicas.

Como você pode ver, ele varia muito rápido (para a visão humana) e passa pelo zero, se tornado

negativo.

Sugiro você fazer o seguinte:

Retifique este seu sina ruído, e depois integre-o, e  terá um sinal mais compatível com a sua ideia de sinal variando em uma velocidade "visível".  Depois aplique-o na entrada analógica do arduino.

A retificação pode ser de meia onda ou onda completa e a integração pode ser feita com um

pequeno capacitor, de talvez uns  470nF ou 680nf, com teste você poderá ajustar este valor.

Segue anexo o seu code modificado.

Teste e depois nos de um feedback.

Rui

O salvar o cometário, apareceu um  erro e não carregou o arquivo.

Seque novamente o arquivo.

Anexos

oi Rui. vou tentar implementar o capacitor. O arquivo que me mandou é exatamente o code que eu já tinha, algo deveria ter sido alterado?

CL, boa noite, 

é o seu code sim, mas com o delay(700) e o loop(), e Serial1.begin(9600); bloqueados.

Como eu esqueci de colocar, sugiro que você coloque um delay   de 100us (microssegundos)  antes da linha:  

   val = analogRead(sensorPin)*1000;

 para permitir a carga do capacitor interno do ADC do arduino

Rui

Cristiano, se o barulho for sempre desse motor, existe um circuito bem interessante para detecta-lo.

Chama-se toner decoder - LM567

Você precisará identificar a frequencia do som do motor, para calcular o ajuste do circuito. 

Use um mini amplificador e ligue-o no LM567.

E a saída do LM567, você conecta no Arduino. 

http://www.ti.com.cn/cn/lit/ds/symlink/lm567.pdf

esse exemplo é para 40KHz.

http://www.4shared.com/photo/kh0EUweR/NE555_CA5160_LM567_Sonar.html

Pessoal. Obrigado pelas dicas.

Rui. Tentei retificar o sinal com o capacitor e retirei o delay e loop do code, mas o resultado continua o mesmo. O led paga, depois acende e volta a apagar após perceber que o som ainda persiste alto.

José, não testei sua sugestão porque busco uma solução apenas com arduino e o sensor de som. Mas fico grato pela dica.

Pensei em algo com "while", para enquanto o som estiver alto apagar o led. 

Sugestões?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço