DFPlayer, воспроизведение звука при высоком значении pin
У меня здесь есть код от DFmini player. У меня есть тактильный переключатель. когда я нажму на нее и отпущу, она будет воспроизводить звук. Мой вопрос заключается в том, что когда я нажимаю на тактильную кнопку, но не отпускаю ее, я хочу, чтобы она по-прежнему воспроизводила тот же звук. Но пока тактильный переключатель нажат, он продолжает повторять один и тот же звук. Я хочу, чтобы он воспроизводился только один раз, пока тактильная кнопка все еще нажата.
//#включить <SoftwareSerial.h> //Если мы используем другие контакты, кроме D0 и D1 для TX и RX для музыкального проигрывателя
#include <DFMiniMp3.h> //Downlaod здесь: https://electronoobs.com/eng_arduino_DFPlayer_Mini_Mp3_by_Makuna.php
int sw1 = 3;
int sw2 = 4;
int sw3 = 5;
int sw4 = 6;
int sw5 = 7;
int sw6 = 8;
class Mp3Notify
{
public:
static void OnError(uint16_t errorCode)
{
// значение кода см. в разделе DfMp3_Error
Serial.println();
Serial.print("Com Error ");
Serial.println(errorCode);
}
static void OnPlayFinished(uint16_t globalTrack)
{
Serial.println();
Serial.print("Play finished for #");
Serial.println(globalTrack);
}
static void OnCardOnline(uint16_t code)
{
Serial.println();
Serial.print("Card online ");
Serial.println(code);
}
static void OnCardInserted(uint16_t code)
{
Serial.println();
Serial.print("Card inserted ");
Serial.println(code);
}
static void OnCardRemoved(uint16_t code)
{
Serial.println();
Serial.print("Card removed ");
Serial.println(code);
}
};
DFMiniMp3<HardwareSerial, Mp3Notify> mp3(Serial); //Создать подключение UART к модулю
void setup()
{
//3 кнопки с подтягиваниями
pinMode(sw1,INPUT); // Определите каждую кнопку как ввод с помощью pullup
pinMode(sw2,INPUT);
pinMode(sw3,INPUT);
pinMode(sw4,INPUT);
pinMode(sw5,INPUT);
pinMode(sw6,INPUT);
digitalWrite (sw1, HIGH); // 12 источников питания Votls установлены в выключенное состояние
digitalWrite (sw2, HIGH); // 5 источников питания Votls установлены в выключенное состояние
digitalWrite (sw3, HIGH); // 3 источника питания Votls установлены в выключенное состояние
digitalWrite (sw4, HIGH); // Регулируемый источник питания Votls установлен в выключенное состояние
digitalWrite (sw5, HIGH); // 3 источника питания Votls установлены в выключенное состояние
digitalWrite (sw6, HIGH); // Настраиваемый источник питания Votls установлен в выключенное состояние
Serial.begin(9600);
mp3.begin(); //Начать связь с модулем DFPlayer
uint16_t volume = mp3.getVolume(); //Получить фактический объем
mp3.setVolume(30); //Установить новый объем (максимум 30)
uint16_t count = mp3.getTotalTrackCount(); // Получаем общее количество треков на SD-карте на случай, если мы захотим подать в суд на это позже...
}
// просто функция, которую мы используем для создания задержек в "мс"
//без использования функции delay()
void waitMilliseconds(uint16_t msWait)
{
uint32_t start = millis();
while ((millis() - start) < msWait)
{
// периодический вызов mp3.loop() позволяет получать уведомления
// обрабатывается без прерываний
mp3.loop();
delay(1);
}
}
void loop()
{
if(!digitalRead(sw1))
{
mp3.playMp3FolderTrack(1); // Воспроизведение звуковой дорожки 0001
waitMilliseconds(1000); // 1 сек задержки
}
if(!digitalRead(sw2))
{
mp3.playMp3FolderTrack(2); // Воспроизведение звуковой дорожки 0002
waitMilliseconds(1000); // 1 сек задержки
}
if(!digitalRead(sw3))
{
mp3.playMp3FolderTrack(3); // Воспроизведение звуковой дорожки 0003
waitMilliseconds(1000); // 1 сек задержки;
}
if(!digitalRead(sw4))
{
mp3.playMp3FolderTrack(4); // Воспроизведение звуковой дорожки 0001
waitMilliseconds(1000); // 1 сек задержки
}
if(!digitalRead(sw5))
{
mp3.playMp3FolderTrack(5); // Воспроизведение звуковой дорожки 0002
waitMilliseconds(1000); // 1 сек задержки
}
if(!digitalRead(sw6))
{
mp3.playMp3FolderTrack(6); // Воспроизведение звуковой дорожки 0003
waitMilliseconds(1000); // 1 сек задержки;
}
}//конец пустоты
@Habib Anwari, 👍1
Обсуждение1 ответ
Лучший ответ:
ОТСКОК 2
По сути, механическая часть кнопок и переключателей слегка вибрирует при закрытии или открытии, вызывая множественные нежелательные ложные состояния (похожие на шум). Эта библиотека отфильтровывает эти нежелательные изменения состояния. Подробнее о демонтаже:
Эксперименты Джона Эррингтона с Arduino: использование цифровых входов: переключение отказов и решения для него Статья в Википедии : http://en.wikipedia.org/wiki/Debounce#Contact_bounce См. Внизу этой страницы базовый пример использования и папку "примеры" для получения дополнительной информации.
Библиотека состоит из трех классов:
Debouncer : код, который выполняет фактическое удаление. Только продвинутые пользователи должны играть с этим классом. Bounce : Это библиотека общего пользования. Он связывает Дебаунсер с аппаратным выводом на вашей плате. Кнопка: специальная версия отскока для нажатых кнопок.
https://github.com/thomasfredericks/Bounce2
- `.readFileCounts()` не работает в мини-модуле DFPlayer
- Звук перестает воспроизводиться после подключения rtc
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Проблема с сигналом датчика пульса
- DFPlayer для записи на SD-карту
- Аппаратный SPI Arduino NANO не работает
- Запись выходов "терменвокса" в MIDI-файл на SD-карте
Отвечает ли это на ваш вопрос? [DFPlayer, воспроизведение звука на основе нажатых button](https://arduinoprosto.ru/q/79040/dfplayer-play-sound-based-on-pressed-button), @jsotola
то же , что и ваш последний вопрос ... у вас есть код , который что - то делает , когда вы нажимаете кнопку ... у вас нет кода , который выполнялся бы , когда вы отпускаете кнопку ... у вас также нет кода, который что-либо делает, когда трек заканчивается, за исключением печати сообщения... проверьте сообщения на последовательном мониторе, @jsotola
@jsotola, в этой строке if(!digitalRead(sw4)) я должен сообщить код, если кнопка удерживается нажатой, поэтому выполните функцию. если вас отпустили, не делайте этого. я попробовал еще и сломаться, но это не сработало. не знаю, что использовать, чтобы сообщить об этом программному обеспечению., @Habib Anwari
В данный момент вы проверяете, нажата ли кнопка в данный момент. Таким образом, код внутри оператора if будет выполняться до тех пор, пока нажата кнопка. Вы хотите проверить переход. Взгляните на [библиотеку Bounce2] (https://github.com/thomasfredericks/Bounce2 ), что значительно упрощает проверку кнопок. Тогда у вас есть кнопка
если (.упал ())
, чтобы проверить, упал ли штифт кнопки (для перехода нажатия), илиif(button.rose())
, чтобы проверить, поднялся ли штифт кнопки (для перехода отпускания)., @chrisl@chrisl, спасибо, библиотека Bounce2 была полезной и очень помогла., @Habib Anwari