Как закодировать выпуск датчика мгновенного касания в 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");
} }
@moonmansays, 👍0
Обсуждение2 ответа
В вашем коде есть точка с запятой, которой не место. Ваш текущий код (с небольшим отступом)
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, с которой начинается область действия, код внутри фигурных скобок имеет отступ, а закрывающая фигурная скобка находится на том же уровне отступа, что и строка, содержащая открывающую фигурную скобку.)
Как указал Сим Сон, вам нужно использовать правильную функцию. Согласно документации вашей библиотеки:
boolean playFullFile(char *trackname) — Воспроизведение всего файла. Эта функция не вернется, пока воспроизведение не будет завершено.
Вы хотите проверить датчик касания, поэтому этого вам будет недостаточно.
boolean startPlayingFile(char *trackname) — начать воспроизведение указанного файла с SD-карты, используя воспроизведение с прерыванием. Это позволяет вашей программе выполнять другие задачи во время воспроизведения файла.
В документации это пропущено, но в исходниках есть функция, которая останавливает вашу музыку:
void stopPlaying(void);
Вы можете найти это в папке Arduino: файлы Arduino/libraries/Adafruit_VS1053_Library Adafruit_VS1053.h и Adafruit_VS1053.cpp.
- Какие есть другие IDE для Arduino?
- Плата для разработки STM8 с Arduino IDE
- Что именно делает возвращаемый тип в функции?
- Все float возвращают округленное целое число в меньшую сторону.
- Код CRC8 не работает должным образом
- Проблемы с Serial.read()
- Еще один простой и глупый вопрос о строках C++
- Как поместить пробелы в длинный последовательный ввод println()
вы делаете это так же, как и при обнаружении нажатия клавиши ... когда значение вывода указывает на то, что кнопка была отпущена, останавливайте музыку, @jsotola
Я не знаю библиотеку mp3 и ее методы, но
playFullFile()
звучит так, как будто она может вернуться **после** воспроизведения всего файла. В этом случае кнопка не будет опрашиваться во время воспроизведения файла., @Sim Son