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");
}