сбиваются настройки регистров. Вопрос какие?
Добавлено after 1 minute 32 seconds:
analogRead - это 10 битная обработка с разрешение 1024, а вот звук насколько я понимаю у нас 8ми битный. Ну это так, рассуждения дилетанта.
Добавлено after 2 minutes 12 seconds:
Спойлер
Код: Выделить всё
/* Dmitry OSIPOV. http://www.youtube.com/user/d36073?feature=watch
Arduino Audio Recorder V.1-20160524.
----------------------------------------------------
Arduino Projects: Digital Audio Recorder.
http://apcmag.com/arduino-projects-digital-audio-recorder.htm/
----------------------------------------------------
SD-карту лучше класс 10 и выше.
Питание от батареи или аккумулятора.
Микрофон подключить к pin (A5).
----------------------------------------------------
Download - sketch "Arduino Audio Recorder V.1-20160524"
Библиотеку - SdFat.
Фото.
https://yadi.sk/d/zqi8-L5xruhFq
+ sketch оставлю в комментарии - под видео.
----------------------------------------------------
*/
#include <LiquidCrystal_I2C.h>
#include <SdFat.h> // https://yadi.sk/d/zqi8-L5xruhFq
//#include <EEPROM.h>
#include <RTClib.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
SdFat sd;
SdFile rec;
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int chipSelect = 4; /* Поменял на 10-pln */
unsigned long fileSize = 0L;
unsigned long waveChunk = 16;
unsigned int waveType = 1;
unsigned int numChannels = 1;
unsigned long sampleRate = 22050;
unsigned long bytesPerSec = 22050;
unsigned int blockAlign = 1;
unsigned int bitsPerSample = 8;
unsigned long dataSize = 0L;
unsigned long recByteCount = 0L;
unsigned long recByteSaved = 0L;
const int btnStart = 6;
const int btnStop = 5;
const int ledStart = 2;
const int ledStop = 3;
int recPressed = 0;
int stopPressed = 0;
unsigned long oldTime = 0L;
unsigned long newTime = 0L;
byte buf00[64]; // buffer array 1
byte buf01[64]; // buffer array 2
byte byte1, byte2, byte3, byte4;
unsigned int bufByteCount;
byte bufWrite;
unsigned long timer1;
int timer1on = 0;
//----------------------------------------------------
//char NameRecord[4]; /* Имя нового - записываемого файла на SD-карту. */
//int RecordNumber; /* Номер записи - храним в EEPROM. в диапазоне 0..255. */
//char filename[12];
char filename[22];
char foldername[10];
unsigned long timerLCL;
int timerLCLon=0;
int rValue=0;
char buffer[16] ;
void setup() { // THIS RUNS ONCE
//
lcd.init();
lcd.backlight();
//lcd.setCursor(3,0);
//lcd.print("Hello, world!");
//
rtc.begin();
//EEPROM.put(0, 20000);
Setup_timer2();
Setup_ADC();
pinMode(10, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledStop, OUTPUT);
pinMode(btnStop, INPUT_PULLUP);
pinMode(btnStart, INPUT_PULLUP);
if (sd.begin(chipSelect, SPI_FULL_SPEED)) { // initialise card on SPI to 8MHz SPI bus speed
for (int dloop = 0; dloop < 4; dloop++) {
digitalWrite(ledStart, !digitalRead(ledStart));
delay(100);
}
} else {
lcd.setCursor(0,1);
lcd.print("SD Card not found");
// if error, flash LED twice per second, until reset
while (1) {
digitalWrite(ledStart, !digitalRead(ledStart));
delay(500);
}
}
}
void loop() { // THIS RUNS LOTS!
if (timerLCLon==0){ // запустим таймер для отображения часов
timerLCL=millis(); // включим миллис
timerLCLon=1;
}
if (timerLCLon==1){
if (millis()-timerLCL>500)
{
rValue=analogRead(A0);
lcd.setCursor(0,0);
sprintf(buffer, "Power:%04i",rValue);
lcd.print(buffer);
///////////////////////
DateTime now = rtc.now();
lcd.setCursor(1, 1);
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
timerLCLon=0; }
}
if (digitalRead(btnStart) == LOW && recPressed == 0) {
DateTime now = rtc.now();
String strFile,strFolder; //declaring string.
strFolder=String(now.timestamp(DateTime::TIMESTAMP_DATE));
strFolder.replace("-", "");
strFolder.toCharArray(foldername, sizeof(foldername));
sd.mkdir(foldername); // Создаю директорию - пробовал без этого - никак
strFolder.concat("/");
strFile=String(now.timestamp(DateTime::TIMESTAMP_TIME));
strFile.replace(":", "-");
strFile.concat(".wav");
strFolder.concat(strFile);
strFolder.toCharArray(filename, sizeof(filename));
StartRec(); // launch StartRec method
timer1on = 0;
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 0)
{
timer1 = millis();
timer1on = 1;
}
else if (digitalRead(btnStart) == LOW && recPressed == 1 && timer1on == 1) {
timer1on = 0;
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 1 && (millis() - timer1) > 2000)
{
StopRec(); // launch StopRec method
/* Поэтому (Делаем программную перезагрузку). */
((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */
}
if (recByteCount % 128 == 64 && recPressed == 1) {
rec.write(buf00, 64); // save buf01 to card
recByteSaved += 64;
}
if (recByteCount % 128 == 0 && recPressed == 1) {
rec.write(buf01, 64); // save buf02 to card
recByteSaved += 64;
}
}
void StartRec() { // begin recording process
digitalWrite(ledStart, HIGH);
digitalWrite(ledStop, LOW);
recByteCount = 0;
recByteSaved = 0;
recPressed = 1; // recording button has been pressed
stopPressed = 0;
writeWavHeader();
sbi (TIMSK2, OCIE2A); // enable timer interrupt, start grabbing audio
}
void StopRec() { // stop recording process, update WAV header, close file
cbi (TIMSK2, OCIE2A); // disable timer interrupt
writeOutHeader();
digitalWrite(ledStart, LOW); // turn off recording LED
digitalWrite(ledStop, HIGH); // light stop LED
recPressed = 0;
}
void writeOutHeader() { // update WAV header with final filesize/datasize
rec.seekSet(4);
byte1 = recByteSaved & 0xff;
byte2 = (recByteSaved >> 8) & 0xff;
byte3 = (recByteSaved >> 16) & 0xff;
byte4 = (recByteSaved >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.seekSet(40);
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.close();
}
void dateTime(uint16_t* date, uint16_t* time) {
DateTime now = rtc.now();
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(now.year(), now.month(), now.day());
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(now.hour(), now.minute(), now.second());
}
void writeWavHeader() { // write out original WAV header to file
recByteSaved = 0;
SdFile::dateTimeCallback(dateTime);
////
////
rec.open(filename, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */
rec.write("RIFF");
byte1 = fileSize & 0xff;
byte2 = (fileSize >> 8) & 0xff;
byte3 = (fileSize >> 16) & 0xff;
byte4 = (fileSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.write("WAVE");
rec.write("fmt ");
byte1 = waveChunk & 0xff;
byte2 = (waveChunk >> 8) & 0xff;
byte3 = (waveChunk >> 16) & 0xff;
byte4 = (waveChunk >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = waveType & 0xff;
byte2 = (waveType >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = numChannels & 0xff;
byte2 = (numChannels >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = sampleRate & 0xff;
byte2 = (sampleRate >> 8) & 0xff;
byte3 = (sampleRate >> 16) & 0xff;
byte4 = (sampleRate >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = bytesPerSec & 0xff;
byte2 = (bytesPerSec >> 8) & 0xff;
byte3 = (bytesPerSec >> 16) & 0xff;
byte4 = (bytesPerSec >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = blockAlign & 0xff;
byte2 = (blockAlign >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = bitsPerSample & 0xff;
byte2 = (bitsPerSample >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
rec.write("data");
byte1 = dataSize & 0xff;
byte2 = (dataSize >> 8) & 0xff;
byte3 = (dataSize >> 16) & 0xff;
byte4 = (dataSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
}
void Setup_timer2() {
TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to : 8
TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (8 x 90 + 1) = 22191Hz
OCR2A = 90; // Compare Match register set to 90
}
void Setup_ADC() {
ADMUX = 0x61; // set ADC to read pin A5, ADLAR to 1 (left adjust)
cbi(ADCSRA, ADPS2); // set prescaler to 8 / ADC clock = 2MHz
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
}
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 64 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 64 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}
// if (recByteCount % 128 < 64) { // determine which buffer to store sample into
// buf01[recByteCount % 64] = ADCH;
// } else {
// buf02[recByteCount % 64 ] = ADCH;
// }
}
вот код, может кто посмотрит...
Добавлено after 10 minutes 24 seconds:
c форматами провозился может час... Вот ссылка как надо На LCL правильно вводить цифры.
https://arduino.ru/forum/programmirovan ... noi-stroke
Добавлено after 4 hours 39 minutes 28 seconds:
Не видать не будет этого. В паралельном проекте( там где используется библиотека TMRpsm.h написано в комментарии что не будет писать звук в Multi Mode. Я так понимаю что это режим использования несклькоих аналоговых входов одновременно. Не понимаю, конечно , в чем причина этого ограничения. Но вот удалось накопать такие мысли
в Setup() я задаю
SetupADC() где прописываю пин , ну типа ADMUX=0x61, т.е А1
А вот когда я в Loop() обращаюсь к пину А0, т.е пишут analogRead(A0), то больше к пину А1 я уже не возвращаюсь.
Вообще то вся работа по оцифровке , насколько я понимаю , происходит здеьс
Код: Выделить всё
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 64 && bufWrite == 0) { bufByteCount = 0; bufWrite = 1;
} else if (bufByteCount == 64 & bufWrite == 1) { bufByteCount = 0; bufWrite = 0; }
if (bufWrite == 0) { buf00[bufByteCount] = ADCH; }
if (bufWrite == 1) { buf01[bufByteCount] = ADCH; }
}
может быть мне бы стоило задублировать здесь ADMUX =0x61 в начале?
Добавлено after 2 minutes 47 seconds:
Так получается , что алгоритме теряется пин с которого идет оцифровка после analogRead(A0).