Re: Ардуино - запись звука
Добавлено: Чт июн 09, 2022 12:32:44
А на esp8266 что будет ? Оно будет гонять файлы по wifi или использоваться просто как жирный проц ?
На данный момент Atmega8 для меня не актуальна, написание кода для нее на Атмел Студио я не вывезу. Дурить людям голову что бы кто-то написал такое я не буду. Ладно бы там где-то поправить или подсказать, но тут пока помощь потребовалась более масштабная. А Атмега8 для Ардуино уже точно здесь не прокатит. Мало того я хочу расширять функционал в текущем проекте на Ардуино Атмега328 так как для этого появилась реальная возможностьDimon456 писал(а):Конкретнее, решите нужна вам атмега8 и на ардуино или нет?
есть уже "обрезанная версия" типа cdfat16, я даже ее пробовал, когде еще с буфером толком ничегол не было решено. Счас можно верниться к этому опять посмотреть что получается.Dimon456 писал(а):А его и не надо переписывать, просто убрать лишнее, отказаться от поддержки ехFat Fat32, оставить только Fat16
да все тоже самое, только привлекает что wifi модуль "халявный", останется только зарядить передачу файлов, что бы флэшку не дергать из устройстваMorroc писал(а):А на esp8266 что будет ? Оно будет гонять файлы по wifi или использоваться просто как жирный проц ?
какая скучная у тебя жизнь)) никаких новых открытий ))Morroc писал(а):...
Dimon456 писал(а):А его и не надо переписывать, просто убрать лишнее, отказаться от поддержки ехFat Fat32, оставить только Fat16,
выше рассматривался вариант без буфера...Dimon456 писал(а):Еще не рассматривался вариант без буфера, сколько времени выполняется функция write, сам я не смотрел что туда пишется, ни кто здесь ни чего не сказал про это. Может, вечером в протеусе и гляну.
вот... уже что то интересное... начинается))olegue писал(а):счас есть задумка перенести это все на esp8266, там готовый wifi есть , но с переносом алгоритма сэмплирования придется повозится.
Код: Выделить всё
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);Код: Выделить всё
/* Timestamp functions using a DS1307 RTC connected via I2C and Wire lib
**
** Useful for file name
** ` SD.open(time.timestamp()+".log", FILE_WRITE) `
**
**
** Created: 2015-06-01 by AxelTB
** Last Edit:
*/
#include "RTClib.h"
RTC_DS1307 rtc;
void setup () {
Serial.begin(57600);
#ifndef ESP8266
while (!Serial); // wait for serial port to connect. Needed for native USB
#endif
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// When time needs to be re-set on a previously configured device, the
// following line sets the RTC to the date & time this sketch was compiled
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
void loop() {
DateTime time = rtc.now();
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_FULL:\t")+time.timestamp(DateTime::TIMESTAMP_FULL));
//Date Only
Serial.println(String("DateTime::TIMESTAMP_DATE:\t")+time.timestamp(DateTime::TIMESTAMP_DATE));
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_TIME:\t")+time.timestamp(DateTime::TIMESTAMP_TIME));
Serial.println("\n");
//Delay 5s
delay(5000);
}Код: Выделить всё
String str,strFolder; //declaring string.
//
strFolder=String("DateTime::TIMESTAMP_DATE:\t")+time.timestamp(DateTime::TIMESTAMP_DATE);// формируем папку с именем даты
// формируем втрорую строку с порядоковым номером из ЕЕПРОМ
// не понимаю Зачем мне это теперь, может уже и имя файла делать как дату
str = String(RecordNumber); //converting integer into a string.
while (str.length() < 6)
{
str = "0" + str; // и забить нулями спереди
}
strFolder.concat("\"); // добавлю к папке косую
strFolder.concat(str); /// добавляю имя файла
strFolder.concat(".wav"); /// Добавлю расширение
// конвертирую получившийся поуть в Char массив
strFolder.toCharArray(filename, sizeof(filename));
Код: Выделить всё
SD.open(time.timestamp()+".log", FILE_WRITE) Что, очередной велосипед? Ну пиши.roman.com писал(а):проще написать всё по новой))
А при чем тут сектор? Ты что полностью сектор записываешь?roman.com писал(а):в протеусе всё идельно работает без буфера...
Код: Выделить всё
...........
RTC_DS1307 rtc;
SdFat sd;
SdFile rec;
char filename[22];
char foldername[10];
..
void loop() {
DateTime now = rtc.now();
String strFile,strFolder; //declaring string.
strFolder=String(now.timestamp(DateTime::TIMESTAMP_DATE)); //YYYY-MM-DD
strFolder.replace("-", "");
strFolder.toCharArray(foldername, sizeof(foldername));
sd.mkdir(foldername); // Создаю директорию - пробовал без этого - никак
strFolder.concat("/");
strFile=String(now.timestamp(DateTime::TIMESTAMP_TIME)); //hh:mm:ss
strFile.replace(":", "-");
strFile.concat(".wav");
strFolder.concat(strFile);
strFolder.toCharArray(filename, sizeof(filename));
rec.open(filename, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */Код: Выделить всё
String get_file_name()
{
String filename1;
dt = RTC.now();
filename1+=String(dt.year()-2000,DEC);
if(dt.month()<10)
filename1+="-0"+String(dt.month(),DEC);
else
filename1+="-"+String(dt.month(),DEC);
if(dt.day()<10)
filename1+="-0"+String(dt.day(),DEC);
else
filename1+="-"+String(dt.day(),DEC);
//filename1+="-"+String(dt.hour(),DEC);
//filename1+="-"+String(dt.minute(),DEC);
//filename1+="-"+String(dt.second(),DEC);
filename1+=".txt";
return filename1;
}Код: Выделить всё
if (!sd.exists(foldername) {
sd.mkdir(foldername); // Создаю директорию - пробовал без этого - никак
}пока мои знания в СИ на уровне где-то что-то подкрутить в готовом коде , да и то не всегда, как видилте.roman.com писал(а):эх... када ты уже выкинешь свою ардуину... и будешь писать по нормальному))
Код: Выделить всё
/*
This sketch demonstrates recording of standard WAV files that can be played on any device that supports WAVs. The recording
uses a single ended input from any of the analog input pins. Uses AVCC (5V) reference currently.
Requirements:
Class 4 or 6 SD Card
Audio Input Device (Microphone, etc)
Arduino Uno,Nano, Mega, etc.
Steps:
1. Edit pcmConfig.h
a: On Uno or non-mega boards, #define buffSize 128. May need to increase.
b: Uncomment #define ENABLE_RECORDING and #define BLOCK_COUNT 10000UL
2. Usage is as below. See <a href="https://github.com/TMRh20/TMRpcm/wiki/Advanced-Features#wiki-recording-audio" title="https://github.com/TMRh20/TMRpcm/wiki/Advanced-Features#wiki-recording-audio" rel="nofollow">https://github.com/TMRh20/TMRpcm/wiki/Advanced-Features#wiki-recording-a...</a> for
additional informaiton.
Notes: Recording will not work in Multi Mode.
Performance is very dependant on SD write speed, and memory used.
Better performance may be seen using the SdFat library. See included example for usage.
Running the Arduino from a battery or filtered power supply will reduce noise.
*/
#include <SD.h>
#include <SPI.h>
#include <TMRpcm.h>
#include <EEPROM.h>
#define ENABLE_DEBUG //Включение вывода отладочной информации через Serial. Только для отладки! Закоментировать эту строку перед заливкой в готовое устройство!
#define SD_ChipSelectPin 10 //
#define ledStart 2 /* PIN LED Start */
#define ledStop 3 /* PIN LED Stop */
#define MicPin A1 // Аналоговый пин, к которму подключен микрофон
char NameRecord[10]; // Имя нового - записываемого файла на SD-карту
int RecordNumber; // Номер записи - храним в EEPROM. в диапазоне от 0 до 32767
byte Recording = 0; // Переменная определяет идет сейчас запись или нет
//-----------------------------------------------
int RecInterval = 5; //! Минимальная продолжительность записи в секундах !
//-----------------------------------------------
unsigned long TimeInterval = 0; // Переменная для вычисления времени
int MaxAnalogPinValue = 1000; // Уровень сигнала на аналоговом входе при котором произойдет старт записи
// Значение подбирается индивидуально! (100 - 1023)
int SaveADC1 = 0;
int SaveADC2 = 0;
unsigned int sample;
unsigned int signalMax = 0;
unsigned int signalMin = 256;
unsigned int peakToPeak = 0;
#define peakToPeakMinLevel 200 // Уровень срабатывания на звук. Значение подбирается индивидуально!
// Максимальное значение - 255
TMRpcm audio; // create an object for use in this sketch
void setup() {
#if defined (ENABLE_DEBUG)
Serial.begin(9600);
#endif
pinMode(ledStart, OUTPUT);
pinMode(ledStop, OUTPUT);
//audio.speakerPin = 11; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
pinMode(10,OUTPUT); //Pin pairs: 9,10 Mega: 5-2,6-7,11-12,46-45
if (!SD.begin(SD_ChipSelectPin)) {
digitalWrite(ledStop, LOW);
digitalWrite(ledStart, LOW);
return;
}else{
digitalWrite(ledStop, LOW);
digitalWrite(ledStart, HIGH);
}
analogReference(EXTERNAL);
// The audio library needs to know which CS pin to use for recording
audio.CSPin = SD_ChipSelectPin;
RecordNumber = EEPROM.read(0);
RecInterval = RecInterval * 1000;
}
void loop() {
if (Recording == 0){
int AnR = analogRead(MicPin);
#if defined (ENABLE_DEBUG)
Serial.print("Analog level: ");
Serial.println(AnR);
#endif
if (AnR >= MaxAnalogPinValue) {
#if defined (ENABLE_DEBUG)
Serial.print("Start recording! File: ");
Serial.print(RecordNumber+1);
Serial.println(".wav");
#endif
StartRec();
}
}
if (Recording == 1){
sample = ADCH;
if (sample < 256)
{
if (sample > signalMax)
{
signalMax = sample; // save just the max levels
}
else if (sample < signalMin)
{
signalMin = sample; // save just the min levels
}
}
#if defined (ENABLE_DEBUG)
Serial.print("Max MIC signal: ");
Serial.println(signalMax);
#endif
if (millis() - TimeInterval >= RecInterval) {
peakToPeak = signalMax - signalMin;
signalMax = 0;
signalMin = 256;
#if defined (ENABLE_DEBUG)
Serial.print("peakToPeak = ");
Serial.println(peakToPeak);
#endif
if (peakToPeak < peakToPeakMinLevel) {
analogRead(MicPin);
StopRec();
#if defined (ENABLE_DEBUG)
Serial.println("Recording stopped");
#endif
}else{
TimeInterval = millis()-1;
#if defined (ENABLE_DEBUG)
Serial.println("Continue recording...");
#endif
}
}
}
}
void StartRec() { // begin recording process
SaveADC1 = ADCSRA;
SaveADC2 = ADCSRB;
Recording = 1;
digitalWrite(ledStop, HIGH);
digitalWrite(ledStart, LOW);
RecordNumber++;
if (RecordNumber > 32766)RecordNumber = 0; // небольшое огриничение в номерации файлов
EEPROM.write(0, RecordNumber); // Сохранение в EEPROM номера последнего аудиофайла
TimeInterval = millis(); // Запоминаем millis для отсчета времени записи
sprintf(NameRecord,"%d.wav", RecordNumber); // создаем название файла из номера и расширения ".wav"
audio.startRecording(NameRecord, 16000, MicPin, 0);// Старт записи
}
void StopRec() { // stop recording process, close file
audio.stopRecording(NameRecord);// Стоп записи
digitalWrite(ledStop, LOW);
digitalWrite(ledStart, HIGH);
Recording = 0;
ADCSRA = SaveADC1;
ADCSRB = SaveADC2;
}
этот бред даже читать не хочу...Martian писал(а):...
ну не хочешь "шифровальщик"... сделай "копировальщик" ))olegue писал(а):То что счас находится на флэшке врядли удастся втюхать самому лопоухому врагу даже в базарный день.
ну... уже хорошо)) надо больше СИ )) чем больше СИ тем лучше ))olegue писал(а):пока мои знания в СИ на уровне где-то что-то подкрутить в готовом коде , да и то не всегда, как видилте.