M5StickCplus2/docs/superpowers/specs/2026-05-09-bouncing-hello-world-ball-design.md

1.8 KiB
Raw Permalink Blame History

Bouncing "Hello World" Ball — Design Spec

Goal

Modify the existing M5StickC Plus2 firmware so that the text "Hello World" bounces around the screen inside a filled circle (ball), changing color every time it hits an edge.

Hardware

  • Board: M5StickC Plus2 (ESP32-PICO-V3-02)
  • Display: 1.14" TFT, 135×240 pixels, ST7789V
  • Framework: Arduino (via PlatformIO)

Behaviour

  1. A filled circle (ball) appears on screen with "Hello World" text centred inside.
  2. The ball starts at the centre of the screen and moves with velocity (vx, vy) — initial values ~2–3 px/frame in both axes.
  3. When the ball reaches any screen edge, its velocity on that axis is reversed (bounce) and the ball colour changes to the next colour in a predefined palette.
  4. The screen is filled black each frame before drawing (no motion trails).
  5. The text is drawn in white for contrast against the coloured ball.
  6. Frame rate is controlled by a delay(15) in loop().

Colour Palette

Cycle through: RED (0xF800), GREEN (0x07E0), BLUE (0x001F), YELLOW (0xFFE0), MAGENTA (0xF81F), CYAN (0x07FF).

Ball Size

  • Radius: ~15 pixels (fits on the small screen while leaving room for the text).

Implementation Notes

  • Replace drawCircle with fillCircle for a solid ball.
  • Add fillScreen(TFT_BLACK) at the start of every frame.
  • Use M5.Lcd.setTextColor(TFT_WHITE) and draw the text centred at the ball position using M5.Lcd.getTextBounds() or manual centering with setCursor(x - textWidth/2, y - fontHeight/2).
  • Remove the static "Hello World" from setup() — it is now part of the animated ball.

Files Changed

  • src/main.cpp — rewrite loop and rendering logic.

Out of Scope

  • Touch input, accelerometer, sound — not required.
  • Multiple balls or additional text.