#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
/*
Initialize stepper and set pins
*/
#define PIN1 44
#define PIN2 46
#define STEPS 800.0
Stepper stepper(STEPS, 11, 10);
/*
Initialize LCD and set pins
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
/*
Initialize keypad, set pins and keys
*/
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
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] = {22, 24, 26, 28};
byte pin_column[COLUMN_NUM] = {36, 38, 40, 42};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*
Functions prototype
*/
int int_prompt(String text, int default_value, char break_key);
bool key_is_number(char key);
/*
Initial program
*/
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
Serial.println();
pinMode(PIN1, OUTPUT);
pinMode(PIN2, OUTPUT);
}
/*
Run program
*/
int speed = 0;
int degree = 0;
int dir = 0;
/*void lamp(int pin){
int shomaresh = 0;
while(shomaresh < 5){
digitalWrite(pin, HIGH);
}
}
*/
void loop() {
if (speed && degree) {
Serial.println("config stepper");
stepper.setSpeed(speed);
lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("speed=");
//lcd.print(speed);
//lcd.setCursor(0, 1);
//lcd.print("degree=");
//lcd.print(degree);
char key;
int step_count = STEPS * 1000 * degree / 360000;
Serial.print("step count: ");
Serial.println(step_count);
Serial.println("start stepper");
while ((key = keypad.getKey()) != '*' && step_count > 0) {
stepper.step(dir ? 1 : -1);
step_count--;
// lcd.clear();
if (key = '#') {
lcd.setCursor(0, 0);
lcd.print("reley=");
digitalWrite(PIN1, HIGH);
digitalWrite(PIN2, HIGH);
}
if (key = '*') {
lcd.setCursor(0, 0);
lcd.print("reley=");
digitalWrite(PIN1, LOW);
digitalWrite(PIN2, LOW);
}
}
}
Serial.println("get inputs");
speed = int_prompt("enter speed", speed, 'C');
Serial.print("speed: ");
Serial.println(speed);
dir = int_prompt("enter direction", dir, 'C');
Serial.print("direction: ");
Serial.println(dir);
degree = int_prompt("enter degree", degree, '#');
Serial.print("degree: ");
Serial.println(degree);
}
/*
Print a question on LCD and get input from keypad
and return result as number.
*/
int int_prompt(String text, int default_value, char break_key = 'c') {
Serial.print("get input (");
Serial.print(text);
Serial.print("): ");
text.concat(": ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(text.c_str());
String input;
// if (default_value) {
// input.concat(default_value);
// }
char key;
while ((key = keypad.getKey()) != break_key) {
if (key) {
Serial.print(key);
}
if (key_is_number(key)) {
input.concat(key);
lcd.setCursor(0, 1);
lcd.print(input.c_str());
} else if (key == 'B') {
input.remove(input.length() - 1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(text.c_str());
lcd.setCursor(0, 1);
lcd.print(input.c_str());
}
}
Serial.println();
return input.toInt();
}
/*
Check pressed key of keypad is number or not.
*/
bool key_is_number(char key) {
int number = key - 48;
bool is_number = number >= 0 && number <= 9;
return is_number;
}