// Static data, update on change data, constantly updating data

#include <LiquidCrystal_I2C.h>
int lcdWidth = 20, lcdHeight = 4;
LiquidCrystal_I2C lcd(0x27, lcdWidth, lcdHeight);  // I2C address 0x27, 20 column and 4 rows
int xx, yy, cc, hello = 5, pots = 11, asciiLO = 161, asciiHI = 254, potA0old = -1, potA1old = -1;

void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(A3));
  lcd.init();
  helloWorld(hello); // static data
  lcd.backlight();
  delay(500);
}

void loop() {
  showPots(); // update on change
  scramble(); // constantly update
}

void showPots() { // only changing data
  int potA0 = analogRead(A0); // read pot
  int potA1 = analogRead(A1);

  if (potA0old != potA0) { // if data changes
    potA0old = potA0; // store new value
    lcd.setCursor(pots, 1); // place cursor
    potPad(potA0); // zero pad pot value
    lcd.print(potA0); // print data to lcd
  }

  if (potA1old != potA1) {
    potA1old = potA1;
    lcd.setCursor(pots, 2);
    potPad(potA1);
    lcd.print(potA1);
  }
}

void potPad(int value) { // pad a value with zeroes
  for (int i = 1000; i > 9; i /= 10) { // thousands, hundreds, tens
    if (value < i) //
      lcd.print("0"); // pad zero
  }
}

void scramble() { // constantly changing data
  xx = random(lcdWidth); // random col
  yy = random(lcdHeight); // random row
  cc = random(asciiLO, asciiHI); // random ascii character
  if ((xx < hello - 1 || xx > pots + 4) || (yy < 1 || yy > 2)) { // data wormhole
    lcd.setCursor(xx, yy); // place cursor on lcd
    lcd.write(cc);
  }
}

void helloWorld(int x) { // static data
  lcd.setCursor(x, 1);
  lcd.print("Hello,");
  lcd.setCursor(x, 2);
  lcd.print("World!");
  delay(500);
}