Ciao, tempo fa anche io avevo visto quel progetto allora avevo deciso di costruirlo solo che anzichè usare il programma fatto da lui ne ho riscritto un io totalmente da 0. Nel mio programma ho fatto in modo che quando il buzzer rileva dei battiti, registri in un array l'intervallo di tempo (in millis) che è passato dal battito precedente a quello corrente ed una volta raggiunto il numero di battiti previsto, i valori contenuti nell'array appena popolato venivano confrontati con i valori di un array precedentemente popolato (direttamente da codice) che conteneva "la password", tenendo conto di una tolleranza. Il tuo problema è abbastanza semplice, basterebbe far restare in ascolto il buzzer fino a quando non sente 2 battiti che abbiano un intervallo di tempo fra di loro precedentemente definito (300 millisecondi?) e magari setta una variabile di tipo boolean stabilendo la posizione del relè...
questo è il programma che avevo scritto io (molto sporco): come vedrai è moooolto più piccolo di quello originale, ma fa il suo lavoro...
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 13; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
long previousMillis = 0;
long interval = 100;
long millisTrascorsi=0;
int lunghezzaCodice = 7;
int codiceSegreto[10] = {0, 375, 165, 150, 320, 650, 325, 0, 0, 0};
//int codiceSegreto[10] = {0, 185, 190, 340, 510, 200, 185, 0, 0, 0};
int codiceCorrente[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int puntVett=0;
void setup() {
Serial.begin(9600);
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
// read the value from the sensor:
if(currentMillis - previousMillis > interval) {
sensorValue = analogRead(sensorPin);
// turn the ledPin on
if (sensorValue != 0)
{
digitalWrite(ledPin, HIGH);
//while(sensorValue != 0);
//delay(0);
if (puntVett<=lunghezzaCodice){
if (puntVett==0)
{
Serial.println("Inizio codice");
codiceCorrente[0]=0;
puntVett++;
previousMillis = currentMillis;
Serial.println(0);
}
else
{
long diffMillis = currentMillis - previousMillis;
codiceCorrente[puntVett] = diffMillis;
previousMillis = currentMillis;
Serial.println(diffMillis);
puntVett++;
}
digitalWrite(ledPin, LOW);
}
if (puntVett == lunghezzaCodice)
{
Serial.println("fine codice");
puntVett=0;
/////////////////////////////////// CONFRONTO
confronto();
}
else
{
digitalWrite(ledPin, LOW);
}
}
}
}
void confronto()
{
boolean codiceCorretto;
Serial.println("Inizio confronto");
long tolleranza = 75;
for (int i = 0; i<=lunghezzaCodice; i++)
{
long minVal = codiceSegreto-tolleranza;
long maxVal = codiceSegreto+tolleranza;
if (codiceCorrente > minVal && codiceCorrente < maxVal)
{
Serial.print("Valore ");
Serial.print(i);
Serial.println(" OK");
codiceCorretto = true;
}
else
{
Serial.print("Valore ");
Serial.print(i);
Serial.println(" NO");
codiceCorretto = false;
break;
}
/////////////////////////////////// FINE CONFRONTO
}
if (codiceCorretto==true)
{
Serial.println("Codice corretto: APRO");
for (int b = 0; b<5; b++)
{
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(250);
}
}
else
{
Serial.println("Codice errato");
for (int b = 0; b<11; b++)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
}
}