Objectifs
- Lire les trois boutons programmables de façade : A = GPIO39, B = GPIO38, C = GPIO37.
- Utiliser M5.update et les méthodes wasPressed / wasReleased de M5Unified.
- Faire sonner le haut-parleur 1 W câblé sur la sortie DAC GPIO25 (tone, beep, mute).
- Afficher un compteur d'appuis par bouton sur l'écran.
Matériel
- 1 M5Stack Core (Basic ou Gray).
- Rien d'externe : boutons et haut-parleur sont intégrés.
- À savoir : GPIO39/38/37 sont des broches en entrée uniquement (pas de pull-down interne) — parfaites pour des boutons, inutilisables en sortie.
Code complet
#include <M5Unified.h>
uint32_t nbA = 0, nbB = 0, nbC = 0;
void setup {
auto cfg = M5.config;
M5.begin(cfg);
M5.Speaker.setVolume(180);
M5.Display.setTextSize(2);
M5.Display.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Display.println("Boutons A / B / C");
}
void loop {
M5.update; // indispensable avant wasPressed
if (M5.BtnA.wasPressed) {
nbA++;
M5.Speaker.tone(2200, 100); // 2,2 kHz pendant 100 ms
}
if (M5.BtnB.wasPressed) {
nbB++;
M5.Speaker.beep;
}
if (M5.BtnC.wasPressed) {
nbC++;
M5.Speaker.mute;
}
M5.Display.fillRect(0, 50, 320, 90, TFT_BLACK);
M5.Display.setCursor(10, 55);
M5.Display.printf("A : %lu\n", nbA);
M5.Display.printf("B : %lu\n", nbB);
M5.Display.printf("C : %lu\n", nbC);
vTaskDelay(5 / portTICK_PERIOD_MS);
}
Vérification attendue
- Chaque appui sur A incrémente le compteur A et émet un bip aigu ; B fait un beep standard ; C coupe le son.
- Les compteurs restent cohérents (un appui = +1, pas de rebond visible grâce à M5Unified).
- Le moniteur série n'est pas nécessaire : tout le retour est sur l'écran.
Erreurs fréquentes
- Oublier M5.update dans loop : wasPressed ne renvoie jamais vrai.
- Attendre des boutons avec pinMode(INPUT_PULLDOWN) : les broches GPIO37-39 n'ont pas de pull-down interne ; laissez M5Unified gérer.
- Utiliser GPIO39/38/37 pour commander un composant : ce sont des broches entrée seule.
- Confondre les boutons de façade avec le bouton rouge latéral : celui-ci pilote l'alimentation via l'IP5306 (double-clic = extinction), il n'est pas lisible par le programme.
- Volume trop faible : M5.Speaker.setVolume avant tout tone/beep.