bonjour a tous
je vous présente mon livre d'or audio.
Crée par mes soins avec l'aide de GPT ( oui ca risque de faire grincé les dents de certain ^^)
Mais par manque de temps et une forte envie de le confectionner pour que le jour de mon mariage je puisse dire c'est moi qui l'ou "fait" ^^
bref revenont a nos moutons:
materiel:
- téléphone année 80
- ESP32 dev-kit
- module SD
- DF Player mini
- enceinte 3ohm
- SPH0645LM4H adafruit
- 1 résistance 1K
- embout mâle type-C
- câble ondulé 9 fils
- prise adaptateur type-C
- 2 carte SD ( attention faire des test car même si elle est en format FAT32 il est possible que la vitesse d'écriture fasse planter le projet)
- un interrupteur (j'ai pris celui existant dans la téléphone)
- huile de coude
et avec tous ca voici la photo du projet final :
je vous met aussi quelque photo du montage du combiné, oui j'ai soudé un fil avant de penser a mettre la gaine thermo ^^' ne me jugé pas lol
pour l'alimentation je voulais garder la prise PTT pour le gardé le côté marrant donc j'ai perdu une heure ( prévoir moins mais je voulais que tous tienne sans avoir besoin de colle et une bière devait certainement trainer près de moi lol) le peu de colle que l'on aperçois c'est dans la prise type-C car cette chinoiserie ne ce verrouillais pas fermé...
et c'est la que le massacre commence ^^. J'ai fixé comme j'ai pu les composant dans le téléphone, n'étant pas bon en logiciel 3d je n'ai pus crée un support en petg ou pla pour maintenir cela. du coups colle
![]()
pour ceux que ça intéresse voici le câblage :
ainsi que le code généré par IA ( il ne doit surment pas être opti opti, mais ca fonction et c'est le principal non!?? ![]()
#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
#include <FS.h>
#include <driver/i2s.h>
#include <DFRobotDFPlayerMini.h>
// --- CONFIGURATION PINS ---
#define PIN_SWITCH 15
#define DFPLAYER_RX 17
#define DFPLAYER_TX 16
#define SD_CS 5
#define I2S_WS 27 // LRCL
#define I2S_SD 33 // DOUT
#define I2S_SCK 14 // BCLK
#define SAMPLE_RATE 16000
#define MAX_RECORD_SECONDS 600
DFRobotDFPlayerMini dfplayer;
File recordingFile;
bool isRecording = false;
unsigned long recordingStartTime = 0;
HardwareSerial dfSerial(1);
// --- I2S CONFIG avec lecture en 32 bits (compatible SPH0645LM4H) ---
void setupI2SMic() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 1024,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0
};
i2s_pin_config_t pin_config = {
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = I2S_PIN_NO_CHANGE,
.data_in_num = I2S_SD
};
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM_0, &pin_config);
i2s_zero_dma_buffer(I2S_NUM_0);
}
// --- HEADER WAV ---
void writeWavHeader(File file, uint32_t sampleRate, uint32_t dataLength) {
uint32_t fileSize = dataLength + 36;
file.seek(0);
file.write((const uint8_t*)"RIFF", 4);
file.write((const uint8_t*)&fileSize, 4);
file.write((const uint8_t*)"WAVE", 4);
file.write((const uint8_t*)"fmt ", 4);
uint32_t subchunk1Size = 16;
uint16_t audioFormat = 1;
uint16_t numChannels = 1;
uint32_t byteRate = sampleRate * numChannels * 2;
uint16_t blockAlign = numChannels * 2;
uint16_t bitsPerSample = 16;
file.write((const uint8_t*)&subchunk1Size, 4);
file.write((const uint8_t*)&audioFormat, 2);
file.write((const uint8_t*)&numChannels, 2);
file.write((const uint8_t*)&sampleRate, 4);
file.write((const uint8_t*)&byteRate, 4);
file.write((const uint8_t*)&blockAlign, 2);
file.write((const uint8_t*)&bitsPerSample, 2);
file.write((const uint8_t*)"data", 4);
file.write((const uint8_t*)&dataLength, 4);
}
String generateUniqueFilename() {
int index = 1;
String filename;
do {
filename = "/RECORD" + String(index++) + ".WAV";
} while (SD.exists(filename));
return filename;
}
void startRecording() {
String filename = generateUniqueFilename();
recordingFile = SD.open(filename, FILE_WRITE);
if (!recordingFile) {
Serial.println("Erreur ouverture fichier !");
return;
}
Serial.println("Enregistrement : " + filename);
uint8_t header[44] = {0};
recordingFile.write(header, 44);
isRecording = true;
recordingStartTime = millis();
}
void stopRecording() {
if (!isRecording) return;
size_t dataSize = recordingFile.size() - 44;
writeWavHeader(recordingFile, SAMPLE_RATE, dataSize);
recordingFile.close();
Serial.println("Fin de l'enregistrement.");
isRecording = false;
}
void setup() {
Serial.begin(115200);
pinMode(PIN_SWITCH, INPUT_PULLUP);
if (!SD.begin(SD_CS)) {
Serial.println("Erreur carte SD !");
while (true);
}
setupI2SMic();
dfSerial.begin(9600, SERIAL_8N1, DFPLAYER_TX, DFPLAYER_RX);
if (!dfplayer.begin(dfSerial)) {
Serial.println("DFPlayer non détecté !");
} else {
dfplayer.volume(15);
}
}
void loop() {
static bool combinéDécroché = false;
bool interrupteurActif = digitalRead(PIN_SWITCH) == LOW;
if (interrupteurActif && !combinéDécroché) {
combinéDécroché = true;
dfplayer.play(random(1, 4));
delay(2000);
startRecording();
}
if (combinéDécroché && isRecording) {
const int bufferSize = 1024;
uint8_t buffer[bufferSize];
size_t bytesRead = 0;
esp_err_t result = i2s_read(I2S_NUM_0, buffer, bufferSize, &bytesRead, 100);
if (result == ESP_OK && bytesRead > 0) {
int32_t* samples32 = (int32_t*)buffer;
int sampleCount = bytesRead / 4;
int16_t sample16;
int32_t sum = 0;
for (int i = 0; i < sampleCount; i++) {
sample16 = samples32[i] >> 15; // Converti 32 bits -> 16 bits signé
sum += abs(sample16);
recordingFile.write((uint8_t*)&sample16, 2);
}
int moyenne = sum / sampleCount;
Serial.print("Niveau audio : ");
Serial.println(moyenne);
}
if (!interrupteurActif || (millis() - recordingStartTime > MAX_RECORD_SECONDS * 1000)) {
stopRecording();
combinéDécroché = false;
}
}
delay(10);
}
voila voila bonne journée a tous ![]()






