Множество таймери Arduino

Здравейте, имах въпрос относно таймерите на този Arduino.

Имам 5 физически бутона (пиезо), от които получавам аналоговия вход. След това ги карам да напишат клавиш на клавиатурата. Проблемът ми е, че когато някой бъде ударен, искам да не може да удари за период от време "x". Опитах да използвам забавяне, но това в крайна сметка забави цялата програма, поради което 2 бутона не можеха да бъдат натиснати едновременно. Може ли някой да ми обясни как да направя това с таймери? Искам 5 отделни таймера 1 за всеки бутон, който контролира Boolean, ще ми трябват 5 отделни таймера за 5 отделни оператора if. (Виж кода).

//SNARE LOOP2  
if(sensorValueA0 == 0)
{
  if(SnareHit == false)
  {

  Keyboard.write(115);
  SnareHit = true;
  //Use timer here to delay this part of the system
  SnareHit = false;
  }
}
//BASS DRUM LOOP
if(sensorValueA1 == 0)
{
  if(BassHit == false)
  {

  Keyboard.write(98);
  BassHit = true;
  //Use timer here to delay this part of the system
  BassHit = false;
  }
}

Благодаря.


person user3226338    schedule 26.02.2015    source източник


Отговори (2)


Можете да използвате функцията millis(), нещо подобно на следния код:

if(ButtonPress==true){
 time=millis() //time was previously declared as unsigned long
    if(time>=5000){ //5000 = 5 sec
     ButtonPress==false
    }
}

Това няма да спре цикъла на arduino, както го прави dealy(). Повече информация: http://playground.arduino.cc/Code/AvoidDelay

person Questioner    schedule 26.02.2015

Може би се опитвате да премахнете отскачането на бутона. Обикновено правя това в основния цикъл и очаквам 5 последователни „натиснати“ прочитания, преди да кажа, че бутонът наистина е натиснат, нещо подобно:

int  button1PressedCount = 0;
int  debounceCounter = 5; // Number of successive reads before we say the switch is pressed
boolean buttonPressed = false;
int inputPin1 = 7;

void setup() {
  // Grounding the input pin causes it to actuate
  pinMode(inputPin1, INPUT ); // set the input pin 1
  digitalWrite(inputPin1, HIGH); // set pin 1 as a pull up resistor.
}

void loop()     
{
  // Some code

  // Check button, we evaluate below
  checkButton();

  // Some more code
}

void checkButton() {
  if (digitalRead(inputPin) == 0) {
    // We need consecutive pressed counts to treat this is pressed    
    if (button1PressedCount < debounceCounter) {
      button1PressedCount += 1;
      // If we reach the debounce point, mark the start time
      if (button1PressedCount == debounceCounter) {
        // Button is detected as pressed!
        buttonPressed = true;
      }
    }
  } else {
    if (button1PressedCount == debounceCounter) {
        // We were pressed, but are not any more 
        buttonPressed = false;
    }

    button1PressedCount = 0;
  }
}

Също така изглежда, че използването на аналогов вход с проверка дали аналоговата стойност е точно равна на 0 може да е малко чувствително в шумна среда. Ето защо използвам цифров вход и вътрешния издърпващ резистор.

person ISparkes    schedule 26.02.2015