Lecteur MP3 & réveil Arduino à écran tactile : guide DIY complet
Présentation
Projet : lecteur MP3 et réveil à écran tactile Arduino. Écran d'accueil : grande horloge, date, température, boutons Lecteur MP3 et Réveil.
Vidéo ou tutoriel écrit.
Interface utilisateur
Écran d'accueil

Horloge (police 7 segments), date, température, boutons "Music Player" et "Alarm Clock".
Lecteur MP3

Bouton central Play/Pause, Précédent/Suivant latéraux. Barre progression haut, barre volume + boutons +/- bas. Horloge coin sup. droit, bouton Menu (retour) gauche.
Réveil

Boutons H (heures) et M (minutes) pour régler. Bouton SET pour valider, CLEAR pour annuler.

Déclenchement : lecture 1er titre carte SD volume élevé (25) jusqu'à appui "DISMISS".
Architecture matérielle
Arduino Mega + écran TFT 3,2" tactile + shield adapté. Lecture MP3 : module BY8001-16P (carte microSD, MP3/WAV, amplificateur 3W intégré, haut-parleur 0,5W direct). Horloge temps réel : DS3231 RTC (température incluse).

Composants
- Module MP3 BY8001-16P
- Écran TFT 3,2" tactile
- Shield TFT pour Mega
- Haut-parleur 0,5W
- Module RTC DS3231
- Arduino Mega
Schéma de câblage

Astuce : Le shield TFT bloque les pins libres → connecteurs mâles sur mesure insérés entre shield et Mega. Alimentation 5V : souder connecteur supplémentaire sur pin 5V du shield (pins VCC Arduino toutes utilisées).

Module MP3 BY8001-16P
Lecture microSD (MP3/WAV), ampli 3W intégré → haut-parleur 3W direct. Contrôle : 5 pins boutons OU série (UART).


Important : UART module en 3,3V → résistance 1kΩ sur RX module (depuis TX Arduino). Pads A/B/C : mode contrôle. Pour contrôle microcontrôleur → retirer 3 résistances sur ces pads. Sorties HP : pins 6/7 (direct) ou 4/5 (ampli externe).
Librairie Arduino BY8001 (GitHub) : fonctions simples (playTrackFromFolder(), pause(), setVolume(), etc.).
Code source
Librairies : UTFT.h, URTouch.h (écran), SoftwareSerial.h, BY8001.h, DS3231.h. Objets + variables + bitmaps boutons (convertis via ImageConverter565 fourni avec UTFT).
#include <UTFT.h> #include <URTouch.h>
#include <SoftwareSerial.h> #include <BY8001.h> #include <DS3231.h>
UTFT myGLCD(SSD1289, 38, 39, 40, 41); // Adapter à votre shield/écran
URTouch myTouch(6, 5, 4, 3, 2);
SoftwareSerial mp3Serial(11, 10); // RX, TX
BY8001 mp3;
DS3231 rtc(SDA, SCL);
// Polices
extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[];
// Bitmaps boutons (fichiers .c à placer dans dossier sketch)
extern unsigned int MusicPlayerButton[0x1040]; extern unsigned int AlarmButton[0x1040];
extern unsigned int ButtonPlay[0x1AE9]; extern unsigned int ButtonPause[0x1AE9];
extern unsigned int PreviousButton[0x9C4]; extern unsigned int NextButton[0x9C4];
extern unsigned int VolumeDown[0x170]; extern unsigned int VolumeUp[0x3B8];
// Variables état
int x, y; char currentPage, playStatus;
int iV = 15; int trackNum = 1; int b = 16;
int aHours = 0, aMinutes = 0;
boolean alarmNotSet = true; String alarmString = "";
float currentTemperature, temperature;
word totalTime, elapsedTime, playback, minutes, seconds, minutesR, secondsR;
String currentClock, currentDate, timeString, ...
Setup : initialisation écran, tactile, RTC, MP3, écran d'accueil
void setup() {
myGLCD.InitLCD(); myGLCD.clrScr();
myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM);
rtc.begin();
Serial.begin(9600); mp3Serial.begin(9600); // BY8001 requiert 9600 baud
mp3.setup(mp3Serial); delay(800); // Démarrage module
drawHomeScreen();
currentPage = '0'; playStatus = '0';
mp3.setVolume(15); delay(100);
currentTemperature = rtc.getTemp();
currentDate = rtc.getDateStr();
currentClock = rtc.getTimeStr();
// Extraction heures/minutes/secondes pour affichage 7 segments
timeString = rtc.getTimeStr();
currentHours = timeString.substring(0,2);
currentMinutes = timeString.substring(3,5);
currentSeconds = timeString.substring(6,8);
}
Boucle principale : 3 écrans (accueil, MP3, alarme)
Écran d'accueil (currentPage='0')
Mise à jour horloge/seconde (police 7 segments), date, température (police BigFont) seulement si changement. Détection tactile : bouton Music Player → drawFrame() (cercle rouge temporaire) → currentPage='1' → drawMusicPlayerScreen(). Bouton Alarm → currentPage='2'.
if (myTouch.dataAvailable()) {
myTouch.read(); x = myTouch.getX(); y = myTouch.getY();
// Music Player button (zone 55-120, 125-190)
if (x>=55 && x<=120 && y>=125 && y<=190) {
drawFrame(87,157,33); currentPage='1'; myGLCD.clrScr(); delay(100);
drawMusicPlayerScreen(); delay(100);
}
// Alarm button (zone 195-260, 125-190)
if (x>=195 && x<=260 && y>=125 && y<=190) {
drawFrame(227,160,29); currentPage='2'; myGLCD.clrScr();
}
}
Écran Lecteur MP3 (currentPage='1')
Gestion tactile : Play/Pause (toggle playStatus 0/1/2), Précédent/Suivant (mp3.previousTrack()/nextTrack()), Volume +/- (increaseVolume()/decreaseVolume() + barre graphique), Menu → retour accueil.
// Play/Pause
if (x>=116 && x<=204 && y>=77 && y<=165) {
if (playStatus=='0') { drawFrame(159,121,42); drawPauseButton(); mp3.playTrackFromFolder(00,001); playStatus='2'; }
else if (playStatus=='1') { drawFrame(159,121,42); drawPauseButton(); mp3.play(); playStatus='2'; }
else if (playStatus=='2') { drawFrame(159,121,42); drawPlayButton(); mp3.pause(); playStatus='1'; }
return;
}
// Volume +/-
if (x>=230 && x<=280 && y>=165 && y<=209) { // Volume Up
drawUnderline(235,205,275,205);
if (iV>=0 && iV<=30) { iV++; drawVolume(iV); }
mp3.increaseVolume(); delay(100);
}
// Menu button (coin 0-75, 0-30)
if (x>=0 && x<=75 && y>=0 && y<=30) { myGLCD.clrScr(); drawHomeScreen(); currentPage='0'; return; }
Barre progression titre
if (playStatus=='1' || playStatus=='2') trackPlayTime();
void trackPlayTime() {
totalTime = mp3.getTotalTrackPlaybackTime(); delay(10);
elapsedTime = mp3.getElapsedTrackPlaybackTime(); delay(10);
minutes = elapsedTime / 60; seconds = (elapsedTime/60.0 - minutes) * 60;
playback = totalTime - elapsedTime;
minutesR = playback / 60; secondsR = (playback/60.0 - minutesR) * 60;
// Affichage temps écoulé/restant + barre rouge progression
int trackBarX = map(elapsedTime, 0, totalTime, 0, 224);
myGLCD.setColor(255,0,0); myGLCD.fillRect(48,50, 48+trackBarX, 58);
if (totalTime == elapsedTime) { mp3.nextTrack(); /* reset barre */ }
}
Horloge coin sup. droit via printClock().
Écran Réveil (currentPage='2')
Affichage heures/minutes (police 7 segments, deux points verts). Boutons H/M incrémentent (modulo 24/60). SET → formate alarmString "HH:MM:00" (même format que rtc.getTimeStr()) → affichage "Alarm set for: HH:MM:00". CLEAR → efface. Menu → retour accueil.
// Formatage alarme pour correspondance exacte avec getTimeStr()
if (aHours < 10 && aMinutes < 10) alarmString = "0"+String(aHours)+":0"+String(aMinutes)+":00";
else if (aHours < 10) alarmString = "0"+String(aHours)+":"+String(aMinutes)+":00";
else if (aMinutes < 10) alarmString = String(aHours)+":0"+String(aMinutes)+":00";
else alarmString = String(aHours)+":"+String(aMinutes)+":00";
Activation alarme
Hors mode réglage (alarmNotSet==false), comparaison alarmString == rtc.getTimeStr(). Si égalité : écran noir, volume 25, lecture titre #1, affichage "ALARM" + bitmap + bouton DISMISS. Boucle alarmOn jusqu'à appui DISMISS → arrêt lecture, volume 15, retour accueil.
Construction du boîtier
Design SolidWorks. Tôle alu découpée multi-outils, pliée sur bord bureau + serre-joints/lattes.


Haut-parleurs : motif circulaire imprimé, collé, perçage trous. Découpe latéraux, collage pistolet sur tôle pliée. Peinture finale. Électronique collée pistolet, câblage, couvercle arrière (2 boulons).


Code complet (avec toutes fonctions graphiques : drawHomeScreen(), drawMusicPlayerScreen(), drawFrame(), drawRectFrame(), drawVolume(), drawTrackBar(), printClock(), drawColon(), drawHomeClock()) disponible ici.
Questions en commentaires, découvrez ma collection de projets Arduino !
Processus de fabrication
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Comment lire de l'audio avec Arduino UNO et DFPlayer Mini – Guide étape par étape
- Horloge numérique TM1637 avec réglage heure/alarme – Prototype Arduino Nano
- Lecteur MP3 piloté par navigateur avec Arduino et shield PHPoC WiFi
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO