Add UNO R4 WiFi LED matrix demo
This commit is contained in:
parent
65afa5816f
commit
44691d1946
2 changed files with 260 additions and 0 deletions
31
sketches/led_matrix_demo/README.md
Normal file
31
sketches/led_matrix_demo/README.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# LED Matrix Demo
|
||||
|
||||
En selvkørende demo til den indbyggede 12×8 LED-matrix på Arduino UNO R4 WiFi.
|
||||
|
||||
Demoen gentager følgende effekter:
|
||||
|
||||
1. Scanner frem og tilbage
|
||||
2. Digital regn
|
||||
3. Udvidende ringe
|
||||
4. Bevægelig bølge
|
||||
5. Hoppende pixel med hale
|
||||
6. Tilfældige glimt
|
||||
7. Pulserende hjerte
|
||||
|
||||
Sketchen bruger `Arduino_LED_Matrix`, som følger med Arduino Renesas UNO-kernen.
|
||||
Der kræves ingen ekstra komponenter eller biblioteker.
|
||||
|
||||
## Kompilering
|
||||
|
||||
```powershell
|
||||
arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi sketches/led_matrix_demo
|
||||
```
|
||||
|
||||
## Upload
|
||||
|
||||
Upload først efter godkendelse:
|
||||
|
||||
```powershell
|
||||
arduino-cli upload --port COM5 --fqbn arduino:renesas_uno:unor4wifi sketches/led_matrix_demo
|
||||
```
|
||||
|
||||
229
sketches/led_matrix_demo/led_matrix_demo.ino
Normal file
229
sketches/led_matrix_demo/led_matrix_demo.ino
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
#include <Arduino_LED_Matrix.h>
|
||||
|
||||
// Arduino UNO R4 WiFi LED matrix demo (12 columns x 8 rows).
|
||||
// The effects run continuously and require no additional hardware.
|
||||
|
||||
constexpr uint8_t ROWS = 8;
|
||||
constexpr uint8_t COLS = 12;
|
||||
|
||||
ArduinoLEDMatrix matrix;
|
||||
uint8_t frame[ROWS][COLS] = {};
|
||||
|
||||
void clearFrame() {
|
||||
memset(frame, 0, sizeof(frame));
|
||||
}
|
||||
|
||||
void setPixel(int x, int y, bool on = true) {
|
||||
if (x >= 0 && x < COLS && y >= 0 && y < ROWS) {
|
||||
frame[y][x] = on ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
void showFrame(unsigned long durationMs) {
|
||||
matrix.renderBitmap(frame, ROWS, COLS);
|
||||
delay(durationMs);
|
||||
}
|
||||
|
||||
void pauseBetweenEffects() {
|
||||
clearFrame();
|
||||
showFrame(250);
|
||||
}
|
||||
|
||||
void scannerEffect() {
|
||||
for (int x = -2; x < COLS + 2; ++x) {
|
||||
clearFrame();
|
||||
|
||||
for (int y = 0; y < ROWS; ++y) {
|
||||
setPixel(x, y);
|
||||
if ((y & 1) == 0) {
|
||||
setPixel(x - 1, y);
|
||||
}
|
||||
}
|
||||
|
||||
showFrame(65);
|
||||
}
|
||||
|
||||
for (int x = COLS + 1; x >= -2; --x) {
|
||||
clearFrame();
|
||||
|
||||
for (int y = 0; y < ROWS; ++y) {
|
||||
setPixel(x, y);
|
||||
if ((y & 1) != 0) {
|
||||
setPixel(x + 1, y);
|
||||
}
|
||||
}
|
||||
|
||||
showFrame(65);
|
||||
}
|
||||
}
|
||||
|
||||
void rainEffect() {
|
||||
int8_t drops[COLS];
|
||||
|
||||
for (uint8_t x = 0; x < COLS; ++x) {
|
||||
drops[x] = random(-10, 1);
|
||||
}
|
||||
|
||||
for (uint8_t step = 0; step < 75; ++step) {
|
||||
clearFrame();
|
||||
|
||||
for (uint8_t x = 0; x < COLS; ++x) {
|
||||
setPixel(x, drops[x]);
|
||||
setPixel(x, drops[x] - 2);
|
||||
|
||||
++drops[x];
|
||||
if (drops[x] > ROWS + random(0, 5)) {
|
||||
drops[x] = random(-8, -1);
|
||||
}
|
||||
}
|
||||
|
||||
showFrame(65);
|
||||
}
|
||||
}
|
||||
|
||||
void rippleEffect() {
|
||||
for (uint8_t repeat = 0; repeat < 3; ++repeat) {
|
||||
for (int radius = 0; radius <= 13; radius += 2) {
|
||||
clearFrame();
|
||||
|
||||
for (int y = 0; y < ROWS; ++y) {
|
||||
for (int x = 0; x < COLS; ++x) {
|
||||
// Coordinates are doubled so the center can lie between LEDs.
|
||||
const int dx = abs(2 * x - (COLS - 1));
|
||||
const int dy = abs(2 * y - (ROWS - 1));
|
||||
const int distance = max(dx, dy);
|
||||
|
||||
if (abs(distance - radius) <= 1) {
|
||||
setPixel(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
showFrame(110);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void waveEffect() {
|
||||
const uint8_t wave[COLS] = {3, 2, 1, 1, 2, 3, 5, 6, 6, 5, 4, 3};
|
||||
|
||||
for (uint8_t phase = 0; phase < COLS * 5; ++phase) {
|
||||
clearFrame();
|
||||
|
||||
for (uint8_t x = 0; x < COLS; ++x) {
|
||||
setPixel(x, wave[(x + phase) % COLS]);
|
||||
}
|
||||
|
||||
showFrame(75);
|
||||
}
|
||||
}
|
||||
|
||||
void bouncingPixelEffect() {
|
||||
int x = 1;
|
||||
int y = 1;
|
||||
int dx = 1;
|
||||
int dy = 1;
|
||||
int previousX = x;
|
||||
int previousY = y;
|
||||
int olderX = x;
|
||||
int olderY = y;
|
||||
|
||||
for (uint8_t step = 0; step < 70; ++step) {
|
||||
clearFrame();
|
||||
setPixel(x, y);
|
||||
setPixel(previousX, previousY);
|
||||
setPixel(olderX, olderY);
|
||||
showFrame(55);
|
||||
|
||||
olderX = previousX;
|
||||
olderY = previousY;
|
||||
previousX = x;
|
||||
previousY = y;
|
||||
|
||||
x += dx;
|
||||
y += dy;
|
||||
|
||||
if (x <= 0 || x >= COLS - 1) {
|
||||
dx = -dx;
|
||||
x = constrain(x, 0, COLS - 1);
|
||||
}
|
||||
if (y <= 0 || y >= ROWS - 1) {
|
||||
dy = -dy;
|
||||
y = constrain(y, 0, ROWS - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sparkleEffect() {
|
||||
for (uint8_t step = 0; step < 45; ++step) {
|
||||
clearFrame();
|
||||
|
||||
for (uint8_t sparkle = 0; sparkle < 16; ++sparkle) {
|
||||
setPixel(random(COLS), random(ROWS));
|
||||
}
|
||||
|
||||
showFrame(80);
|
||||
}
|
||||
}
|
||||
|
||||
void heartFinale() {
|
||||
uint8_t smallHeart[ROWS][COLS] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0},
|
||||
{0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0},
|
||||
{0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0},
|
||||
{0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0},
|
||||
{0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
uint8_t largeHeart[ROWS][COLS] = {
|
||||
{0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0},
|
||||
{0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0},
|
||||
{1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1},
|
||||
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
|
||||
{0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0},
|
||||
{0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0},
|
||||
{0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
for (uint8_t pulse = 0; pulse < 4; ++pulse) {
|
||||
matrix.renderBitmap(smallHeart, ROWS, COLS);
|
||||
delay(220);
|
||||
matrix.renderBitmap(largeHeart, ROWS, COLS);
|
||||
delay(320);
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
matrix.begin();
|
||||
randomSeed(analogRead(A0));
|
||||
clearFrame();
|
||||
showFrame(400);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
scannerEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
rainEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
rippleEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
waveEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
bouncingPixelEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
sparkleEffect();
|
||||
pauseBetweenEffects();
|
||||
|
||||
heartFinale();
|
||||
pauseBetweenEffects();
|
||||
}
|
||||
|
||||
Loading…
Add table
Reference in a new issue