Попытка сохранить файлы .wav с новым именем в каждом цикле.
Я построил установку с Arduino UNO, подключенной к переключателю, так что всякий раз, когда переключатель переключается с ВЫСОКОГО на НИЗКИЙ, звук сохраняется на SD-карту. Я использую библиотеку TMRpcm. Проблема в том, что текущий код сможет записать только 1 аудиофайл; Я хочу, чтобы Arduino работал в течение длительного периода времени, собирая несколько аудиофайлов при включении и выключении переключателя. Мне нужен способ, который позволит это сделать так, чтобы каждый раз, когда переключатель нажимался обратно, следующий сохраненный файл имел другое имя, чем имя ранее сохраненного (желательно увеличенное числовое значение, например «1.wav» и «2.wav» ). Я попробовал audio.startRecording(audiofile+".wav", 16000, A0);, и в результате ни один файл, сохраняемый на SD-карту, не принимает пустой файл с простым названием «WAV». Я пробовал использовать переключатель, но он не позволит мне достичь значения более 10 без исчерпания оперативной памяти. В настоящее время мой код может сохранить 1 аудиофайл, но я хочу, чтобы он достиг точки, когда он может сохранять столько, сколько может вместить SD-карта, без необходимости перезапуска программного обеспечения .
Мой текущий код находится здесь. Любая помощь будет принята с благодарностью
///////////////////////////////////////// SD КАРТА
#include <SD.h>
#include <SPI.h>
#include <TMRpcm.h>
#define SD_ChipSelectPin 10
TMRpcm audio;
///////////////////////////////////////// СЛУЧАЙ ПЕРЕКЛЮЧАТЕЛЯ
int audiofile = 0; // номер записи
unsigned long i = 0;
bool recmode = 0; // состояние записи
//////////////////////////////////////// ВЫКЛЮЧАТЕЛЬ
int inPin = 2; // входной контакт переключателя
int state = HIGH; // переключатель текущего состояния
int reading; // текущее чтение с коммутатора
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT); // Микрофон
pinMode(inPin, INPUT_PULLUP); // Выключатель
//////////////////////////////////////// SD CARD
SD.begin(SD_ChipSelectPin);
audio.CSPin = SD_ChipSelectPin;
}
void loop() {
reading = digitalRead(inPin);
/////////////////////////////////////////////////////////////////////////////////
while (i < 300000) {
i++;
}
i = 0;
/////////////////////////////////////////////////////////////////////////////////
if (reading == LOW) {
if (recmode == 0) {
recmode = 1;
Serial.println("Recording");
audiofile++; // Чтобы переместить регистр
audio.startRecording("1.wav", 16000, A0);
}
}
/////////////////////////////////////////////////////////////////////////////////
else if (reading == HIGH) {
recmode = 0;
Serial.println("Hung-Up");
audio.stopRecording("1.wav");
}
}
@TSauer52, 👍0
Обсуждение1 ответ
Лучший ответ:
Я бы использовал (и использую) snprintf
для форматирования строки как имени файла:
// Глобальная область видимости или локальная статическая
uint32_t myFileNumber = 1;
char filename[12];
// в вашей функции - результат 00000001.WAV
snprintf(filename, 12, "%08d.WAV", myFileNumber);
%08d допускает диапазон от 00000000.WAV до 99999999.WAV и всегда с 8 цифрами. Еще немного — и он будет усечен и поврежден (100000000.WA), но не приведет к переполнению буфера. Вам придется принять меры предосторожности, чтобы у вас никогда не было более 100 миллионов файлов ;)
- SD-карта не инициализируется
- Глобальные переменные занимают много места в динамической памяти.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- DFPlayer для записи на SD-карту
- Программирование Arduino Uno R3 для срабатывания реле каждые 24 часа
- Как управлять двумя шаговыми двигателями и использовать ультразвуковой датчик вместе?
- Матрица и пространство состояний Реализация Arduino
- Новый код приводит к звуковому шуму
Вы не можете просто добавить целое число к строковому литералу с помощью
audiofile + ".WAV"
из-за разных типов. Но вы можете использовать буферchar
иsprintf("%i.WAV",audiofile);
, @chrislТакже вопрос: https://forum.arduino.cc/index.php?topic=587263. Если вы собираетесь это сделать, пожалуйста, будьте достаточно внимательны, чтобы добавить ссылки на другие места, где вы размещаете перекрестные публикации. Это позволит нам избежать траты времени из-за дублирования усилий, а также поможет другим, у кого возникнут такие же вопросы и кто найдет ваше сообщение, найти всю необходимую информацию., @per1234
@chrisl Большое спасибо, это почти решило все мои проблемы!, @TSauer52
@per1234 мои извинения. На сегодняшний день я новичок на форумах и изучаю основные правила их правильного использования. Спасибо за внимание!, @TSauer52