Как закодировать выпуск датчика мгновенного касания в IDE?

Я музыкант-исполнитель и новичок в сообществе Arduino. Просто учусь на ходу. Я заинтересован в использовании датчика мгновенного касания с защитным экраном Adafruit MP3 или защитным экраном Wave Shield. Я успешно подключил сенсорный датчик к шилду MusicMaker MP3 (который стоит на Adafruit Metro). Я объединил некоторый код из двух независимо работающих кодовых последовательностей: один для воспроизведения MP3 и второй для срабатывания датчика. Это работает успешно, за исключением того, что музыка начинается, но не останавливается, когда я убираю палец с сенсора. Я хочу, чтобы музыка останавливалась, когда сенсорный датчик не трогается. При повторном прикосновении к датчику я хочу, чтобы музыкальный файл снова начинался с самого начала. Я печатаю код, который работает IDE ниже, и прикрепляю изображение сенсорного датчика, который я использую. Я ценю любые советы по коду! Спасибо.

/*
AnalogReadSerial

Считывает аналоговый ввод на выводе 0, выводит результат на последовательный монитор.
Графическое представление доступно с помощью Serial Plotter ( меню Tools > Serial Plotter).
Подсоедините центральный контакт потенциометра к контакту A0, а внешние контакты к +5 В и земле.

Этот пример кода находится в общественном достоянии.

http://www.arduino.cc/en/Tutorial/AnalogReadSerial
*/

// включить библиотеки SPI, MP3 и SD
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

// определяем используемые выводы
//#define CLK 13 // Часы SPI, общие с SD-картой
//#define MISO 12 // Входные данные с VS1053/SD-карты
//#define MOSI 11 // Выходные данные на VS1053/SD-карту
// Подключите CLK, MISO и MOSI к аппаратным контактам SPI.
// См. http://arduino.cc/en/Reference/SPI "Соединения"

// Это выводы, используемые для примера прорыва
#define BREAKOUT_RESET  9      // вывод сброса VS1053 (выход)
#define BREAKOUT_CS     10     // вывод выбора микросхемы VS1053 (выход)
#define BREAKOUT_DCS    8      // VS1053 Выбор данных/команд (выход)
// Это контакты, используемые для экрана создателя музыки
#define SHIELD_RESET  -1      // вывод сброса VS1053 (не используется!)
#define SHIELD_CS     7      // вывод выбора микросхемы VS1053 (выход)
#define SHIELD_DCS    6      // VS1053 Выбор данных/команд (выход)

// Это общие контакты между прорывом и экраном
#define CARDCS 4     // PIN-код выбора чипа карты
// DREQ должен быть выводом Int, см. http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3       // VS1053 Запрос данных, в идеале вывод прерывания

Adafruit_VS1053_FilePlayer musicPlayer = 
  // создать объект примера прорыва!
  // Adafruit_VS1053_FilePlayer (BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS);
  // создать объект-пример щита!
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);

// процедура установки запускается один раз, когда вы нажимаете сброс:
void setup() {
  // инициализируем последовательную связь со скоростью 9600 бит в секунду:
  Serial.begin(9600);
  Serial.println("Adafruit VS1053 Simple Test");

  if (! musicPlayer.begin()) { // инициализируем музыкальный проигрыватель
     Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
     while (1);
  }
  Serial.println(F("VS1053 found"));

   if (!SD.begin(CARDCS)) {
    Serial.println(F("SD failed, or not present"));
    while (1);  // больше ничего не делаем
  }


  // Установить громкость для левого, правого каналов. меньшие цифры == громче громкость!
  musicPlayer.setVolume(20,20);
}

// процедура цикла выполняется снова и снова навсегда:
void loop() {
  // прочитать ввод на аналоговом выводе 0:
  int sensorValue = analogRead(A0);
  // распечатать прочитанное значение:
  Serial.println(sensorValue);
  if(sensorValue > 100) {
    Serial.println(F("Playing track 001"));
  musicPlayer.playFullFile("/track001.mp3");
  }
 else(sensorValue < 100); {
    Serial.println(F("Paused"));
  musicPlayer.pausePlaying("/track001.mp3");
 }      }

, 👍0

Обсуждение

вы делаете это так же, как и при обнаружении нажатия клавиши ... когда значение вывода указывает на то, что кнопка была отпущена, останавливайте музыку, @jsotola

Я не знаю библиотеку mp3 и ее методы, но playFullFile() звучит так, как будто она может вернуться **после** воспроизведения всего файла. В этом случае кнопка не будет опрашиваться во время воспроизведения файла., @Sim Son


2 ответа


1

В вашем коде есть точка с запятой, которой не место. Ваш текущий код (с небольшим отступом)

void loop() {
  // прочитать ввод на аналоговом выводе 0:
  int sensorValue = analogRead(A0);
  // распечатать прочитанное значение:
  Serial.println(sensorValue);
  if(sensorValue > 100) {
    Serial.println(F("Playing track 001"));
    musicPlayer.playFullFile("/track001.mp3");
  }
  else(sensorValue < 100); { // <<<--точка с запятой здесь неуместна.
    Serial.println(F("Paused"));
    musicPlayer.pausePlaying("/track001.mp3");
  }
}

Должно быть:

void loop() {
  // прочитать ввод на аналоговом выводе 0:
  int sensorValue = analogRead(A0);
  // распечатать прочитанное значение:
  Serial.println(sensorValue);
  if(sensorValue > 100) {
    Serial.println(F("Playing track 001"));
    musicPlayer.playFullFile("/track001.mp3");
  }
  else(sensorValue < 100) { // <<< -- точка с запятой удалена из этой строки
    Serial.println(F("Paused"));
    musicPlayer.pausePlaying("/track001.mp3");
  }
}

С точкой с запятой после else ваш код читается как "...иначе ничего не делать", и тогда я ожидаю, что он выполнит логику паузы независимо от того, какое значение находится в sensorValue.

Вы должны выбрать стиль отступа, а затем полностью соответствовать ему. Большинство программистов на C/C++ используют стиль K&R, который я использовал при редактировании. (Открывающие фигурные скобки находятся на той же строке, что и инструкция/функция if, с которой начинается область действия, код внутри фигурных скобок имеет отступ, а закрывающая фигурная скобка находится на том же уровне отступа, что и строка, содержащая открывающую фигурную скобку.)

,

0

Как указал Сим Сон, вам нужно использовать правильную функцию. Согласно документации вашей библиотеки:

boolean playFullFile(char *trackname) — Воспроизведение всего файла. Эта функция не вернется, пока воспроизведение не будет завершено.

Вы хотите проверить датчик касания, поэтому этого вам будет недостаточно.

boolean startPlayingFile(char *trackname) — начать воспроизведение указанного файла с SD-карты, используя воспроизведение с прерыванием. Это позволяет вашей программе выполнять другие задачи во время воспроизведения файла.

В документации это пропущено, но в исходниках есть функция, которая останавливает вашу музыку:

void stopPlaying(void);

Вы можете найти это в папке Arduino: файлы Arduino/libraries/Adafruit_VS1053_Library Adafruit_VS1053.h и Adafruit_VS1053.cpp.

,