Premesso che evito di chiedere perché le risposte spesso sono… cerca su Google studia qua e la ecc. questo è già stato fatto… ma spesso si entra in confusione e si peggiora anziché risolvere, i libri poi quasi tutti scritti da persone che capiscono nulla o poco di DIDATTICA tutti prodighi a spiegare nei minimi dettagli listati molto semplici (troppo facile) ma abbandonano ben presto il lettore a se stesso perché proporre due tre esempi “sensati”per le funzioni importanti (listati realmente utili a qualcosa di concreto e non posticci / fantasiosi ) costa molta fatica sia scriverli che testarli e poi spiegarli dettagliatamente, specie se i listati relativi sono mediamente lunghi. Molti scopiazzano semplicemente a desta e a manca, hanno di fatto un solo obiettivo far soldi con Arduino, spacciandosi per insegnanti. Ad oggi non ho trovato un libro serio chiaro ed esaustivo didatticamente valido (in italiano ovviamente). Veniamo al problema. Ho realizzato con Arduino (basandomi anche su alcuni listati) un sistema a Lcd 20X4 I2C che svolge molte funzioni (Orologio/Antifurto/Meteo/Sens. Ultrasonico) e nell’insieme funziona, ma richiede qualche miglioria a livello di visualizzazione/gestione display. Ho una prima schermata di presentazione, durata ad es.30 Sec. Poi l’LCD deve essere ripulito e passare automaticamente alla seconda schermata. La pulizia del display deve avvenire una sola ed unica volta. Attualmente ho risolto con un secondo Timer/millis ( il primo Timer infatti non viene mai azzerato, prosegue nel conteggio e così deve rimanere) che al raggiungimento dei 30000mS ripulisce l’LCD e in questo specifico caso il Timer 2 viene azzerato, ma questo comporta che ogni 30000mS l’LCD effettua un breve lampeggio (di fatto ripulisce l’lcd ogni 30Sec.) quindi il problema è solo questo : evitare il breve lampeggio ogni 30000mS anche se tutto sommato è un problema accettabile, se non trovo una soluzione (ragionevolmente breve e semplice) con il vostro aiuto. Prima di fare ricorso a questo secondo Timer ho fatto svariati tentativi infruttuosi con il primo Timer (quello che non viene mai azzerato) tipo questo
if (millis() - previousMillis == 30000) {lcd.clear(); lcd.home(); }
questo comando viene ignorato, oppure simile a quello presente nel listato parziale (ma che contiene le varie if utilizzate in questa parte/sezione del programma) dove ho provato anche && all’interno di una if, ma anche questo comando viene ignorato. Fatti poi altri tentativi ma alla fine si fa peggio invece che risolvere. Grazie per l’eventuale supporto se esiste una soluzione semplice al problema.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
long previousMillis = 0;
long interval = 4000;
void setup() {
lcd.init();// Inizializza il display I2C
lcd.backlight();//accende la retroilluminazione
}
void loop() {
if (millis() - previousMillis < 1600) { // Segnale di avvio beep
tone(5, 980, 500);
delay(50);
noTone(5);
}
if (millis()- previousMillis < interval){
lcd.setCursor(0,0);
lcd.print(" Prima schermata ");
lcd.setCursor(1,2);
lcd.print("Elapse Time : ");
lcd.print(millis()/1000.0);
}
if (millis()- previousMillis >3900 && millis()- previousMillis <4000) {
lcd.clear();
lcd.home();
lcd.print("Cancello lcd");// messaggio temporaneo di verifica esecuzione comando
delay(2000);
}
if (millis() - previousMillis > interval) {
lcd.setCursor(0,2);
lcd.print(" - 2 Schermata - ");}
delay (1000);
}