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);
}
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.