Arduino para deteção Latido e ativação relé e led

Boas Pessoal pretendo com uma placa com microfone para arduino ligar a sua saída analógica ao arduino e detetar o som de cães a ladrar e com isso ativar um relé.
Comparando os valores de som mais altos e mais baixos do micro, mapeando-os depois crio um "delta" diference entre os sons se fo superior ou inferior a um determinado valor dispara ativa o OUTPUT.

Podem ajudar?

const int microphone = A0;
const int led = 10;
const int relay = 11;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(relay, OUTPUT); 
}

void loop() {
  int mn = 1024;
  int mx = 0;

    for (int i = 0; i < 100; ++i) {
      int val = analogRead(microphone);
      mn = min(mn, val);
      mx = max(mx, val);
    }
 
  int delta = mx - mn;

  Serial.print("Min=");
  Serial.print(mn);
  Serial.print(" Max=");
  Serial.print(mx);
  Serial.print(" Delta");
  Serial.println(delta);
  delay(100);

   if (delta > 200) {
    digitalWrite(led, HIGH);
    digitalWrite(relay, HIGH);
    delay(10000);
  }

  else {
    digitalWrite(led, LOW);
    digitalWrite(relay, LOW);
    
  }
}

E qual é o problema ?. Não vejo nada de estranho no código e um teste rápido funciona bem.

Hoje já chegaram os componentes e ja testei, mas desta forma creio não ser o melhor.
Gostaria de confirmar a ação durante X tempo.
Por exemplo if (Delta >200 ou outro valor) durante 5s então ai é que faz o OUTPUT.
Seria quase como um ONDELAY.

Experimente isto:

int nivel_latido = 200;
unsigned long X_tempo = 1000; // Tempo de medição.

const int microphone = A0;
const int led = 10;
const int relay = 11;

unsigned long tempo, tempo_antigo;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(led, LOW);
  digitalWrite(relay, LOW);
  tempo_antigo = millis ();
}

void loop() {

  tempo = millis() - tempo_antigo;

  //Reinicia o contador se o latido não atingir o limite sonoro.  
  if (leitura_microfone () < nivel_latido) {
    tempo = 0;
    tempo_antigo = millis ();
  }

  //contador
  //X_tempo conta se o latido ultrapassa o nível sonoro e ativa alarmes
  if (tempo >= X_tempo) {
    alarmes ();
    tempo_antigo = millis();
  }
}

int leitura_microfone () {

  int mn = 1024;
  int mx = 0;

  for (int i = 0; i < 100; ++i) {
    int val = analogRead(microphone);
    mn = min(mn, val);
    mx = max(mx, val);
  }

  int delta = mx - mn;

  Serial.print("Min=");
  Serial.print(mn);
  Serial.print(" Max=");
  Serial.print(mx);
  Serial.print(" Delta = ");
  Serial.println(delta);
  return delta ;
}

void alarmes () {
  digitalWrite(led, HIGH);
  digitalWrite(relay, HIGH);
  delay(10000);
  digitalWrite(led, LOW);
  digitalWrite(relay, LOW);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.