ciao...si può fare...all'epoca mi ero fatto una funzione per aggiornare una riga (scrolling text)...sdoppiando la funzione puoi avere uno scrolling asincrono...tipo:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
char p1[] = "fatti non foste a viver come bruti ma per seguir virtute e conoscenza";
char p2[] = "We all live in a yellow submarine...";
boolean nuovaP = true;
unsigned long myMillis;
unsigned long myMillis2;
void setup() {
lcd.begin();
lcd.setCursor(0, 0);
myMillis = millis();
myMillis2 = millis();
aggiornaLCD_0(p1, 16 , nuovaP);
aggiornaLCD_1(p2, 16 , nuovaP);
nuovaP = false;
}
void loop() {
if (millis() - myMillis >= 500) {
aggiornaLCD_0(p1, 16 , nuovaP);
myMillis = millis();
}
if (millis() - myMillis2 >= 900) {
aggiornaLCD_1(p2, 16 , nuovaP);
myMillis2 = millis();
}
}
/* *stringa = stringa da far scorrere su LCD
L_LCD = numero colonne LCD
stringaNew = se è una nuova stringa per reset conteggio posizione
*/
void aggiornaLCD_0(char *stringa, byte L_LCD, boolean stringaNew) {
static int pos = 0;
if (stringaNew) {
pos = 0;
}
char z[L_LCD + 1];
for (byte i = 0; i <= L_LCD; i++) {
z [i] = *(stringa + (i + pos));
}
lcd.setCursor(0, 0);
lcd.print(z);
pos++;
if (pos >= (strlen(stringa) - L_LCD)+1) {
pos = 0;
}
}
void aggiornaLCD_1(char *stringa, byte L_LCD, boolean stringaNew) {
static int pos = 0;
if (stringaNew) {
pos = 0;
}
char z[L_LCD + 1];
for (byte i = 0; i <= L_LCD; i++) {
z [i] = *(stringa + (i + pos));
}
lcd.setCursor(0, 1);
lcd.print(z);
pos++;
if (pos >= (strlen(stringa) - L_LCD)+1) {
pos = 0;
}
}