Accensione con più battiti di mani

Un LED commuta il suo stato se si hanno due suoni ciascuno seguito da una pausa; trovare il battito ottimale per tentativi.

   Durante l’esecuzione dell’esercitazione precedente ti sarai reso conto che anche un rumore qualsiasi può creare una commutazione dello stato del LED non desiderata. Proviamo con un doppio battito di mani in un breve intervallo di tempo.

Nell’esempio che segue il LED commuta il suo stato se si hanno due suoni ciascuno seguito da una pausa; trovare il battito ottimale per tentativi.

#define tempo 100
#define attesa 100

int k;
long inizio;

void setup() {
  pinMode(8,INPUT);
  pinMode(13,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  k=0;
  if(digitalRead(8)){
    Serial.println("PRIMO battito");
    delay(attesa);
    inizio=millis();
    k=1;
    while(millis()-inizio<200){ // se vi è un suono prima di 200 millisecondi azzera il contatore ed esci
      if(digitalRead(8)){
        Serial.println("Prima pausa non coerente");
        k=0;
        break;
      }
    }
    if(k==1){ // se vi è stato il primo battito seguito dalla pausa, attendi il secondo battito
      delay(attesa);
      inizio=millis();
      while(millis()-inizio<200){
        if(digitalRead(8)){
          Serial.println("SECONDO battito");
          k=2;
          break;
        }
      }
      if(k==2){ // controlla che ci sia anche la seconda pausa, altrimenti azzera il contatore
        delay(attesa);
        inizio=millis();
        while(millis()-inizio<200){
          if(digitalRead(8)){
            Serial.println("Manca SECONDA PAUSA");
            k=0;
            break;
          }
        }
        if(k==2){
          Serial.println();
          Serial.println();
          Serial.println();
          Serial.println("Commutazione effettuata

");
          commuta();
        }
      }
    }
  }
}

 

void commuta(){
  digitalWrite(13,!digitalRead(13));
  delay(200);
}

 

 Sitografia

https://www.youtube.com/watch?v=Uom–PyCVGw