From 8645278350a614a999dc6c46cb3534c61af5e6ec Mon Sep 17 00:00:00 2001 From: christian Date: Sat, 24 Oct 2026 15:10:30 +0200 Subject: [PATCH] Improve LCD1602 demo animations --- .../lcd1602_i2c_demo/README.md | 4 +- .../lcd1602_i2c_demo/lcd1602_i2c_demo.ino | 111 ++++++++++++++++-- 2 files changed, 102 insertions(+), 13 deletions(-) diff --git a/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/README.md b/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/README.md index c4085b4..e2a6552 100644 --- a/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/README.md +++ b/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/README.md @@ -5,8 +5,10 @@ PCF8574/PCF8574A I²C-backpack. Demoen viser: - animeret opstart og blink med baggrundsbelysningen; - brugerdefinerede hjerte-, smiley- og rakettegn; -- vandret løbetekst; +- tekstkort, der skifter på stedet uden vandret scrolling; - 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. Sketchen bruger kun `Wire`, som følger med Arduino-kernen. Den scanner selv diff --git a/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/lcd1602_i2c_demo.ino b/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/lcd1602_i2c_demo.ino index 8bba315..04edf0a 100644 --- a/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/lcd1602_i2c_demo.ino +++ b/sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo/lcd1602_i2c_demo.ino @@ -144,22 +144,24 @@ void bootSequence() { } } -void marqueeDemo() { - const char message[] = " Arduino UNO R4 WiFi + LCD1602 = AWESOME! "; - const int length = sizeof(message) - 1; +void messageCardsDemo() { + const char *cards[][2] = { + {" ARDUINO UNO R4", " WIFI POWERED"}, + {" LCD1602+I2C", " PIXELS AT WORK"}, + {" CODE. MAKE.", " REPEAT!"} + }; lcdClear(); lcdSetCursor(0, 0); - lcdWrite(0); - lcdPrint(" MAKER MODE "); - lcdWrite(0); + printPadded(" MAKER MODE"); + delay(900); - for (int offset = 0; offset <= length - LCD_COLUMNS; ++offset) { + for (const auto &card : cards) { + lcdSetCursor(0, 0); + printPadded(card[0]); lcdSetCursor(0, 1); - for (uint8_t column = 0; column < LCD_COLUMNS; ++column) { - lcdWrite(message[offset + column]); - } - delay(145); + printPadded(card[1]); + delay(1350); } } @@ -192,6 +194,89 @@ void equalizerDemo() { 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() { lcdClear(); lcdSetCursor(0, 0); @@ -239,7 +324,9 @@ void loop() { return; } - marqueeDemo(); + messageCardsDemo(); equalizerDemo(); + bouncingPixelDemo(); + pixelRainDemo(); uptimeDemo(); }