Improve LCD1602 demo animations

This commit is contained in:
christian 2026-10-24 15:10:30 +02:00
parent 6620458e46
commit 8645278350
2 changed files with 102 additions and 13 deletions

View file

@ -5,8 +5,10 @@ PCF8574/PCF8574A I²C-backpack. Demoen viser:
- animeret opstart og blink med baggrundsbelysningen; - animeret opstart og blink med baggrundsbelysningen;
- brugerdefinerede hjerte-, smiley- og rakettegn; - brugerdefinerede hjerte-, smiley- og rakettegn;
- vandret løbetekst; - tekstkort, der skifter på stedet uden vandret scrolling;
- en animeret 16-kanals "BYTE BEATS"-equalizer; - en animeret 16-kanals "BYTE BEATS"-equalizer;
- en hoppende pixel, der udnytter displayets 80×16 individuelle pixelpositioner;
- animeret digital "PIXEL RAIN" med dynamiske brugerdefinerede tegn;
- oppetid og spinner. - oppetid og spinner.
Sketchen bruger kun `Wire`, som følger med Arduino-kernen. Den scanner selv Sketchen bruger kun `Wire`, som følger med Arduino-kernen. Den scanner selv

View file

@ -144,22 +144,24 @@ void bootSequence() {
} }
} }
void marqueeDemo() { void messageCardsDemo() {
const char message[] = " Arduino UNO R4 WiFi + LCD1602 = AWESOME! "; const char *cards[][2] = {
const int length = sizeof(message) - 1; {" ARDUINO UNO R4", " WIFI POWERED"},
{" LCD1602+I2C", " PIXELS AT WORK"},
{" CODE. MAKE.", " REPEAT!"}
};
lcdClear(); lcdClear();
lcdSetCursor(0, 0); lcdSetCursor(0, 0);
lcdWrite(0); printPadded(" MAKER MODE");
lcdPrint(" MAKER MODE "); delay(900);
lcdWrite(0);
for (int offset = 0; offset <= length - LCD_COLUMNS; ++offset) { for (const auto &card : cards) {
lcdSetCursor(0, 0);
printPadded(card[0]);
lcdSetCursor(0, 1); lcdSetCursor(0, 1);
for (uint8_t column = 0; column < LCD_COLUMNS; ++column) { printPadded(card[1]);
lcdWrite(message[offset + column]); delay(1350);
}
delay(145);
} }
} }
@ -192,6 +194,89 @@ void equalizerDemo() {
lcdCreateChar(2, rocket); lcdCreateChar(2, rocket);
} }
void bouncingPixelDemo() {
lcdClear();
lcdSetCursor(0, 0);
printPadded(" BOUNCING PIXEL");
lcdSetCursor(0, 1);
printPadded(" 80x16");
delay(900);
lcdClear();
int x = 2;
int y = 2;
int dx = 2;
int dy = 1;
int previousColumn = -1;
int previousRow = -1;
for (uint8_t frame = 0; frame < 150; ++frame) {
if (previousColumn >= 0) {
lcdSetCursor(previousColumn, previousRow);
lcdWrite(' ');
}
byte pixel[8] = {0, 0, 0, 0, 0, 0, 0, 0};
pixel[y % 8] = 1 << (4 - (x % 5));
lcdCreateChar(4, pixel);
int column = x / 5;
int row = y / 8;
lcdSetCursor(column, row);
lcdWrite(4);
previousColumn = column;
previousRow = row;
x += dx;
y += dy;
if (x <= 0 || x >= 79) {
x = constrain(x, 0, 79);
dx = -dx;
}
if (y <= 0 || y >= 15) {
y = constrain(y, 0, 15);
dy = -dy;
}
delay(35);
}
}
void pixelRainDemo() {
lcdClear();
lcdSetCursor(0, 0);
printPadded(" PIXEL RAIN");
lcdSetCursor(0, 1);
printPadded(" //////\\\\\\");
delay(900);
lcdClear();
for (uint8_t row = 0; row < LCD_ROWS; ++row) {
lcdSetCursor(0, row);
for (uint8_t column = 0; column < LCD_COLUMNS; ++column) {
lcdWrite((column + row * 3) % 8);
}
}
for (uint8_t frame = 0; frame < 55; ++frame) {
for (uint8_t slot = 0; slot < 8; ++slot) {
byte rain[8] = {0, 0, 0, 0, 0, 0, 0, 0};
for (uint8_t pixelColumn = 0; pixelColumn < 5; ++pixelColumn) {
uint8_t head = (frame + slot * 3 + pixelColumn * 5) % 13;
if (head < 8) rain[head] |= 1 << (4 - pixelColumn);
if (head > 0 && head - 1 < 8 && ((slot + pixelColumn) & 1)) {
rain[head - 1] |= 1 << (4 - pixelColumn);
}
}
lcdCreateChar(slot, rain);
}
delay(80);
}
lcdCreateChar(0, heart);
lcdCreateChar(1, smile);
lcdCreateChar(2, rocket);
}
void uptimeDemo() { void uptimeDemo() {
lcdClear(); lcdClear();
lcdSetCursor(0, 0); lcdSetCursor(0, 0);
@ -239,7 +324,9 @@ void loop() {
return; return;
} }
marqueeDemo(); messageCardsDemo();
equalizerDemo(); equalizerDemo();
bouncingPixelDemo();
pixelRainDemo();
uptimeDemo(); uptimeDemo();
} }