#include <LiquidCrystal_I2C.h>
static const auto COLUMNS = 16;
static const auto ROWS_PER_SCREEN = 2;
static LiquidCrystal_I2C lcds[] = {
{0x27, COLUMNS, ROWS_PER_SCREEN},
{0x28, COLUMNS, ROWS_PER_SCREEN},
{0x29, COLUMNS, ROWS_PER_SCREEN},
};
static const auto TOTAL_ROWS = (int)(std::size(lcds) * ROWS_PER_SCREEN);
void setup() {
for (auto& lcd : lcds)
lcd.init();
}
void loop() {
static auto position = 0;
static auto delta = 1;
if (position >= TOTAL_ROWS * COLUMNS) {
delta = -1;
position = TOTAL_ROWS * COLUMNS - 1;
}
if (position < 0) {
delta = 1;
position = 0;
}
auto column = position % COLUMNS;
auto row = position / COLUMNS;
auto screen = row / ROWS_PER_SCREEN;
auto screen_row = row % ROWS_PER_SCREEN;
auto lcd = lcds[screen];
lcd.setCursor(column, screen_row);
if (delta > 0)
lcd.print("\xff");
else
lcd.print(" ");
position += delta;
delay(10);
}