#include <LiquidCrystal.h>
const int value_max_number=10;
/* Display */
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int value_select,value_digit_select=1;
int key_repeat_delay=200;
int value_int[value_max_number];
char *value_name[value_max_number]={"1.Up stroke","2.Down stroke","3.Up fwd speed","4.Up fwd pos","5.Up back speed","6.Up back pos","7.Down fwd speed","8.Down fwd pos","9.Down back speed","10.Down back pos"};
bool debounce=true;
bool key_up, key_down, key_left, key_right,values_edit;
bool refresh;
unsigned long preset_millis,last_millis; //it must be long to receive the output of millis()
void setup() {
//Serial.begin(115200);
lcd.begin(16, 2);
lcd.clear();
lcd.noCursor();
//lcd.setCursor(1, 0);
//pinMode(A0,INPUT);
//pinMode(A1,INPUT);
//pinMode(A2,INPUT);
//pinMode(A3,INPUT);
refresh=true;
value_select=0;
lcd.setCursor(0, 0);
lcd.print("Skoufias Konstantinos");
delay(500);
lcd.setCursor(0, 1);
lcd.print("stepper controller v0.8");
delay(500);
}
void screen_refresh() {
if(value_select<0) value_select=0;
if(value_select>value_max_number) value_select=value_max_number;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(value_name[value_select]);
lcd.setCursor(5, 1);
//lcd.print(key_repeat_delay); //for debuging
if(values_edit==true) lcd.print(">"); else lcd.print(" ");
lcd.print(value_int[value_select]);
if(values_edit==true)
refresh=false;
}
void key_pressed() {
int analog_key_pressed;
key_down=LOW;
key_up=LOW;
key_left=LOW;
key_right=LOW;
analog_key_pressed = analogRead(0);
lcd.setCursor(0, 0);
lcd.print (analog_key_pressed);
if (analog_key_pressed<60) { //Right
key_right=HIGH;
}
else if (analog_key_pressed<200) { //Up
key_up=HIGH;
}
else if (analog_key_pressed<400){ //Down
key_down=HIGH;
}
else if (analog_key_pressed<600){ //Left
key_left=HIGH;
}
//else if (analog_key_pressed < 800){ //Select
// LCD.print ("Select");
//}
}
void loop() {
if (refresh==true) screen_refresh();
refresh=false;
preset_millis=millis();
key_pressed();
/*
key_down=digitalRead(A1);
key_up=digitalRead(A2);
key_left=digitalRead(A3);
key_right=digitalRead(A0); */
if (key_up==HIGH && debounce==false) {
if (values_edit==true) {
value_int[value_select]++;
debounce=true;
//value_int[3]=key_repeat_delay;
key_repeat_delay-=6;
if (key_repeat_delay<0) key_repeat_delay=0;
last_millis=preset_millis;
refresh=true;
}
if (values_edit==false) {
value_select++;
if(value_select>value_max_number) value_select=0;
if(value_select<0) value_select=value_max_number;
debounce=true;
last_millis=preset_millis;
refresh=true;
}
}
if (key_down==HIGH && debounce==false) {
if (values_edit==true) {
value_int[value_select]--;
debounce=true;
//value_int[3]=key_repeat_delay;
key_repeat_delay-=6;
if (key_repeat_delay<0) key_repeat_delay=0;
last_millis=preset_millis;
refresh=true;
}
if (values_edit==false) {
value_select--;
if(value_select>value_max_number) value_select=0;
if(value_select<0) value_select=value_max_number;
debounce=true;
last_millis=preset_millis;
refresh=true;
}
}
if (key_right==HIGH && debounce==false && values_edit==true) {
value_digit_select++;
if(value_digit_select>10) value_digit_select=0;
if(value_digit_select<1) value_digit_select=10;
value_int[value_select]=value_int[value_select]+(10*value_digit_select);
debounce=true;
last_millis=preset_millis;
refresh=true;
}
if (key_left==HIGH && debounce==false) {
if (values_edit==true) {
values_edit=false;
}
else {
values_edit=true;
}
debounce=true;
last_millis=preset_millis;
refresh=true;
}
if ((key_down==LOW && key_up==LOW && key_left==LOW && key_right==LOW) || (debounce==true))
{
if (debounce==false) key_repeat_delay=200;
if (preset_millis-last_millis>key_repeat_delay) {
debounce=false;
}
}
}