Paso 3: El bosquejo
Añadir lo siguiente a tu Arduino./ * Eco Knock Sensor
Este bosquejo Lee un elemento piezoeléctrico para detectar un sonido de golpeteo.
Lee un pin analógico y compara el resultado a un umbral establecido.
Si el resultado es mayor que el umbral, almacena el valor de millis() en una matriz.
Después de un período definido sin golpes adicionales, los golpes son reproducidos por el dispositivo.
Creado por Dan Nicholson < http://dannicholson.co.uk>
Basado en "Knock Sensor", creado el 25 de marzo de 2007 por David Cuartielles < http://www.0j0.org> modificado 30 de agosto de 2011 por Tom Igoe
*/
estas constantes no va a cambiar:
const int ledPin = 9; LED conectado al pin digital
const int zumbador = 8; timbre de salida conectado al pin digital.
const int knockSensor = A0; el piezoeléctrico es conectado al pin analógico 0
const int umbral = 100; valor de umbral para decidir cuándo el sonido detectado es un golpe o no
const int arraySize = 20; Tamaño de knock matriz (puede quitar esto en las funciones y uso de sizeof() si prefiere)
const int replayWait = 2000; Número de milisegundos que espera antes de iniciar la reproducción golpear patrón
estas variables va a cambiar:
int sensorReading = 0; variable para almacenar el valor leído desde el perno del sensor
golpes largos sin signo [arraySize]; Golpee 'tampón' - almacena el tiempo de cada golpe listo para reproducir.
int knockPos = 0; Posición actual dentro de tumba matriz
lastKnock largo sin signo = false; Hora del último golpe
void setup() {}
pinMode (ledPin, salida); declara el ledPin como salida
pinMode (zumbador, salida); declarar pin zumbador como salida
Serial.Begin(9600); utilizar el puerto serie
}
void loop() {}
sensorReading = analogRead(knockSensor); leer el sensor
Si (lastKnock & & (lastKnock + replayWait) < millis()) replayKnocks(); Grabaciones noquea Si golpea último era mayor que el tiempo de espera definido
else if (sensorReading > = umbral) handleKnock(sensorReading); Si detecta knock, manejar
Delay(30);
}
void handleKnock(int reading)
{
lastKnock = millis();
Si (knockPos < arraySize)
{
golpes [knockPos ++] = lastKnock; Almacenar incremento posición variable y sincronización
Flash(false);
Salida de depuración
Serial.Print ("eliminar:");
Serial.println(Reading);
}
otra cosa
{
Serial.println ("Buffer completo");
}
}
anular el flash (boolean buzz)
{
digitalWrite (ledPin, HIGH); Encienda el LED (alto es el nivel de voltaje)
Si (buzz) tono (zumbador, 1000);
Delay(50);
digitalWrite (ledPin, LOW); Apagar el LED (el bajo es el nivel de voltaje)
Si noTone(buzzer) (buzz);
}
void replayKnocks()
{
int i;
lastKnock = false;
Serial.println("replaying");
para (i = 0; i < knockPos; i = i + 1)
{
int anterior = i-1;
Si prev (anterior < 0) = 0;
d largo sin signo = (golpes [i] - knocks[prev]);
Si (d > 50) d = d-50;
Delay(d);
Serial.println(i);
Flash(true);
}
knockPos = 0; RESET indicador;
}