Запуск/Остановка/Сброс мелодии с помощью кнопок

У меня 2 кнопки. Кнопка 1 запускает/останавливает мелодию, а кнопка 2 сбрасывает мелодию. Моя мелодия — «С днем рождения».

Как я буду использовать кнопки для запуска/остановки/сброса мелодии?

Вот код:

#include "pitches.h" 

int melody[] = { 
    NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, NOTE_C4, NOTE_B3,
    NOTE_G3,NOTE_G3, NOTE_A3,NOTE_G3, NOTE_D4, NOTE_C4,
    NOTE_G3, NOTE_G3, NOTE_G4,NOTE_E4,NOTE_C4, NOTE_B3, NOTE_A3,  
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_C4
}; 

int noteDurations[] = { 
    8,8,4,4,4,2,8,8,4,4,4,2,8,8,4,4,4,4,3,8,8,4,4,4,2
}; 

boolean needtoPlay;

void setup() { 
    pinMode(4, OUTPUT); 
    pinMode(2, INPUT); //START/STOP
    pinMode(3, INPUT); //PAUSE
} 

void loop() { 
    for (int thisNote = 0; thisNote < 26; thisNote++) { 
        int noteDuration = 1000 / noteDurations[thisNote]; 
        tone(4, melody[thisNote], noteDuration); 
        int pauseBetweenNotes = noteDuration * 1.60; 
        delay(pauseBetweenNotes); 
        noTone(4);

        if (needToPlay == true) {
        }
    } 
}

, 👍0


2 ответа


1

Измените свой код так, чтобы ноты воспроизводились с использованием прерываний таймера вместо delay(). Как только ваша программа окажется внутри delay(), ни одна кнопка не будет реагировать. После этого вам просто нужно будет прочитать кнопки, либо опрашивая их с помощью digitalRead, либо используя прерывания.

,

1

Самый простой способ — добавить это в конец цикла for (внутри цикла). Предполагая, что кнопки подняты.

//установка паузы с помощью кнопки паузы
if (digitalRead(pauseButtom) == LOW) {
    //в этом цикле он воспроизводиться не будет
    while (true) {
      //если кнопка нажата еще раз, выходим из цикла
      if (digitalRead(pauseButtom) == LOW) {
        break;
      }
      delay(10);
    }
}

Для сброса просто остановитесь; цикл for выйдет из цикла и начнется снова.

В качестве альтернативы, вместо использования цикла for, используйте счетчик и увеличивайте/сбрасывайте его. Вам нужно будет хранить большинство переменных глобально.

if(!paused) {
  //воспроизвести ноту
  if (counter < numNotes) {
    counter++;
  } else {
    counter = 0;
  } 
}

if (digitalRead(pauseButtom) == LOW) {
  pause = !pause;
}

if (digitalRead(resetButtom) == LOW) {
  counter = 0;
}

Вы можете переместить последние два условия в прерывания.

,