🛠 Tracer une courbe d'accélération en temps réel
Objetivos
Dibujar en tiempo real la curva de la norma de aceleración en la pantalla de 240×135 (rotación 1) mediante un búfer circular de 240 muestras —una por columna de píxeles— y las primitivas gráficas de M5GFX (drawLine, fillRect). Técnica básica para cualquier osciloscopio o registrador gráfico en este stick.
Material
- 1× M5StickC Plus2 (v2)
- Cable USB-C para la carga del programa
- Arduino IDE / PlatformIO, biblioteca M5Unified (incluye M5GFX)
Código completo
// Oscilloscope d'accélération — tampon circulaire 240 colonnes (écran 240x135)
#include <M5Unified.h>
const int W = 240, H = 135, N = 240;
float buf[N];
int tete = 0; // prochaine position d'écriture
const float GMIN = -0.5f, GMAX = 3.0f; // échelle verticale en g
int yDe(float g) { // g -> coordonnée écran
if (g < GMIN) g = GMIN; if (g > GMAX) g = GMAX;
return H - 1 - (int)((g - GMIN) / (GMAX - GMIN) * (H - 1));
}
void setup {
auto cfg = M5.config;
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.fillScreen(TFT_BLACK);
M5.Display.setTextColor(TFT_DARKGREY, TFT_BLACK);
M5.Display.setTextSize(1);
for (int g = 0; g <= 3; g++) // grille : 0, 1, 2, 3 g
M5.Display.drawFastHLine(0, yDe(g), W, TFT_DARKGREY);
}
void loop {
M5.update;
float ax, ay, az;
M5.Imu.getAccel(&ax, &ay, &az);
float norme = sqrtf(ax * ax + ay * ay + az * az);
int yAvant = yDe(buf[tete]); // ancienne valeur de la colonne
buf[tete] = norme;
int yApres = yDe(norme);
M5.Display.drawLine(tete, yAvant, tete, yApres, TFT_BLACK); // efface colonne
M5.Display.drawLine(tete, yApres, (tete + 1) % N, yDe(buf[(tete + 1) % N]), TFT_GREEN);
M5.Display.setCursor(150, 0);
M5.Display.setTextColor(TFT_GREEN, TFT_BLACK);
M5.Display.printf("|a| %4.2f g", norme);
tete = (tete + 1) % N;
vTaskDelay(20 / portTICK_PERIOD_MS);
if (M5.BtnB.wasPressed) { // B = remise à zéro de l'écran
M5.Display.fillScreen(TFT_BLACK);
for (int g = 0; g <= 3; g++) M5.Display.drawFastHLine(0, yDe(g), W, TFT_DARKGREY);
}
}
Verificación esperada
En reposo, la curva verde es plana a 1 g; golpear la mesa o sacudir el stick produce picos visibles. La cuadrícula gris marca 0/1/2/3 g. El botón B borra y redibuja la cuadrícula.
Errores frecuentes
- Redibujar toda la pantalla en cada ciclo: se produce parpadeo; dibuja columna por columna como aquí.
- Olvidar borrar el valor anterior de la columna antes de escribir el nuevo → estela vertical.
- Escala vertical mal limitada: sin un recorte (clamp) en
yDe, los picos salen de la pantalla y el trazado salta arriba/abajo. - Coordenadas en modo vertical cuando
setRotation(1)está activo: el búfer debe tener 240 columnas, no 135. - Demasiado
vTaskDelay: curva entrecortada; muy poco: el I2C del IMU (bus G21/G22 compartido con el RTC) satura el renderizado.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino