Rivedendo il codice quelle definizioni sono sbagliate.
Nella gestione della tastiera, quando tu scrivi un numero sul display lcd, questo numero è composto da una serie di cifre. Di più, se il numero è con decimali c'è anche la virgola.
Il pezzo di programma che 'scrive' le cifre le scrive una per volta. La tua tastiera ha le cifre da 0 a 9 più una serie di caratteri speciali: * # A B C D. Quando tu scrivi
char key;
key = keypad.waitForKey();
nella variabile key finisce un CARATTERE ASCII che può essere da '0' a '9' o '*' '#' 'A' 'B' 'C' 'D'. Ora tu devi usare uno dei caratteri speciali per far scrivere il CARATTERE ASCII corrispondente alla virgola ',' sul display lcd. Io te ne avevo scelto uno (sbagliando). È il carattere 'A'. Quando dalla tastiera arriva 'A' sul lcd devi scrivere ','. E anche qui avevo sbagliato il programma.
Ma tu devi utilizzare un altro carattere speciale per indicare al programma che hai finito di scrivere il numero, altrimenti come ne esci? Io te ne avevo scelto un altro (sbagliando ancora), È il carattere 'B'. Quando dalla tastiera arriva 'B' significa che l'utente ha finito di scrivere il numero, il programma esce dal ciclo di scrittura e continua.
Ma a mio avviso devi utilizzare un altro carattere speciale per cancellare il carattere che hai inserito e devi scrivere il pezzo di codice che cancella il carattere sul lcd, sposta il cursore indietro di una posizione, controlla che la cancellazione sia lecita, cioè che non ci siano più numeri da cancellare. Contestualmente alla ricezione di ciascun carattere, ed eventualmente alla sua cancellazione, devi prevedere come calcolare il valore in decimale, perché quelli forniti dalla tastiera sono caratteri ASCII.
Sembrava facile scrivere un input da tastiera per scriverlo su un lcd, eh? Anche il codice che ho scritto io nel post #15 è sbagliato.
Per semplicità puoi usare il carattere 'C' per cancellare TUTTO il numero e riscriverlo daccapo.
Questo DOVREBBE ESSERE un codice corretto.
#include <Keypad.h>
#include <LiquidCrystal.h>
//QUESTE DEFINIZIONI SONO NECESSARIE PER LA LOOP CONSIGLIATA DI ACQUISIZIONE
//NUMERO SU LCD
#define VIRGOLA 'A' //<CARATTERE_SPECIALE> A
#define FINE_NUMERO 'B' //<CARATTERE_SPECIALE> B
#define CANCELLA 'C' //<CARATTERE_SPECIALE> C
LiquidCrystal lcd(5, 4, 3, 2, A4, A5);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {A0, A1, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
int LCDRow = 0;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
pinMode(13, INPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
// fase di avvio programma
// avvio lcd
lcd.begin(16, 2);
//scrivo "avvio..."
lcd.print("Avvio...");
delay(5000);
lcd.clear();
}
void loop() {
if (digitalRead(13) == HIGH) {
digitalWrite(12, HIGH);
}
else {
digitalWrite(12, LOW);
}
//scrivo "avvio..."
lcd.print("Avvio...");
delay(5000);
lcd.clear();
//scrivo "inserire altezza"
lcd.print("Inserire altezza");
//sposto il cursore e scrivo "Hmin:"
lcd.setCursor(0, 1);
lcd.print("Hmin:");
//scrivo altezza minima
//QUI DEVI INSERIRE UNA LOOP DA CUI ESCI QUANDO HAI FINITO DI SCRIVERE IL VALORE DI Hmin
//PER CAPIRE QUANDO HAI FINITO DEVI PREVEDERE UN CARATTERE (key) SPECIALE (ABCD*#)
//DI 'FINE_NUMERO'
//DEVI PREVEDERE UN MODO PER 'CONVERTIRE' UN INTERO COME QUELLO CHE OTTERRAI DALLA
//TASTIERA IN UN ALTRO FLOAT CON DUE CIFRE DECIMALI. iL MODO PIÙ SEMPLICE È DIVIDERE
//L'INTERO PER 100 TRASFORMANDOLO IN UN FLOAT.
//PER FAR QUESTO DEVI IGNORARE IL CARATTERE 'VIRGOLA'
int hMin = 0;
char key;
while (true) {
key = keypad.waitForKey();
if (key == VIRGOLA) {
Serial.println(',');
lcd.print(',');
continue;
}
if (key == CANCELLA) {
Serial.println("Cancellato");
lcd.setCursor(5, 1); //POSIZIONA IL CURSORE ALL'INIZIO DEL NUMERO
lcd.print(" "); //SCRIVI UN NUMERO DI SPAZI PER CANCELLARE
lcd.setCursor(5, 1); //RIPOSIZIONA IL CURSORE ALL'INIZIO DEL NUMERO
continue;
}
if (key == FINE_NUMERO) {
break;
}
//key-48 TRASFORMA IL CARATTERE ASCII IN NUMERO DECIMALE
if (key-48 >= 0 && key-48 <=9) { //SE È UN NUMERO
Serial.println(key);
lcd.print(key);
//QUI DEVI INCREMENTARE UNA VARIABILE hMin INTERA PER IL RESTO DEL PROGRAMMA
hMin = hMin * 10 + (key-48);
}
}
//QUI SI ESCE CON HmIN CONTENENTE IL VALORE DA DIVIDERE PER 100 E PORRE IN UN FLOAT
//. . . RESTO DEL PROGRAMMA
}
Alla fine in hMin tu hai un numero INTERO da trasformare in float con le due ultime cifre come decimali.
Ciao,
P.