(RISOLTO) salvare 2 valori di 3 cifre su EEprom da keypad+lcd

Salve a tutti, sono nuovo di Arduino, e da qualche settimana mi sto' cimentando a fare qualche progetto e devo dire con orgoglio che è andato tutto benone grazie a questo forum !

Oggi mi sono arenato su di un problema mai affrontato da me: devo gestire un motore step variando la velocità e il numero di step (VEL e STEP) questi valori devo essere memorizzati su EEPROM e richiamati all'accensione ogni volta; in più da tastiera a membrana 4x4 devo utilizzare 2 tasti per aumentare e diminuire un valore e 2 altri tasti per fare la stessa cosa dell'altro valore, un ultimo tasto per salvare entrambi i valori modificati su EEPROM.

i valori da memorizzare su eeprom di VEL variano da 0 a 9999, e anche i valori di STEP variano da 0 a 9999.

Ebbene ho fatto il progetto hardware collegato il tutto, creato lo sketch con keypad, lcd, eeprom, stepmotor, ma non so come modificare i valori con il keypad e poi memorizzarli su eeprom.

Qualcuno di buon cuore e pazienza potrebbe darmi un aiuto ????
di seguito allego lo sketch che ho approntato ma mancante di tutta la parte relativa alla gestione KEYPAD e EEPROM
******** AGGIORNAMENTO DEL 4 Dicembre 2020 **********
Cercando qua e la sul forum alla fine ho capito il meccanismo, e sbagliato o giusto che sia, FUNZIONA !
allego schema e sketch per chi volesse prendere spunto. NB se userete questo programma, lasciate il copyright in testa allo sketch grazie !

// © 2020 Stefanelli Lorenzo
// Controllo velocità e step di un motore passo-passo con tastiera 4x4 e Lcd 20x4 e sensore IR con driver A4988

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//leggo i dati da eeprom all'accensione
  int vel = (EEPROM.read(1)*256)+EEPROM.read(2);
  int passo = (EEPROM.read(10)*256)+EEPROM.read(11);

//Definizione dei PIN 
const int pinDir = 12;
const int pinStep = 11;
int pinPuls = 13;
int valPulsOld = HIGH;

const long numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 500; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP

void setup() {
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pinPuls, INPUT);
  
  // inizializzo LCD
  lcd.begin(); // initialize the lcd
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);         
  lcd.print("Velocita");        
  lcd.setCursor(0, 1);       
  lcd.print(vel); 
  lcd.setCursor(0, 2);       
  lcd.print("2+ / 8-"); 
  lcd.setCursor(10, 0);      
  lcd.print("Passo mm");      
  lcd.setCursor(10, 1);      
  lcd.print(passo);
  lcd.setCursor(10, 2); 
  lcd.print("6+ / 4-"); 
  lcd.setCursor(0, 3);  
  lcd.print("Premi START x salva"); 
  
}

void loop() {
  char tasto = keypad.getKey(); // assegno una variabile alla pressione dei tasti
  int valPuls = digitalRead(pinPuls); //imposto il valore del sensore IR

    switch (tasto) {
    case '2':
    //se il tasto 2 è premuto, aumenta il valore VEL di 10 
    {vel = vel+10;}
    refresh();
     lcd.setCursor(0, 1);       
     lcd.print(vel);
     lcd.setCursor(10, 1);       
     lcd.print(passo);  
      break;
    case '8':
    //se il tasto 8 è premuto, diminuisce il valore VEL di 10
    {vel = vel-10;}
     refresh();
     lcd.setCursor(0, 1);       
     lcd.print(vel);
     lcd.setCursor(10, 1);       
     lcd.print(passo); 

      break;
    case '6':
    //se il tasto 6 è premuto, aumenta il valore PASSO di 1
    {passo++;}
     lcd.setCursor(10, 1);       
     lcd.print(passo); 
      break;
    case '4':
    //se il tasto 4 è premuto, diminuisce il valore PASSO di 1
    {passo--;}
     lcd.setCursor(10, 1);       
     lcd.print(passo); 

      break;      
    case '*':
    //se il tasto START è premuto, Salva il dati VEL e PASSO su EEPROM
    {EEPROM.write(1, highByte(vel));}
    {EEPROM.write(2, lowByte(vel));}
    {EEPROM.write(10, highByte(passo));}
    {EEPROM.write(11, lowByte(passo));}
    
      break;

}
  //definiamo la direzione del motore
  digitalWrite(pinDir, HIGH);
  
//attiva il motore di N STEP in un senso se il sensore ottico legge LOW
 if (valPuls==LOW && valPulsOld==HIGH) {   
  start(); // va alla funzione per girare il motore
    
  }

  //aspetto 0,1 secondi
  delay(100);

}

void start() {
 // facciamo girare il motore
    digitalWrite(pinDir, HIGH);
    
    for (int x = 0; x < passo; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(vel);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(vel);
    

  }
}

 // Refresh del display LCD ad ogni pressione dei tasti
void refresh() {
    lcd.clear();
  lcd.setCursor(0, 0);         
  lcd.print("Velocita");        
  lcd.setCursor(0, 1);       
  lcd.print("   "); 
  lcd.setCursor(0, 2);       
  lcd.print("2+ / 8-"); 
  lcd.setCursor(10, 0);      
  lcd.print("Passo mm");      
  lcd.setCursor(10, 1);      
  lcd.print("    ");
  lcd.setCursor(10, 2); 
  lcd.print("6+ / 4-"); 
  lcd.setCursor(0, 3);  
  lcd.print("Premi START x salva"); 
}

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink: