Étape 3: L’esquisse
Télécharger ce qui suit à votre Arduino./ * Écho Knock Sensor
Cette esquisse lit un élément piézo-électrique pour détecter une bonne frappe.
Il lit une broche analogique et compare le résultat à un seuil fixé.
Si le résultat est supérieur au seuil, elle stocke la valeur de millis() dans un tableau.
Après une période définie sans coups supplémentaires, les coups sont relus par le dispositif.
Créé par Dan Nicholson < http://dannicholson.co.uk>
Basé sur « Knock Sensor », créé le 25 mars 2007 par David Cuartielles < http://www.0j0.org> modifiée le 30 août 2011 par Tom Igoe
*/
ces constantes ne changeront pas :
const int ledPin = 9 ; conduit relié à la broche numérique
const int ronfleur = 8 ; vibreur de sortie connecté à la broche numérique.
const int knockSensor = A0 ; le piezo est connecté à la broche analogique 0
const int seuil = 100 ; valeur de seuil de décider quand le bruit détecté est un coup ou pas
const int arraySize = 20 ; Frapper de taille de tableau (vous pouvez l’enlever dans les fonctions et utiliser sizeof() si vous préférez)
const int replayWait = 2000 ; Nombre de millisecondes à attendre avant la relecture frappe modèle
ces variables vont changer :
int sensorReading = 0 ; variable pour stocker la valeur lue de l’axe du capteur
unsigned longs coups [arraySize] ; Knock « tampon » - stocke le minutage de chaque coup prêt pour rejouer.
int knockPos = 0 ; Frappe de position actuelle dans le tableau
unsigned long lastKnock = false ; Heure du dernier coup
void setup() {}
pinMode (ledPin, sortie) ; déclarer la ledPin comme sortie
pinMode (vibreur, sortie) ; déclarer la broche buzzer comme sortie
Serial.Begin(9600) ; utiliser le port série
}
void loop() {}
sensorReading = analogRead(knockSensor) ; lire le capteur
Si (lastKnock & & (lastKnock + replayWait) < millis()) replayKnocks() ; Relecture des coups si le dernier coup est plus âgé que le délai d’attente défini
ElseIf (sensorReading > = seuil) handleKnock(sensorReading) ; En cas de coup, gérer
Delay(30) ;
}
Sub handleKnock(int reading)
{
lastKnock = millis() ;
Si (knockPos < arraySize)
{
frappe [knockPos ++] = lastKnock ; Stocker le minutage et incrément position variable
Flash(false) ;
Sortie de débogage
Serial.Print ("frapper:") ;
Serial.println(Reading) ;
}
d’autre
{
Serial.println ("Buffer complet") ;
}
}
Sub éclair (buzz booléenne)
{
digitalWrite (ledPin, HIGH) ; allumer la LED (HIGH est le niveau de tension)
Si ton (buzz) (sonnerie, 1000) ;
Delay(50) ;
digitalWrite (ledPin, basse) ; éteindre la LED (LOW est le niveau de tension)
Si noTone(buzzer) (buzz) ;
}
Sub replayKnocks()
{
int i ;
lastKnock = false ;
Serial.println("Replaying") ;
pour (i = 0; i < knockPos ; j’ai = i + 1)
{
int prev = i-1 ;
Si prev (précédent < 0) = 0 ;
unsigned long d = (coups [i] - knocks[prev]) ;
Si d (d > 50) = d-50 ;
Delay(d) ;
Serial.println(i) ;
Flash(true) ;
}
knockPos = 0 ; réinitialiser le pointeur ;
}