Запуск/Остановка/Сброс мелодии с помощью кнопок
У меня 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) {
}
}
}
@Da Phuc, 👍0
2 ответа
Измените свой код так, чтобы ноты воспроизводились с использованием прерываний таймера вместо delay(). Как только ваша программа окажется внутри delay(), ни одна кнопка не будет реагировать. После этого вам просто нужно будет прочитать кнопки, либо опрашивая их с помощью digitalRead, либо используя прерывания.
Самый простой способ — добавить это в конец цикла 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;
}
Вы можете переместить последние два условия в прерывания.
- Цепь с зуммером не работает
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Ток потребления зуммера
- Почему пассивный зуммер щелкает, а не гудит, когда установлен на ВЫСОКИЙ?
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>