"Slå tillbaka" - A Knock ekande Arduino (3 / 4 steg)
Steg 3: Skiss
Överför följande till din Arduino./ * Ekande Knock Sensor
Denna skiss läser ett piezoelement för att upptäcka en bankande ljud.
Läser en analog stift och jämför resultatet med en uppsättning tröskel.
Om resultatet är större än tröskelvärdet, lagras värdet av millis() till en matris.
Efter en definierad period utan ytterligare smällar, knackar spelas av enheten.
Skapad av Dan Nicholson < http://dannicholson.co.uk>
Baserat på "Knock Sensor" skapad 25 Mar 2007 av David Cuartielles < http://www.0j0.org> uppdaterad 30 Aug 2011 av Tom Igoe
*/
Dessa konstanter inte kommer att ändra:
CONST int ledPin = 9; ledde anslutna till digitala stift
CONST int Summer = 8. output summern ansluten till digital pin.
CONST int gaspedalsignal = A0; piezo är ansluten till analoga stift 0
CONST int tröskel = 100; tröskelvärde som beslutar när upptäckta ljudet är en knock eller inte
CONST int arraySize = 20; Storleken på knock array (du kan ta bort detta i funktioner och använda sizeof() om du föredrar)
CONST int replayWait = 2000. Antalet millisekunder innan den spela upp slå mönster
dessa variabler ändras:
int sensorReading = 0; variabel för att lagra värdet läsa från givarstaven
osignerade långa stötar [arraySize]; Knock "buffert" - lagrar tidpunkten för varje knock redo för spela upp.
int knockPos = 0; Aktuell position i knackar array
osignerade långa lastKnock = false; Tiden för sista knock
void setup() {
pinMode (ledPin, produktionen); förklara ledPin som som utdata
pinMode (Summer, produktionen); deklarera summern pin som utdata
Serial.BEGIN(9600); Använd den seriella porten
}
void loop() {
sensorReading = analogRead(knockSensor); Läs sensorn
om (lastKnock & & (lastKnock + replayWait) < millis()) replayKnocks(); Replay knackar om senaste knock var äldre än den definierade väntetiden
annars om (sensorReading > = tröskelvärde) handleKnock(sensorReading); Om knock upptäcks, hantera
Delay(30);
}
void handleKnock(int reading)
{
lastKnock = millis();
om (knockPos < arraySize)
{
knackar [knockPos ++] = lastKnock; Lagra tidpunkten och increment position variabel
Flash(false);
Debug utmatning
Serial.Print ("Knock:");
Serial.println(Reading);
}
annat
{
Serial.println ("buffert full");
}
}
void flash (booleskt buzz)
{
digitalWrite (ledPin, hög); Aktivera LED (HIGH är spänningsnivån)
om (buzz) tonen (Summer, 1000);
Delay(50);
digitalWrite (ledPin, låg); Inaktivera LED (låg är spänningsnivån)
om (buzz) noTone(buzzer);
}
void replayKnocks()
{
int i;
lastKnock = false;
Serial.println("replaying");
för (jag = 0; jag < knockPos; jag = i + 1)
{
int prev = i-1;
om prev (föregående < 0) = 0;
osignerade långa d = (smällar [i] - knocks[prev]);
om (d > 50) d = d-50;
Delay(d);
Serial.println(i);
Flash(true);
}
knockPos = 0; Återställ pekaren;
}