/*
Scroll several Values on the limited available rows of a LCD
https://forum.arduino.cc/t/lcd-20x4-vertikal-scrollen/1061284
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
struct Data {
const char tag[8];
int value;
};
Data data[] {
{"Alpha ", 0},
{"Bravo ", 1},
{"Charlie", 2},
{"Delta ", 3},
{"Echo ", 4},
{"Foxtrot", 5},
{"Golf ", 6},
};
constexpr size_t sizeOfData = sizeof(data) / sizeof(data[0]);
// update the display by time
void lcdUpdate(uint32_t currentMillis = millis())
{
static size_t start = 0; // current start postion
static uint32_t previousMillis = - 1000; // time management
if (currentMillis - previousMillis > 1000)
{
previousMillis = currentMillis;
lcd.clear();
lcd.setCursor(0, 0);
Serial.println();
size_t end = start + 3; // 4 row display
if (end >= sizeOfData) end = sizeOfData -1;
uint8_t row = 0;
for (size_t i = start; i <= end; i++)
{
lcd.setCursor(0, row);
lcd.print(data[i].tag);
lcd.print(F(": "));
lcd.print(data[i].value);
Serial.println(data[i].value); // just for debugging
row++;
}
start = start + 1;
if (start >= sizeOfData) start = 0;
}
}
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.print(F("scrolling"));
}
void loop() {
lcdUpdate();
}