That works perfectly, thanks a bunch!
I have a teensy little problem. I want the input to be cleared when i press "*" key on the keypad. Sort of like a backspace incase i press the wrong number. I tried implementing it by adding an else if statement at the end, but that doesn't seem to be working.
#include <Keypad.h>
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
AccelStepper stepperX(1, 12, 11); // 1 = Easy Driver interface
const byte home_switch = 10;
// Stepper Travel Variables
long TravelX; // Used to store the X value preovided by the user
bool moveComplete = true;
//keypad setup
const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 4; //four columns
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
String keypadInput;
void lcdEnterValue() {
lcd.clear();
lcd.print(F("enter value:"));
lcd.setCursor(0, 1);
Serial.println(F("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): "));
}
bool readKeypad(long& newDestination) {
long userInput = 0;
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') { // only act on numeric keys ==> HOW DO YOU ENTER NEGATIVE VALUES?
keypadInput += key; // append new character to input string
lcd.print(key);
} else if (key == '#') {
if (keypadInput.length() > 0) {
userInput = keypadInput.toInt();
keypadInput = ""; // clear input
if (userInput < 0 || userInput > 140250) { // Make sure the position entered is not beyond the HOME or MAX position
Serial.println(F("\nPlease enter a value greater than zero and smaller or equal to 70250.....\n"));
lcd.clear();
lcd.print(F("invalid value."));
delay(3000);
lcdEnterValue();
return false;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Moving to:"));
lcd.print(userInput);
Serial.print(F("Moving stepper into position: "));
Serial.println(userInput);
delay(1000); // Wait 1 seconds before moving the Stepper
newDestination = userInput;
return true;
}
}else if (key == '*') {
keypadInput = ""; // clear input
}
}
}
return false;
}
void homing() {
// Set Max Speed and Acceleration of each Steppers at startup for homing
stepperX.setMaxSpeed(800.0); // Set Max Speed of Stepper (Slower to get better accuracy)
stepperX.setAcceleration(800.0); // Set Acceleration of Stepper
// Start Homing procedure of Stepper Motor at startup
lcd.setCursor(0, 0);
lcd.print(F("HOMING"));
Serial.print(F("Stepper is Homing"));
long initial_homing = -1; // Used to Home Stepper at startup
while (digitalRead(home_switch) == HIGH) {
stepperX.moveTo(initial_homing); // Set the position to move to
initial_homing--; // Decrease by 1 for next move if needed
stepperX.run(); // Start moving the stepper
delay(1);
}
stepperX.setCurrentPosition(0); // Set the current position as zero for now
stepperX.setMaxSpeed(100.0); // Set Max Speed of Stepper (Slower to get better accuracy)
stepperX.setAcceleration(100.0); // Set Acceleration of Stepper
initial_homing = 1;
delay(15); // anti-bounce
while (digitalRead(home_switch) == LOW) {
stepperX.moveTo(initial_homing);
initial_homing++;
stepperX.run();
delay(1);
}
stepperX.setCurrentPosition(0);
lcd.clear();
lcd.print(F("HOMING OK"));
Serial.println(F("Homing OK\n"));
}
void setup() {
pinMode(home_switch, INPUT_PULLUP);
Serial.begin(115200); // don't go slow.
keypadInput.reserve(10); // avoid dynamic allocation
keypadInput == ""; // empty the String
lcd.init(); // initialize the lcd
lcd.clear();
lcd.backlight();
homing();
stepperX.setMaxSpeed(1000.0); // Set Max Speed of Stepper (Faster for regular movements)
stepperX.setAcceleration(500.0); // Set Acceleration of Stepper
// Print out Instructions on the Serial Monitor at Start
lcdEnterValue();
}
void loop() {
if (readKeypad(TravelX)) {
stepperX.moveTo(TravelX); // Set new moveto position of Stepper
moveComplete = false;
}
// Check if the Stepper has reached desired position
if ((stepperX.distanceToGo() != 0)) {
stepperX.run(); // Move Stepper if needed
} else {
if (!moveComplete) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("COMPLETED!");
Serial.println("COMPLETED!");
lcdEnterValue();
moveComplete = true;
}
}
}
I added the below code to the main code:
else if (key == '*') {
keypadInput = ""; // clear input
}