Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <FS.h>
- #include <SD.h>
- #include <SPI.h>
- #define MIC_PIN 1 // ADC input pin (besser A1 statt 1)
- #define BUTTON_PIN 0 // Boot button
- #define LED_PIN 38 // Status LED
- #define SD_CS 10 // SD card Chip Select
- File audioFile;
- bool isRecording = false;
- bool buttonPressed = false;
- const int sampleRate = 22050; // Sample rate in Hz
- unsigned long lastSampleTime = 0;
- uint32_t audioDataBytes = 0;
- int recordingCount = 1;
- // Audio processing variables
- int16_t dcOffset = 2048; // DC bias removal (12-bit ADC center)
- int16_t lastSample = 0; // For simple low-pass filtering
- // Create WAV file header
- void createWavHeader(File &file, uint32_t sampleRate, uint16_t bitsPerSample, uint16_t channels, uint32_t dataSize) {
- file.seek(0);
- // Main RIFF chunk
- file.write((const uint8_t*)"RIFF", 4);
- uint32_t totalSize = 36 + dataSize;
- file.write((uint8_t *)&totalSize, 4);
- file.write((const uint8_t*)"WAVE", 4);
- // Format chunk
- file.write((const uint8_t*)"fmt ", 4);
- uint32_t fmtChunkSize = 16;
- file.write((uint8_t *)&fmtChunkSize, 4);
- uint16_t audioFormat = 1; // PCM
- file.write((uint8_t *)&audioFormat, 2);
- file.write((uint8_t *)&channels, 2);
- file.write((uint8_t *)&sampleRate, 4);
- uint32_t byteRate = sampleRate * channels * bitsPerSample / 8;
- file.write((uint8_t *)&byteRate, 4);
- uint16_t blockAlign = channels * bitsPerSample / 8;
- file.write((uint8_t *)&blockAlign, 2);
- file.write((uint8_t *)&bitsPerSample, 2);
- // Data chunk header
- file.write((const uint8_t*)"data", 4);
- file.write((uint8_t *)&dataSize, 4);
- }
- void setup() {
- Serial.begin(115200);
- pinMode(BUTTON_PIN, INPUT_PULLUP);
- pinMode(LED_PIN, OUTPUT);
- digitalWrite(LED_PIN, LOW);
- delay(100);
- if (!SD.begin(SD_CS)) {
- Serial.println("Oops! Can't find the SD card. Please check the connection.");
- while (1) {
- digitalWrite(LED_PIN, HIGH);
- delay(200);
- digitalWrite(LED_PIN, LOW);
- delay(200);
- }
- }
- Serial.println("đ¤ Audio Recorder Ready!");
- Serial.println("Press the button to start recording, press again to stop.");
- digitalWrite(LED_PIN, HIGH);
- delay(100);
- digitalWrite(LED_PIN, LOW);
- }
- void loop() {
- handleButtonPress();
- if (isRecording) {
- recordAudioSample();
- }
- }
- void handleButtonPress() {
- bool currentButtonState = (digitalRead(BUTTON_PIN) == LOW);
- if (currentButtonState && !buttonPressed) {
- buttonPressed = true;
- delay(30); // debounce
- if (!isRecording) {
- beginRecording();
- } else {
- finishRecording();
- }
- } else if (!currentButtonState) {
- buttonPressed = false;
- }
- }
- void recordAudioSample() {
- unsigned long currentTime = micros();
- if (currentTime - lastSampleTime >= (1000000UL / sampleRate)) {
- lastSampleTime = currentTime;
- int rawSample = analogRead(MIC_PIN);
- int16_t centeredSample = rawSample - dcOffset;
- // Sanfterer Lowpass Filter fĂźr ausgewogenen Klang
- centeredSample = (centeredSample * 5 + lastSample * 3) / 8;
- lastSample = centeredSample;
- // Verstärkung anpassen
- int16_t processedSample = centeredSample * 6;
- // Soft limiting
- if (processedSample > 16000) processedSample = 16000;
- if (processedSample < -16000) processedSample = -16000;
- audioFile.write((uint8_t)(processedSample & 0xFF));
- audioFile.write((uint8_t)(processedSample >> 8));
- audioDataBytes += 2;
- }
- }
- void beginRecording() {
- char fileName[30];
- snprintf(fileName, sizeof(fileName), "/audio_clip_%03d.wav", recordingCount);
- audioFile = SD.open(fileName, FILE_WRITE);
- if (!audioFile) {
- Serial.println("Sorry, couldn't create the audio file. Please try again.");
- return;
- }
- lastSample = 0;
- // DC Offset Kalibrierung
- int32_t offsetSum = 0;
- for (int i = 0; i < 100; i++) {
- offsetSum += analogRead(MIC_PIN);
- delayMicroseconds(100);
- }
- dcOffset = offsetSum / 100;
- // Platzhalter WAV-Header schreiben
- for (int i = 0; i < 44; i++) {
- audioFile.write((uint8_t)0);
- }
- audioDataBytes = 0;
- recordingCount++;
- Serial.println("đ´ Recording started: " + String(fileName));
- Serial.println("DC offset calibrated to: " + String(dcOffset));
- digitalWrite(LED_PIN, HIGH);
- isRecording = true;
- }
- void finishRecording() {
- isRecording = false;
- createWavHeader(audioFile, sampleRate, 16, 1, audioDataBytes);
- audioFile.close();
- Serial.println("âš Recording stopped.");
- Serial.println("File saved successfully!");
- digitalWrite(LED_PIN, LOW);
- }
Advertisement
Add Comment
Please, Sign In to add comment