Objetivos
- Leer los tres botones programables del frontal: A = GPIO39, B = GPIO38, C = GPIO37.
- Utilizar M5.update y los métodos wasPressed / wasReleased de M5Unified.
- Hacer sonar el altavoz de 1 W conectado a la salida DAC GPIO25 (tone, beep, mute).
- Mostrar un contador de pulsaciones por botón en la pantalla.
Material
- 1 M5Stack Core (Basic o Gray).
- Nada externo: los botones y el altavoz están integrados.
- A tener en cuenta: GPIO39/38/37 son pines de entrada únicamente (sin resistencia pull-down interna) — perfectos para botones, inutilizables como salida.
Código completo
#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);
}
Verificación esperada
- Cada pulsación en A incrementa el contador A y emite un pitido agudo; B emite un beep estándar; C silencia el sonido.
- Los contadores se mantienen coherentes (una pulsación = +1, sin rebote visible gracias a M5Unified).
- No es necesario el monitor serie: toda la información se muestra en la pantalla.
Errores frecuentes
- Olvidar M5.update en loop: wasPressed nunca devuelve verdadero.
- Esperar botones con pinMode(INPUT_PULLDOWN): los pines GPIO37-39 no tienen resistencia pull-down interna; deja que M5Unified lo gestione.
- Utilizar GPIO39/38/37 para controlar un componente: son pines de entrada únicamente.
- Confundir los botones del frontal con el botón rojo lateral: este controla la alimentación a través del IP5306 (doble clic = apagado), no es legible por el programa.
- Volumen demasiado bajo: M5.Speaker.setVolume antes de cualquier tone/beep.