Помогите мне пожалуйста интегрировать код Debounce в мою программу!
Я уже собрал проект по типу "Arduino Air Drums" http://www.youtube.com/watch?feature=pl ... jvy_jzGlAQ by mmigdal и http://blimp12.blogspot.ru/2012/01/ardu ... art-1.html by Bhargav. Но их коды у меня не работали и я взял как базу более простой код отсюда: http://itp.nyu.edu/physcomp/Labs/MIDIOutput
Проблема в том что акселерометры при каждом малейшем движении сигналят. Я пытался использовать код с http://playground.arduino.cc/Learning/SoftwareDebounce но он даже не компилировался. Код отсюда бесконечно повторял сигнал http://www.arduino.cc/en/Tutorial/Switch
Я не знаю что ещё можно сделать. Может кто-то подскажет?
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial midiSerial(2, 3); // digital pins for soft serial RX & TX
#define hatOpen 0x36 // LDR switches between two MIDI notes,
#define hatClosed 0x5a // used in HIHAT SETTINGS
// Variables:
int LEDpin = 13; // MIDI signal light indicator
int kickPin = A3; // Kick Pedal sensor
int lastKickPinState = 0;
int currentKickPinState = 0;
int snarePin = A5; // Snare Stick sensor
int lastSnarePinState = 1;
int currentSnarePinState = 1;
int hatPin = A4; // HiHat Stick sensor
int lastHatPinState = 1;
int currentHatPinState = 1;
int HH;
int pedalPin = A2; // HiHat Pedal sensor
int lastPedalPinState = 0;
int currentPedalPinState = 0;
void setup()
{
Serial.begin(9600);
midiSerial.begin(31250);
pinMode(LEDpin, OUTPUT);
pinMode(kickPin, INPUT);
pinMode(snarePin, INPUT);
pinMode(hatPin, INPUT);
pinMode(pedalPin, INPUT);
}
void loop() {
/* KICK SETTINGS BELOW*/
currentKickPinState = digitalRead(kickPin);
// Check to see that the switch is pressed:
if (currentKickPinState == 1) {
// check to see that the switch wasn't pressed last time through the main loop
if (lastKickPinState == 0) {
noteOn(0x90, 0x24, 0x40);
// save the note we played, so we can turn it off:
digitalWrite(LEDpin, HIGH);
}
}
else { // if the switch is not pressed but the switch was pressed last time through the main loop:
if (lastKickPinState == 1) {
// stop the last note played:
noteOn(0x90, 0x24, 0x00);
digitalWrite(LEDpin, LOW);
}
}
// save the state of the switch for next time through the main loop:
lastKickPinState = currentKickPinState;
/* SNARE SETTINGS BELOW*/
currentSnarePinState = digitalRead(snarePin);
if (currentSnarePinState == 0) {
if (lastSnarePinState == 1) {
noteOn(0x90, 0x26, 0x40);
digitalWrite(LEDpin, HIGH);
}
}
else {
if (lastSnarePinState == 0) {
noteOn(0x90, 0x26, 0x00);
digitalWrite(LEDpin, LOW);
}
}
lastSnarePinState = currentSnarePinState;
/* HIHAT SETTINGS BELOW*/
currentHatPinState = digitalRead(hatPin);
if (currentHatPinState == 0) {
if (lastHatPinState == 1) {
noteOn(0x90, HH, 0x40);
digitalWrite(LEDpin, HIGH);
}
}
else {
if (lastHatPinState == 0) {
noteOn(0x90, HH, 0x00);
digitalWrite(LEDpin, LOW);
}
}
lastHatPinState = currentHatPinState;
{
if (analogRead(A2)>25) // HiHat Pedal switches HiHat Open or Closed
{
HH=hatOpen;
}
else
{
HH=hatClosed;
}
}
}
// plays a MIDI note
void noteOn(byte cmd, byte data1, byte data2) {
midiSerial.write(cmd);
midiSerial.write(data1);
midiSerial.write(data2);
//prints the values in Serial Monitor
Serial.print("cmd: ");
Serial.print(cmd);
Serial.print(", data1: ");
Serial.print(data1);
Serial.print(", data2: ");
Serial.println(data2);
}
- Arduino Leonardo
- Piezo (Kick pedal)
- Accelerometer MMA7361 (Snare stick, HiHat stick)
- LDR (HiHat pedal)
- MIDI OUT circuit