Hi There!
my problem is that no data is being writen in the arduino, while plugged with a 9v battery, Is here any library that i need to install here is my code.
My project is to emulate a passive acoustic recorder with 8bit.
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>
#include <LowPower.h>
const int chipSelect = 10; // Pin de selección para el módulo SD
const int mic1 = A0; // Primer micrófono en el pin A0
const int mic2 = A1; // Segundo micrófono en el pin A1
unsigned long recordingStartTime = 0;
const unsigned long recordingInterval = 120000; // Graba cada 2 min
const unsigned long recordingDuration = 60000; // Graba durante 1 min
RTC_DS3231 rtc; // Objeto para interactuar con el módulo RTC
File audioFile;
void setup() {
Serial.begin(9600);
// Inicializa la tarjeta SD
if (!SD.begin(chipSelect)) {
Serial.println("No se pudo inicializar la tarjeta SD");
return;
}
Serial.println("Tarjeta SD inicializada correctamente");
pinMode(mic1, INPUT);
pinMode(mic2, INPUT);
// Inicializa el RTC
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el módulo RTC");
while (1);
}
// Si el RTC pierde energía, ajusta la hora. Elimina esta línea si el RTC ya está ajustado.
if (rtc.lostPower()) {
Serial.println("RTC perdió energía, ajustando a la fecha y hora predeterminadas.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
recordingStartTime = millis();
}
void loop() {
// Obtenemos la hora actual desde el RTC
DateTime now = rtc.now();
// Comprueba si estamos entre las 6 p.m. y las 6 a.m.
if ((now.hour() >= 11.10|| now.hour() < 11.30)) {
// Si estamos en el rango de tiempo de grabación, procede
unsigned long currentTime = millis();
// Comprueba si es el momento de grabar
if (currentTime - recordingStartTime >= recordingInterval) {
// Inicia la grabación durante el tiempo especificado
startRecording();
// Espera el tiempo de grabación
delay(recordingDuration);
// Detiene la grabación
stopRecording();
// Actualiza el tiempo de inicio de grabación
recordingStartTime = millis();
}
} else {
// Si estamos fuera del rango de grabación (6 a.m. a 6 p.m.), entra en modo de bajo consumo
enterLowPowerMode();
}
}
void startRecording() {
Serial.println("Iniciando grabación...");
// Crea un nombre de archivo basado en el tiempo actual
String fileName = "AUDIO" + String(millis()) + ".wav";
// Abre el archivo WAV en la tarjeta SD para escribir
audioFile = SD.open(fileName, FILE_WRITE);
if (audioFile) {
// Escribe el encabezado WAV
writeWAVHeader(audioFile, 0, 16000, 2); // 16kHz, 2 canales (micrófonos)
unsigned long startTime = millis();
while (millis() - startTime < recordingDuration) {
int mic1Value = analogRead(mic1); // Lee del primer micrófono
int mic2Value = analogRead(mic2); // Lee del segundo micrófono
// Convierte los valores a formato de 8 bits (0-255)
byte audioSample1 = map(mic1Value, 0, 1023, 0, 255);
byte audioSample2 = map(mic2Value, 0, 1023, 0, 255);
// Escribe los datos de ambos micrófonos en el archivo WAV
audioFile.write(audioSample1);
audioFile.write(audioSample2);
// Ajusta la frecuencia de muestreo (en este caso, ~16kHz)
delayMicroseconds(62);
}
} else {
Serial.println("Error al abrir el archivo para grabar");
}
}
void stopRecording() {
// Cierra el archivo una vez que la grabación termina
if (audioFile) {
unsigned long fileSize = audioFile.size();
audioFile.seek(0); // Vuelve al inicio del archivo
writeWAVHeader(audioFile, fileSize - 8, 16000, 2); // Actualiza el encabezado WAV con el tamaño del archivo
audioFile.close();
Serial.println("Grabación finalizada");
}
}
// Función para escribir el encabezado WAV
void writeWAVHeader(File &file, uint32_t dataSize, uint16_t sampleRate, uint8_t channels) {
// Encabezado estándar de un archivo WAV
file.write("RIFF");
file.write((byte*)&dataSize, 4); // Tamaño de datos del archivo
file.write("WAVE");
// Formato
file.write("fmt ");
uint32_t fmtChunkSize = 16;
file.write((byte*)&fmtChunkSize, 4);
uint16_t audioFormat = 1; // PCM
file.write((byte*)&audioFormat, 2);
file.write((byte*)&channels, 2);
file.write((byte*)&sampleRate, 4);
uint32_t byteRate = sampleRate * channels * 1; // 8 bits por muestra
file.write((byte*)&byteRate, 4);
uint16_t blockAlign = channels * 1;
file.write((byte*)&blockAlign, 2);
uint16_t bitsPerSample = 8;
file.write((byte*)&bitsPerSample, 2);
// Datos
file.write("data");
file.write((byte*)&dataSize, 4);
}
// Función para entrar en modo de bajo consumo
void enterLowPowerMode() {
Serial.println("Entrando en modo de bajo consumo...");
// Suspensión profunda durante 8 segundos
for (int i = 0; i < (recordingInterval / 8000); i++) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
Serial.println("Saliendo del modo de bajo consumo...");
}