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 сек задержки; 
  }
  
}//конец пустоты

, 👍1

Обсуждение

Отвечает ли это на ваш вопрос? [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


1 ответ


Лучший ответ:

1

ОТСКОК 2

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

Эксперименты Джона Эррингтона с Arduino: использование цифровых входов: переключение отказов и решения для него Статья в Википедии : http://en.wikipedia.org/wiki/Debounce#Contact_bounce См. Внизу этой страницы базовый пример использования и папку "примеры" для получения дополнительной информации.

Библиотека состоит из трех классов:

Debouncer : код, который выполняет фактическое удаление. Только продвинутые пользователи должны играть с этим классом. Bounce : Это библиотека общего пользования. Он связывает Дебаунсер с аппаратным выводом на вашей плате. Кнопка: специальная версия отскока для нажатых кнопок.

https://github.com/thomasfredericks/Bounce2

,