#include <Wire.h>
#include <U8g2lib.h>
// Initialisation de l'écran OLED avec U8G2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const int playPauseButtonPin = 12;
const int nextButtonPin = 14;
const int prevButtonPin = 27;
// Variables pour le lecteur MP3 simulé
bool isPlaying = false;
int trackIndex = 0;
unsigned long trackStartTime = 0; // Heure de début de la lecture de la piste
unsigned long elapsedTime = 0; // Temps écoulé en millisecondes
unsigned long previousMillis = 0; // Pour actualiser chaque seconde
// Listes des pistes
const char* tracks[] = {"Piste 1", "Piste 2", "Piste 3", "Piste 4"};
const int numTracks = sizeof(tracks) / sizeof(tracks[0]);
void setup() {
u8g2.begin();
// Initialisation des boutons
pinMode(playPauseButtonPin, INPUT_PULLUP);
pinMode(nextButtonPin, INPUT_PULLUP);
pinMode(prevButtonPin, INPUT_PULLUP);
// Initialisation du moniteur série pour le débogage
Serial.begin(115200);
// Affichage initial
updateDisplay();
}
void loop() {
// Gestion des boutons avec un délai anti-rebond
if (digitalRead(playPauseButtonPin) == LOW) {
togglePlayPause();
delay(200); // Délai anti-rebond
}
if (digitalRead(nextButtonPin) == LOW) {
nextTrack();
delay(200); // Délai anti-rebond
}
if (digitalRead(prevButtonPin) == LOW) {
prevTrack();
delay(200); // Délai anti-rebond
}
// Mise à jour de l'affichage toutes les secondes
unsigned long currentMillis = millis();
if (isPlaying && currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
updateDisplay();
}
}
void updateDisplay() {
u8g2.clearBuffer(); // Effacer le tampon
// Afficher le nom du lecteur et de la piste
u8g2.setFont(u8g2_font_6x10_tr); // Police de texte pour les titres
u8g2.setCursor(0, 10);
u8g2.print("Lecteur MP3");
u8g2.setCursor(0, 25);
u8g2.print("Piste: ");
u8g2.print(tracks[trackIndex]);
// Afficher l'état de lecture (Lecture ou Pause)
u8g2.setCursor(0, 40);
u8g2.print("Etat: ");
u8g2.print(isPlaying ? "Lecture" : "Pause");
// Calcul du temps écoulé
unsigned long currentTime = millis();
if (isPlaying) {
elapsedTime = currentTime - trackStartTime;
}
int elapsedSeconds = (elapsedTime / 1000) % 60;
int elapsedMinutes = (elapsedTime / 1000) / 60;
// Afficher le temps écoulé au format MM:SS
u8g2.setFont(u8g2_font_logisoso18_tf); // Police plus grande pour le temps
u8g2.setCursor(0, 60);
u8g2.printf("%02d:%02d", elapsedMinutes, elapsedSeconds);
// Symbole de lecture/pause
u8g2.setFont(u8g2_font_open_iconic_embedded_2x_t); // Police pour les icônes de lecture/pause
u8g2.drawGlyph(100, 20, isPlaying ? 0x0044 : 0x0038);
// Animation des barres de fréquence
for (int i = 0; i < 10; i++) {
int barHeight = random(5, 30);
u8g2.drawBox(90 + i * 4, 50 - barHeight, 3, barHeight);
}
u8g2.sendBuffer(); // Envoyer le tampon à l'écran
}
void nextTrack() {
trackIndex = (trackIndex + 1) % numTracks;
resetTrackTime();
updateDisplay();
}
void prevTrack() {
trackIndex = (trackIndex - 1 + numTracks) % numTracks;
resetTrackTime();
updateDisplay();
}
void togglePlayPause() {
isPlaying = !isPlaying;
if (isPlaying) {
// Reprendre là où on s'était arrêté
trackStartTime = millis() - elapsedTime;
}
updateDisplay();
}
void resetTrackTime() {
elapsedTime = 0;
trackStartTime = millis();
}