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
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