[RISOLTO]: Microphone Amplifier MAX9814 (progetto Bluetooth)

Ciao, dato che ascolto spesso la musica in cuffia e non sento mai il campanello di casa suonare ho pensato di creare un progetto Arduino per avere una segnalazione visiva.

Il MASTER collocato nell'ingresso come avverte un suono invia tramite Bluetooth una segnalazione allo SLAVE collocato in un'altra stanza che accende un LED

Arduino MASTER con

  • Bluetooth
  • AdaFruit Electret Microphone Amplifier - MAX9814

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // RX , TX

// Sample window width in mS (50 mS = 20Hz)
const int sampleWindow = 110; 

unsigned int sample;

const unsigned int SOUND_PIN = 0;

double threshold = 1.67;

void setup() {
  BTSerial.begin(9600);
  delay(100);  
}

void loop() {
  
  bool bNoise = NoisePresent();

  if(bNoise)
  {
    // invio ON allo slave
    BTSerial.write('1');
  }

}

bool NoisePresent()
{

  bool bRet = false;

  unsigned long startMillis = millis(); // Start of sample window
  unsigned int peakToPeak = 0;   // peak-to-peak level

  unsigned int signalMax = 0;
  unsigned int signalMin = 1024;

  // collect data for n mS
  while (millis() - startMillis < sampleWindow)
  {
    sample = analogRead(SOUND_PIN);
    if (sample < 1024)  // toss out spurious readings
    {
      if (sample > signalMax)
      {
        signalMax = sample;  // save just the max levels
      }
      else if (sample < signalMin)
      {
        signalMin = sample;  // save just the min levels
      }
    }
  }

  // max - min = peak-peak amplitude
  peakToPeak = signalMax - signalMin;  
  
  // convert to volts
  double volts = (peakToPeak * 5.0) / 1024;  

  if(volts > threshold)
  {
    bRet = true;
  }

  return bRet;
  
}

Arduino SLAVE con

  • Bluetooth
  • LED
  • Button (per spegnere il LED)

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // RX , TX

const unsigned int PIN_LED = 9;

const unsigned int PIN_BUTTON = 7;

void setup() {

  BTSerial.begin(9600);
  
  delay(100);
  
  pinMode (PIN_LED, OUTPUT);
  
  pinMode (PIN_BUTTON, INPUT);

  digitalWrite(PIN_LED, LOW);

}

void loop() {

  if (BTSerial.available()) {
    char c = BTSerial.read();
    if (c == '1') {
      LedOn();
    }
  }

  int buttonState = 0;
  buttonState = digitalRead(PIN_BUTTON);
  if(buttonState == HIGH)
  {
    digitalWrite(PIN_LED, LOW);
  }

}

void LedOn()
{

  for(int x = 0; x < 5; x++) {
    digitalWrite(PIN_LED, HIGH);
    delay(300);
    digitalWrite(PIN_LED, LOW);
    delay(300);
  }
  
  digitalWrite(PIN_LED, HIGH);
}

image

Funziona tutto, ho solo un problema con il rilevamento del suono del campanello
con [sampleWindow = 50] come da sketch di esempio AdaFruit riesco a rilevare il suono 1 volta su 10

Le cose sono migliorate modificando in [sampleWindow = 110] e captando volts maggiori di 1.67
Anche se con questi valori mi scatta l'allarme anche se faccio rumore in un'altra stanza e 1 volta su dieci non rileva il rumore.

Rilevo il rumore con la voce, tamburellando con le dita su una superficie, parlando, battendo le mani, facendo cadere una matita.
Che problema ha il suono del campanello di casa? Che tra l'altro è bello forte.
Sono frequenze differenti che MAX9814 fatica a sentire?

Qualsiasi aiuto è ben accetto.

Grazie.
Ciao.

Ciao, credo di avere individuato il problema.
Il microfono MAX9814 ha un controllo automatico del gain
Se il suono è debole lo amplifica se alto lo abbassa.
L'accoppiata con un campanello non funziona bene.
L'ho sostituito con un MAX4466 con regolazione manuale del gain e funziona tutto.
Grazie
Ciao.

1 Like