Hi all,
I am trying to set up my distances that I want my linear motors to move. I want to create a loop function that will allow me to enter in values for the positions A, B, C & D and then when I press the "Hashkey" it will come out of this loop and take the stored values and put them into the motor part of my code.
This is my current code at the moment
#include <Wire.h>
#include <LCD.h>
#include<LiquidCrystal_I2C.h>
#include <Keypad.h>
int valueA = 0;
int valueB = 0;
int valueC = 0;
int valueD = 0;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four colums
//define the smybols on the buttons of the keyboard
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[COLS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[ROWS] = {6,7,8,9}; //connect to the colum pinouts of the keypad
//initalize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE);
//0x3F is 20 by 4 LCD
LiquidCrystal_I2C lcd2(0x3E,2,1,0,4,5,6,7,3,POSITIVE);
//0x3E is 16 by 2 LCD
void setup() {
// put your setup code here, to run once:
//Display messages for (0x3F) 20 by 4 LCD
lcd.backlight();
lcd.begin(20,4);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Pin A");
lcd.setCursor(17,0);
lcd.print("mm");
lcd.setCursor(0,1);
lcd.print("Pin B");
lcd.setCursor(17,1);
lcd.print("mm");
lcd.setCursor(0,2);
lcd.print("Pin C");
lcd.setCursor(17,2);
lcd.print("mm");
lcd.setCursor(0,3);
lcd.print("MOTOR Speed");
lcd.setCursor(17,3);
lcd.print("RPM");
//Display messages for (0x3E) 16 by 2 LCD
lcd2.begin(16,2);
lcd2.backlight();
lcd2.setCursor(0, 0);
lcd2.print("Press # to Start");
lcd2.setCursor(0,1);
lcd2.print("Press * for Home");
void loop() {
static int number = 0;
char key = keypad.waitForKey();
switch(key)
{
case '0'...'9':
number *= 10;
number += key - '0';
break;
case 'A':
useForCaseA(number);
number = 0;
break;
case 'B':
useForCaseB(number);
number = 0;
break;
case 'C':
useForCaseC(number);
number = 0;
break;
case 'D':
useForCaseD(number);
number = 0;
break;
case '*': // Set Home Position
break;
case '#': // Move Motors on Position and Start Test
break;
}
}
void useForCaseA(int num){
valueA = num;
if((valueA >= 1) && (valueA <= 6000)){
lcd.setCursor(10,0);
lcd.print(" ");
lcd.setCursor(10,0);
lcd.print(valueA);
}else{
lcd.setCursor(10,0);
lcd.print(" ");
lcd.setCursor(10,0);
lcd.print(valueA);
valueA=0;
ErrorMessage();
lcd.setCursor(10,0);
lcd.print(" ");
lcd.setCursor(10,0);
lcd.print(valueA);
}
}
void useForCaseB(int num){
valueB = num;
if((valueB >= 1) && (valueB <= 6000)){
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(valueB);
}else{
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(valueB);
valueB=0;
ErrorMessage();
lcd.setCursor(10,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(valueB);
}
}
void useForCaseC(int num){
valueC = num;
if((valueC >= 1) && (valueC <= 6000)){
lcd.setCursor(10,2);
lcd.print(" ");
lcd.setCursor(10,2);
lcd.print(valueC);
}else{
lcd.setCursor(10,2);
lcd.print(" ");
lcd.setCursor(10,2);
lcd.print(valueC);
valueC=0;
ErrorMessage();
lcd.setCursor(10,2);
lcd.print(" ");
lcd.setCursor(10,2);
lcd.print(valueC);
}
}
void useForCaseD(int num){
valueD = num;
if((valueD >= 100) && (valueD <= 6000)){
lcd.setCursor(13,3);
lcd.print(" ");
lcd.setCursor(13,3);
lcd.print(valueD);
}else{
lcd.setCursor(13,3);
lcd.print(" ");
lcd.setCursor(13,3);
lcd.print(valueD);
valueD=0;
ErrorMessage();
lcd.setCursor(13,3);
lcd.print(" ");
lcd.setCursor(13,3);
lcd.print(valueD);
lcd.setCursor(17,3);
lcd.print("RPM");
}
}
void ErrorMessage(){
//Display messages for (0x3E) 16 by 2 LCD
lcd2.clear();
lcd2.setCursor(2,0);
lcd2.print("ERROR Check");
lcd2.setCursor(1,1);
lcd2.print("Values Entered");
delay(10000);
lcd2.clear();
lcd2.begin(16,2);
lcd2.backlight();
lcd2.setCursor(0, 0);
lcd2.print("Press # to Start");
lcd2.setCursor(0,1);
lcd2.print("Press * for Home");
}