Editare parametri da KeyPad 4x4

Ciao a tutti,

sto realizzando un programma per una macchina di taglio automatico con lcd e stepper motor.

nella realizzazione dell’iterfaccia utente e di programmazione sto trovando difficoltà a editare un valore tramite KeyPad.

vorrei capire in che modo posso visualizzare su lcd un parametro e contemporaneamente editarlo.

Il codice seguente e in fase di creazione, vorrei editare la variabile step_cm

#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Keypad.h>
const byte numRows= 4;
const byte numCols= 4;
char keys[numRows][numCols]= { 
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'} };
byte rowPins[numRows] = {23,25,27,29}; //Rows 0 to 3
byte colPins[numCols]= {31,33,35,37}; //Columns 0 to 3 
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, numRows,numCols );

//***************************   in/out     ************

int fine_corsa_sx = 50;
int fine_corsa_dx = 49 ;
int program = 48 ;
int dir = 47;
int step_m = 46;
// *******************  variabili programma  ************
int ciclo_taglio= 0;; // ciclo attuale
int prog = 0;// programmazione in corso se = 1
int para_prog = 0;// parametri editabili in programmazione

//******************  variabili EEProm  *****************
int step_cm;   
int accelerazione;
int n_tagli;      // ripetizione tagli da utente
int taglio_lung; //lunghezza di taglio da utente
int speed_av;    // velocità avanzamento stepper da utente
int delay_t ;    // delay fra avanzamento e inizio taglio

 
void setup()
{
  lcd.init();
  lcd.backlight();

  pinMode(fine_corsa_sx, INPUT_PULLUP);
  pinMode(fine_corsa_dx, INPUT_PULLUP);
  pinMode(program, INPUT_PULLUP);
  pinMode(dir, OUTPUT);
  pinMode(step_m, OUTPUT);
  
  
 readeprom();// **********leggo parametri eeprom******
}
 
void loop(){
if (digitalRead(program) == 1){programmazione();} // entra in programmazione  
 

}

void readeprom(){
  step_cm =       EEPROM.read(1);
   accelerazione = EEPROM.read(2);
  n_tagli =       EEPROM.read(3);
  taglio_lung =   EEPROM.read(4);
  speed_av =      EEPROM.read(5); 
  delay_t =       EEPROM.read(6);
}

void writeeprom(){
EEPROM.write (1,step_cm);
EEPROM.write (2,accelerazione);
EEPROM.write (3,n_tagli);
EEPROM.write (4,taglio_lung);
EEPROM.write (5,speed_av); 
EEPROM.write (6,delay_t); 
}

void programmazione(){
  if (prog == 0){lcd.clear();}
  prog = 1;
  char customKey = kpd.getKey();
  lcd.setCursor(0,0);
  lcd.print("Step x Cm  ");
  lcd.print(step_cm);
  lcd.setCursor(0,1);
  lcd.print("Acceleraz. ");
  lcd.print(accelerazione);
  lcd.setCursor(0,2);
  lcd.print("Delay ms   ");
  lcd.print(delay_t);
  if (para_prog == 0 ){ lcd.setCursor(19,0);lcd.print("*");}else {lcd.setCursor(19,0);lcd.print(" ");}
  if (para_prog == 1 ){ lcd.setCursor(19,1);lcd.print("*");}else {lcd.setCursor(19,1);lcd.print(" ");}
  if (para_prog == 2 ){ lcd.setCursor(19,2);lcd.print("*");}else {lcd.setCursor(19,2);lcd.print(" ");} 
  if (customKey == 'A'){para_prog =para_prog +1;if(para_prog >=3){para_prog =0;}}
  if (para_prog == 0 ){ step_cm = customKey;} // <<< non riesco ad inserire 
}

Adesso non è che ho capito bene la tua funzione di programmazione, ma io farei qualcosa del genere!

  1. Alla pressione di un pulsante entro nella funzione programmazione
    2)Nella funzione programmazione ho un ciclo "do while" che continua a leggere il tastierino
    fino alla pressione ad esempio del tasto cancelletto. while(carattere!='#');

  2. Leggo il carattere lo inserisco in un array di char e incremento la variabile indice dell'array

4)Ad ogni carattere letto lo stampo su lcd, magari richiamando una funzione che stampa su lcd

  1. Quando premo il tasto cancelletto, esco dal do while(), tramite funzione atoi(), converto l'array
    di char in un intero e lo assegno alla variabile.
void programmazione(){
  
    char valore[20];
    char customKey;
    int i=0;
    if (prog == 0){lcd.clear();}
    prog = 1;
    do{
         customKey= kpd.getKey();
         stampa(customKey);
         if(customKey!='#')
             valore[i++]=customKey; //Inserisco carattere e poi incremento indice

    }while(customKey!='#');
    valore[i]='\0'; //Terminatore stringa NECESSARIO

    step_cm=atoi(valore); // Da array di char ricavo un intero tramite atoi()
}

manca qualche ' } ' ?
Non funziona

Ti da errore di compilazione? Non manca nessuna parentesi nella funzione!

Manca di sicuro la funzione stampa(char c) che devi crearla tu! La funzione riceverà il carattere e lo scrive su lcd.

Forse bisogna gestire il NO_KEY, quando il tastierino non legge nessun tasto, non bisogna mettere nell'array nessun carattere.

Prova a vedere se cambia qualcosa con queste modifiche!

void programmazione(){
  
    char valore[20];
    char customKey;
    int i=0;
    if (prog == 0){lcd.clear();}
    prog = 1;
    do{
         customKey=kpd.getKey();
         if(costomKey != NO_KEY && customKey!='#'){// Se è stato letto un tasto e diverso da cancelletto
             
             
                  valore[i++]=customKey; //Inserisco carattere e poi incremento indice
                  stampa(customKey); // Stampo se diverso da cancelletto
             

         }//End if

    }while(customKey!='#');
    valore[i]='\0'; //Terminatore stringa NECESSARIO

    step_cm=atoi(valore); // Da array di char ricavo un intero tramite atoi()
}

Grazie adesso, funziona ed ho capito altre funzioni !

provo ad inserirlo correttamente se trovero altre difficoltà spero potrai aiutarmi ancora.