This is the code implementing the keypad:
#include <Keypad.h>
#include "AccelStepper.h"
#include <Wire.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 Setup
AccelStepper stepperX(1, 12, 11); // 1 = Easy Driver interface
// NANO Pin 2 connected to STEP pin of Easy Driver
// NANO Pin 3 connected to DIR pin of Easy Driver
// Define the Pins used
#define home_switch 10 // Pin 9 connected to Home Switch (MicroSwitch)
// Stepper Travel Variables
long TravelX; // Used to store the X value entered in the Serial Monitor
int move_finished=1; // Used to check if move is completed
long initial_homing=-1; // Used to Home Stepper at startup
//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 inputString;
long inputInt;
void setup() {
inputString.reserve(10); // maximum number of digit for a number is 10, change if needed
//lcd setup
lcd.clear();
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(9600); // Start the Serial monitor with speed of 9600 Bauds
pinMode(home_switch, INPUT_PULLUP);
delay(5);
// 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);
Serial.print("Stepper is Homing . . . . . . . . . . . ");
while (digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is activated
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);
lcd.print("INITIALIZING!");
delay(250);
lcd.clear();
delay(250);
}
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;
while (!digitalRead(home_switch)) { // Make the Stepper move CW until the switch is deactivated
stepperX.moveTo(initial_homing);
initial_homing++;
stepperX.run();
delay(1);
}
stepperX.setCurrentPosition(0);
lcd.setCursor(0,0);
lcd.print("HOMING COMPLETED");
//delay(5000);
Serial.println("Homing Completed");
Serial.println("");
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
lcd.setCursor(0,1);
lcd.print("enter value:");
Serial.println("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): ");
}
void loop() {
//keypad part
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') { // only act on numeric keys
inputString += key; // append new character to input string
} else if (key == '#') {
if (inputString.length() > 0) {
inputInt = inputString.toInt(); // YOU GOT AN INTEGER NUMBER
inputString = ""; // clear input
Serial.println(inputInt);
// DO YOUR WORK HERE
while (Serial.available()>0) {
//motor part
move_finished=0; // Set variable for checking move of the Stepper
//TravelX= Serial.parseInt(); // Put numeric value from buffer in TravelX variable
TravelX= inputInt;
if (TravelX < 0 || TravelX > 140250) { // Make sure the position entered is not beyond the HOME or MAX position
Serial.println("");
Serial.println("Please enter a value greater than zero and smaller or equal to 70250.....");
Serial.println("");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("invalid value.");
delay(10000);
lcd.clear();
lcd.print("enter value:");
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moving to:");
Serial.print("Moving stepper into position: ");
lcd.print(TravelX);
Serial.println(TravelX);
stepperX.moveTo(TravelX); // Set new moveto position of Stepper
delay(1000); // Wait 1 seconds before moving the Stepper
}
}
if (TravelX >= 0 && TravelX <= 140250) {
// Check if the Stepper has reached desired position
if ((stepperX.distanceToGo() != 0)) {
stepperX.run(); // Move Stepper into position
}
// If move is completed display message on Serial Monitor
if ((move_finished == 0) && (stepperX.distanceToGo() == 0)) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("COMPLETED!");
Serial.println("COMPLETED!");
Serial.println("");
Serial.println("Enter Travel distance (Positive for CW / Negative for CCW and Zero for back to Home): ");
lcd.setCursor(0,1);
lcd.print("enter value:");
move_finished=1; // Reset move variable
}
}
//stepperX.stop();
}
} else if (key == '*') {
inputString = ""; // clear input
}
}
}
with this i can enter upto 10 digits, and when i press '"#" on the keypad. the number is displayed in the serial monitor as well. But it isnot being taken as "TravelX" input.
Basically what i want it to do is the motor to move to the number given in the keypad, and should move as soon as i press #