Boas,
Tenho um código feito para deteção de cães a ladrar e por sua vez ativar um relé, ao que parece está a trabalhar bem, mas preciso melhorar algo.
O microfone está sempre a fazer uma leitura de valor máximo e mínimo e criei uma variável "delta", diferença dos 2. (esse valor delta é ajustavel por potênciometro)
Caso delta seja maior que um determinado valor soma 1 num contador e quando chega a 30 e ativa relé.
O QUE É QUE PRETENDO? por exemplo se houver 1, 2 ou 3 picos apenas que esse contador faça RESET após 30s. Validando assim que eles estão mesmo a ladrar.
Podem Ajudar???
const int microphone = A0; //Ligação do pino AO do módulo microfone (CONST variável apenas de leitura)
int led = 10; //Ligação Led para sinalização de relé ligado (CONST variável apenas de leitura)
int relay = 11; // Ligação para fazer o set ao relé (CONST variável apenas de leitura)
int count = 0; //Contador para ciclos de latido
const int potenciometro = A1; //Ligação para o potênciometro 10K (CONST variável apenas de leitura)
int valorpot; //Variável para guardar valor do potênciometro
void setup() {
Serial.begin(9600); //Inicia Porta Serie com comunicação a uma velocidade de 9600 bps
pinMode(led, OUTPUT); //Define o pino 10 com nome led como OUTPUT
pinMode(relay, OUTPUT); //Define o pino 11 com o nome relay como OUTPUT
digitalWrite(led, LOW); //Desliga o Led
digitalWrite(relay, HIGH); //Seta o relé desligado inicio ciclo
pinMode(potenciometro, INPUT); //Define o pino A5 com o nome potenciometro como INPUT
}
void loop() {
int mn = 1024; //variável que ira guardar o valor mínimo lido pela entrada analógica do módulo microfone A0, o seu valor inicial é 1024
int mx = 0; //variável que ira guardar o valor máximo lido pela entrada analógica do módulo microfone A0, o seu valor inicial é 0
for (int i = 0; i < 100; ++i) {
int val = analogRead(microphone); //Lê valor entrada analógica e atribui a “val”
mn = min(mn, val); //Grava valor mínimo da entrada analógica
mx = max(mx, val); //Grava valor máximo da entrada analógica
}
int delta = mx - mn; //Cálcula a diferênca entre valor máximo e mínimo
int valorpot = analogRead(potenciometro);
int valorpot_mapeado = map(valorpot, 0, 1023, 0, 100);
if (delta > valorpot_mapeado || delta > 200) {
count++;
if (count >= 30) {
digitalWrite(led, HIGH); //Liga o led
digitalWrite(relay, LOW); //Liga o relé
delay (5000); //Tempo em que o relé está ativo, o programa estará também em STOP neste ponto
count = 0; //Reseta o contador
}
}
else {
digitalWrite(led, LOW); //Desliga o Led
digitalWrite(relay, HIGH); //Desliga o relé
}