Новый код приводит к звуковому шуму
Я работаю над схемой, которая может записывать звук на SD, когда переключатель находится в положении HIGH, и останавливать запись, когда переключатель находится в положении LOW. Я использую библиотеку TMRpcm. Ранее у меня была решена проблема на этих двух форумах: Запись аудио – ошибка названия фильма и Попытка сохранить файлы .wav с новым именем в каждом цикле. Эти решения решили мою проблему, но оставили мне новую. В настоящее время звук, записанный с помощью нового кода (который я вставил ниже), имеет очень шумное и приглушенное качество звука; в то время как звук, записанный на старом коде (также размещенном ниже), очень четкий. Может ли это быть физической проблемой, и если да, что мне с этим делать? Или это проблема, которую мне не хватает в коде?
СТАРЫЙ КОД – обеспечивает хорошее качество звука
///////////////////////////////////////// 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++; // Чтобы переместить регистр
switch (audiofile) {
case 1: audio.startRecording("1.wav", 16000, A0); break;
case 2: audio.startRecording("2.wav", 16000, A0); break;
case 3: audio.startRecording("3.wav", 16000, A0); break;
case 4: audio.startRecording("4.wav", 16000, A0); break;
case 5: audio.startRecording("5.wav", 16000, A0); break;
case 6: audio.startRecording("6.wav", 16000, A0); break;
case 7: audio.startRecording("7.wav", 16000, A0); break;
case 8: audio.startRecording("8.wav", 16000, A0); break;
case 9: audio.startRecording("9.wav", 16000, A0); break;
case 10: audio.startRecording("10.wav", 16000, A0); break;
}
}
}
/////////////////////////////////////////////////////////////////////////////////
else if (reading == HIGH) {
recmode = 0;
Serial.println("Hung-Up");
switch (audiofile) {
case 1: audio.stopRecording("1.wav"); break;
case 2: audio.stopRecording("2.wav"); break;
case 3: audio.stopRecording("3.wav"); break;
case 4: audio.stopRecording("4.wav"); break;
case 5: audio.stopRecording("5.wav"); break;
case 6: audio.stopRecording("6.wav"); break;
case 7: audio.stopRecording("7.wav"); break;
case 8: audio.stopRecording("8.wav"); break;
case 9: audio.stopRecording("9.wav"); break;
case 10: audio.stopRecording("10.wav"); break;
}
}
}
НОВЫЙ КОД – низкое качество звука
///////////////////////////////////////// SD КАРТА
#include <SD.h>
#include <SPI.h>
#include <TMRpcm.h>
#define SD_ChipSelectPin 10
TMRpcm audio;
///////////////////////////////////////// СЛУЧАЙ ПЕРЕКЛЮЧАТЕЛЯ
unsigned int i = 0; // номер записи
unsigned long d = 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() {
char buffer[50];
sprintf(buffer, "%i.wav", i++);
reading = digitalRead(inPin);
/////////////////////////////////////////////////////////////////////////////////
while (d < 300000) {
d++;
}
d = 0;
/////////////////////////////////////////////////////////////////////////////////
if (reading == LOW) {
if (recmode == 0) {
recmode = 1;
//Serial.println("Запись");
audio.startRecording(buffer, 1600, A0);
//Serial.println(буфер);
}
}
/////////////////////////////////////////////////////////////////////////////////
else if (reading == HIGH) {
recmode = 0;
//Serial.println("Зависание");
audio.stopRecording(buffer);
}
}
@TSauer52, 👍1
1 ответ
Лучший ответ:
Старый код:
audio.startRecording("1.wav", 16000, A0);
Новый код:
audio.startRecording(buffer, 1600, A0);
Заметили опечатку?
- Глобальные переменные занимают много места в динамической памяти.
- Реализовать связь Visible Light с помощью Arduino
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Как я могу прервать задержку() при нажатии кнопки?
- Скетч мигания ESP8266 не мигает светодиодом
- Как запрограммировать nodeMCU через OTA с помощью GPRS?
- Программирование Arduino Uno R3 для срабатывания реле каждые 24 часа
Спасибо, понятия не имею, как я это пропустил (16000), @TSauer52
Легко сделать. Просто нужен свежий взгляд., @Majenko