Non riesco a uscirne, voglio far vedere il tasto premuto sul display ma o escono 5 righine orizzontali al posto del numero premuto e il ciclo va avanti bene oppure esce il numero giusto ma si blocca tutto, porca puzzola, dove sbaglio? Praticamente funziona bene fino al passo1, scrive il numerino premuto sulla tastiera ma poi non va al passo2 e si blocca completamente il micro. Invece con alcune modifiche funziona tutto bene e i passi avanzano ma invece di scrivere il tasto premuto scrive 5 linee orizzontali per ogni carattere.
#include #include #include RTC_DS3231 rtc; LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte ROWS = 5; //5 righe const byte COLS = 4; //4 colonne char keys[ROWS][COLS] = { {'A','B','#','*'}, {'1','2','3','U'}, {'4','5','6','D'}, {'7','8','9','E'}, {'','T'} }; byte rowPins[ROWS] = {10, 9, 8, 7, 6}; byte colPins[COLS] = {2, 3, 4, 5};
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
unsigned long tempoTEMP; // variabile per timer visualizzazione temperatura sul display unsigned long tempoRTC; // variabile per timer visualizzazione ora sul display char keyM; // variabile che memorizza il tasto premuto che normalmente sarebbe transitorio solo nel momento che si preme
char keyM1; // serve per poterlo utilizzare nel confronto && con kstate
void setup() { Serial.begin(9600);
rtc.begin();
if (rtc.lostPower()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }
lcd.init(); lcd.setBacklight(1); lcd.clear();
tempoRTC = millis(); // variabile del tempo per scrivere ora e data sul display ogni secondo e non intasare il flusso dei dati tempoTEMP = millis(); // per scrivere la temperatura sul display
lcd.setCursor(0,0); lcd.print("Temp:"); lcd.setCursor(0,1); lcd.print(rtc.getTemperature()); lcd.print (" "); lcd.print ((char) 223); lcd.print("C");
}
void loop() {
if ((millis()- tempoRTC) >= 1000) // ogni secondo manda data e ora al display { DateTime now = rtc.now(); printDateTime(now); tempoRTC=millis(); }
char key = kpd.getKey(); // riceve il valore del tasto premuto
KeyState kstate = kpd.getState(); // riceve lo stato della tastiera HOLD PRESSED IDLE RELEASED
if (key != NO_KEY) // memorizza il valore del tasto premuto { keyM=key; keyM1=key; }
if ((keyM == '*') && (kstate == HOLD)) // se resta premuto il tasto asterisco esegue l'istruzione { lcd.setCursor(0, 3); lcd.print("SET Data: "); lcd.setCursor(10, 3); lcd.print(" / / "); passo=1; }
if (passo == 0)
{ lcd.setCursor(0, 3); lcd.print("ciao "); }
if (passo == 1)
{ while (key != NO_KEY) { setgiorno1(); //qui passa regolarmente al void setgiorno1() } }
if (passo == 2)
{ while (key != NO_KEY) { setgiorno2(); } }
if (passo == 3)
{ while (key != NO_KEY) { setmese1(); } }
if (passo == 4)
{ while (key != NO_KEY) { setmese2(); } }
if ((millis()- tempoTEMP) >= 10000) // ogni 10 secondi manda temperatura al display {
lcd.setCursor(0,0); lcd.print("Temp:"); lcd.setCursor(0,1); lcd.print(rtc.getTemperature()); lcd.print (" "); lcd.print ((char) 223); lcd.print("C"); tempoTEMP=millis(); }
}
void printDateTime(DateTime dt) //questo non ho capito bene come funziona { char dateBuffer[] = " DD/MM/YYYY "; char timeBuffer[] = " hh:mm:ss ";
lcd.setCursor(8, 0); lcd.print(dt.toString(dateBuffer)); lcd.setCursor(9, 1); lcd.print(dt.toString(timeBuffer));
}
void setgiorno1() { lcd.setCursor(10, 3); lcd.print(keyM1);//scrive regolarmente il numero premuto poi si blocca completamente e non va al passo2 passo=2; delay(20); }
void setgiorno2() {
lcd.setCursor(11, 3); lcd.print(keyM1); passo=3; delay(20);
}
void setmese1() {
lcd.setCursor(13, 3); lcd.print(keyM1); passo=4; delay(20);
}
void setmese2() {
lcd.setCursor(14, 3); lcd.print(keyM1); passo=5; delay(20);
}