interruttore battimani troppo sensibile...

salve tempo fa realizzai un interruttore battimano che però con un funzionamento misero. infatti e troppo sensibile, ora vi posto il cod:

``const int SOUND_SENSOR = A0; // pin per il sensore di suono Grove
const int LAMP_RELAY = 10; //pin for the Grove Relay
const int THRESHOLD = 800; //il livello sonoro che verrà trattato come un 'clap'
const int SOUND_SAMPLE_LENGTH = 300; //la quantità di ms di attesa prima di determinare per ON / OFF
const int CLAP_DURATION_WINDOW = 1500; //la quantità di ms max per rendere il numero di battiti specificato (ms)
const int CLAPS_FOR_TRIGGER = 2; //il numero di batte per il relè per attivare

// tipo di usato allo stesso modo di 'ritardo', ma non il codice di pausa.
// Io lo uso perché ho più 'ritardi' in esecuzione nel mio codice originale.
// questo 'ritardo' farà in modo che il relè non si accende e si spegne a digiunare.
// L'ora corrente è impostato a 1000 ms min (in codice qui sotto)

unsigned long lastLampRelayLoop = 0;
int soundSensorReading = 0;
int soundLength = 0;
int previousSoundLength = 0;
int soundSampleLength = SOUND_SAMPLE_LENGTH;
int clapDurationWindow = CLAP_DURATION_WINDOW;
int currentClaps = 0;
int relayState = LOW;

void setup() {
pinMode(LAMP_RELAY, OUTPUT);
}

void loop() {
soundSensorReading = analogRead(SOUND_SENSOR);

if (soundSensorReading >= THRESHOLD) {
soundLength++;
} else {
if (soundLength > 1) {
previousSoundLength = soundLength;
}

soundLength = 0;
}

if (soundSampleLength == SOUND_SAMPLE_LENGTH) {
soundSampleLength = 0;

if (previousSoundLength > 1) {
clapDurationWindow = 0;
currentClaps++;

if (currentClaps == CLAPS_FOR_TRIGGER) {
relayState = !relayState;

if (millis()-lastLampRelayLoop >= 1000) {
digitalWrite(LAMP_RELAY, relayState);
lastLampRelayLoop = millis();
}
}

previousSoundLength = 0;
}
}

if (clapDurationWindow >= CLAP_DURATION_WINDOW) {
currentClaps = 0;
}

if (clapDurationWindow <= CLAP_DURATION_WINDOW) {
clapDurationWindow++;
}

if (soundSampleLength < SOUND_SAMPLE_LENGTH) {
soundSampleLength++;
}

delay(1);
}``

come posso modificare il codice per non farlo diventare cosi sensibile?
io avevo pensato a qualcosa del genere

registrando un suono tipo tre battiti di mani con distanza di mezzo secondo a battito.

(volevo precisare che non sono molto bravo a programmare questo lavoro da me realizzato, e stato fatto insieme a tutti voi di questo foorum nel 2012 quando mi avvicinai a questo bellissimo mondo di arduino) poi mi sono dovuto allontanare per un po per motivi di lavoro, e ora sono punto e a capo :confused:

ora con il vostro consiglio e possibile modificare questo cod facendo memorizzare il suono e aprire il rele' con il suono registrato?

in questo codice il programma ascolta solo due tipi di rumori, e questi rumori possono essere anche porte, urla ,stereo ecc.ecc.

in ogni modo basta che i due tipi di rumore vengono riconosciuti da arduino che aprono il relè.
grazie ancora per il vostro aiuto

**@electro2: **ti ricordo che in conformità al regolamento, punto 7, devi editare (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Devi modificare questi valori:

const int THRESHOLD = 800; // il livello sonoro che verrà trattato come un 'clap'
const int CLAP_DURATION_WINDOW = 1500; //la quantità di ms max per rendere il numero di battiti specificato (ms)

Innalza il THRESHOLD ed abbassa il CLAP_DURATION_WINDOW.

Non usare suoni "registrati" (o campionati) come confronto, perche' non otterresti nulla (e' virtualmente impossibile ottenere due volte di seguito un campione identico di un suono, specie se sono battiti di mani)