нет функции сопоставления для вызова '' (Arduino)

Я использую Библиотека музыкального проигрывателя Arduino VS1053. Я не слишком знаком с кодом Arduino, и я работаю над проектом для друга, у которого близится крайний срок. Я просто пытаюсь просмотреть список воспроизведения коротких звуковых файлов всякий раз, когда пьезодатчик (Roland Drumpad) обнаруживает соединение (piezoV) более 0,25. Вот этот участок кода.

while (tracknum <= 47)
    if (piezoV >= 0.10) {
      Serial.println(piezoV);
      // Serial.println(F("Playing track " + tracknum +""));
      // String file = String(trackid) + String(tracknum) + String(ext);
      String file = trackid + tracknum + ext;
      Serial.println(file);
      musicPlayer.playFullFile(file);
      int tracknum = tracknum + 1;
    }

Причина цикла while: есть 47 дорожек, и я хочу, чтобы пэд останавливался после того, как все 47 были пройдены.

К сожалению, когда я пытаюсь запустить этот код, я получаю следующую ошибку.

no matching function for call to 'Adafruit_VS1053_FilePlayer::playFullFile(String)'

Вот весь мой код, если это поможет ответить на мою проблему.

#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include "string.h"
using namespace std;

// define the pins used
//#define CLK 13       // SPI Clock, shared with SD card
//#define MISO 12      // Input data, from VS1053/SD card
//#define MOSI 11      // Output data, to VS1053/SD card
// Connect CLK, MISO and MOSI to hardware SPI pins.
// See http://arduino.cc/en/Reference/SPI "Connections"

// These are the pins used for the breakout example
#define BREAKOUT_RESET  9      // VS1053 reset pin (output)
#define BREAKOUT_CS     10     // VS1053 chip select pin (output)
#define BREAKOUT_DCS    8      // VS1053 Data/command select pin (output)
// These are the pins used for the music maker shield
#define SHIELD_RESET  -1      // VS1053 reset pin (unused!)
#define SHIELD_CS     7      // VS1053 chip select pin (output)
#define SHIELD_DCS    6      // VS1053 Data/command select pin (output)

// These are common pins between breakout and shield
#define CARDCS 4     // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3       // VS1053 Data request, ideally an Interrupt pin


Adafruit_VS1053_FilePlayer musicPlayer =
  // create breakout-example object!
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
// create shield-example object!
//Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);

void setup() {
  const int PIEZO_PIN = A0;
  int piezoADC = analogRead(PIEZO_PIN);
  float piezoV = piezoADC / 1023.0 * 5.0;
  String trackid = "/pad06";
  int tracknum = 001;
  String ext = ".mp3";

  Serial.begin(9600);
  Serial.println("Adafruit VS1053 Simple Test");

  if (! musicPlayer.begin()) { // initialise the music player
    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);  // don't do anything more
  }

  // list files
  // printDirectory(SD.open("/"), 0);

  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(20, 20);

  // Timer interrupts are not suggested, better to use DREQ interrupt!
  //musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int

  // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
  // audio playing
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);  // DREQ int

  while (tracknum <= 47)
    if (piezoV >= 0.10) {
      Serial.println(piezoV);
      // Serial.println(F("Playing track " + tracknum +""));
      // String file = String(trackid) + String(tracknum) + String(ext);
      String file = trackid + String(tracknum) + ext;
      Serial.println(file);
      musicPlayer.playFullFile(file);
      int tracknum = tracknum + 1;
    }

  // Play another file in the background, REQUIRES interrupts!
  // Serial.println(F("Playing track 002"));
  // musicPlayer.startPlayingFile("/track002.mp3");
}

void loop() {
  // File is playing in the background
  if (musicPlayer.stopped()) {
    Serial.println("Done playing music");
    while (1) {
      delay(10);  // we're done! do nothing...
    }
  }
  if (Serial.available()) {
    char c = Serial.read();

    // if we get an 's' on the serial console, stop!
    // if (c == 's') {
    //   musicPlayer.stopPlaying();
    // }

    // if we get an 'p' on the serial console, pause/unpause!
    //   if (c == 'p') {
    //     if (! musicPlayer.paused()) {
    //       Serial.println("Paused");
    //       musicPlayer.pausePlaying(true);
    //     } else {
    //       Serial.println("Resumed");
    //       musicPlayer.pausePlaying(false);
    //     }
    //   }
    // }

    delay(100);
  }
}

Заранее спасибо.


person Widdles    schedule 05.01.2020    source источник


Ответы (1)


Я нашел страницу, которая выглядит как документация для функции playFullFile(). В нем говорится, что параметр должен быть символом *, то есть параметр должен быть массивом символов. Строка — это совсем другое, чем char *, но, к счастью, ее можно легко преобразовать.

Попробуйте заменить

musicPlayer.playFullFile(file);

с

musicPlayer.playFullFile(file.c_str());

Ссылки: https://learn.adafruit.com/adafruit-vs1053-mp3-aac-ogg-midi-wav-play-and-record-codec-tutorial/library-reference и https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/c_str/

person Bradford Needham    schedule 06.01.2020