#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define clk 8
#define data 9
#define SW 10
int ready=0;
int pushed=0;
int menu=0;
int opt=1;
int last_counter = 0;
int button_state;
char dir;
char axis;
float value=0;
int counter = 0;
bool clk_State;
bool Last_State;
bool dt_State;
uint8_t arrow[8] = {0x00,0x04,0x06,0x1f,0x06,0x04,0x00};
uint8_t retarrow[8] = {0x01,0x01,0x05,0x09,0x1f,0x08,0x04};
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
pinMode (clk,INPUT);
pinMode (data,INPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin (115200); //Start serial com so we could print the value on the serial monitor
// Reads the initial state of the clock pin
PCICR |= (1 << PCIE0); //enable PCMSK0 scan
PCMSK0 |= (1 << PCINT0); //Set pin D8 trigger an interrupt on state change.
PCMSK0 |= (1 << PCINT1); //Set pin D9 trigger an interrupt on state change.
DDRB &= B11111100; //8, 9 as input for the encoder clock and data pins
Last_State = (PINB & B00000001); //pin 8 state (clock pin)?
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.createChar(0, arrow); //create arrow
lcd.home();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Control"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Setting"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0); //arrow
}
void loop()
{
if((last_counter > counter) || (last_counter < counter) || pushed) //Only print on the LCD when a step is detected or the button is pushed.
{
L:if(menu==0){ // control + setting + SD Card menu
if(0 <= counter && counter < 3){ //arrow on control
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Control"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Setting");
lcd.setCursor(0,0);
lcd.write(0); //arrow
opt=1;
}
L2:if(3 < counter && counter < 6){ //arrow on setting
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Control"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Setting");
lcd.setCursor(0,1);
lcd.write(0); //arrow
opt=2;
}
if(6 < counter && counter < 9){ //arrow on SD CARD MENU
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("SD card menu"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0); //arrow
opt=3;
}
}
M: if(menu==1){ //Back + move axis
if(0 <= counter && counter < 3){ //arrow on BACK
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Move axis");
lcd.setCursor(0,0);
lcd.write(0); //arrow
opt=1;
pushed=0;
delay(500);
}
if(3 < counter && counter < 6){ //arrow on MOVE AXIS
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Move axis");
lcd.setCursor(0,1);
lcd.write(0); //arrow
opt=2;
pushed=0;
delay(500);
}
}
if(menu==2){ //Back + Baud rate
if(0 <= counter && counter < 3){ //arrow on BACK
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Baud Rate");
lcd.setCursor(0,0);
lcd.write(0); //arrow
pushed=0;
opt=1;
delay(500);
}
if(3 < counter && counter < 6){ ////arrow on BAUD RATE
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1);
lcd.print("Baud Rate");
lcd.setCursor(0,1);
lcd.write(0); //arrow
pushed=0;
opt=2;
delay(500);
}
}
if(menu==3){ //Back
if(0 <= counter && counter < 3){ //arrow on BACK
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0); //arrow
pushed=0;
opt=1;
delay(500);
}
}
K: if(menu==4){ //BACK + MOVE X AXIS + MOVE Y AXIS + MOVE Z AXIS
if(0 <= counter && counter < 3){ // ARROW ON BACK
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move X axis"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0; //arrow
opt=1;
delay(500);
}
if(3 < counter && counter < 6){ // ARROW ON MOVE X AXIS
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move X axis"); // Print a message to the LCD.
lcd.setCursor(0,1);
lcd.write(0);
pushed=0;
opt=2;
delay(500);
}
if(6 <= counter && counter < 9){ // ARROW ON MOVE Y AXIS
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Move Y axis"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move Z axis"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0; //arrow
opt=3;
delay(500);
}
if(9 < counter && counter < 12){ //ARROW ON MOVE Z AXIS
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Move Y axis"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move Z axis"); // Print a message to the LCD.
lcd.setCursor(0,1);
lcd.write(0);
pushed=0;
opt=4;
delay(500);
}
}
N: if(menu==5){ //BACK + MOVE 100 MM + MOVE 10 MM + MOVE 0.1 MM
if(0 <= counter && counter < 3){ //ARROW ON BACK
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print(" +Direction"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0; //arrow
opt=1;
delay(500);
}
if(3 < counter && counter < 6){ //ARROW ON +DIRECTION
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print(" +Direction"); // Print a message to the LCD.
lcd.setCursor(0,1);
lcd.write(0);
pushed=0;
opt=2;
delay(500);
}
if(6 <= counter && counter < 9){ //ARROW ON -DIRECTION
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print(" -Direction"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0;
opt=3;
delay(500);
}
}
if(menu==6){ //BACK + MOVE 100 MM + MOVE 10 MM + MOVE 0.1 MM
if(0 <= counter && counter < 3){
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move 100 mm"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0;
opt=1;
delay(500);
}
if(3 < counter && counter < 6){
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Back"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move 100 mm"); // Print a message to the LCD.
lcd.setCursor(0,1);
lcd.write(0);
pushed=0;
opt=2;
delay(500);
}
if(6 <= counter && counter < 9){
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Move 10 mm"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move 1 mm"); // Print a message to the LCD.
lcd.setCursor(0,0);
lcd.write(0);
pushed=0; //arrow
opt=3;
delay(500);
}
if(9 < counter && counter < 12){
lcd.clear();
lcd.setCursor(1,0); // set cursor initial value
lcd.print("Move 10 mm"); // Print a message to the LCD.
lcd.setCursor(1,1); // set cursor initial value
lcd.print("Move 1 mm"); // Print a message to the LCD.
lcd.setCursor(0,1);
lcd.write(0);
pushed=0;
opt=4;
delay(500);
}
}
}
last_counter= counter;
if(digitalRead(SW)==0){
if(menu==0){
if(opt==1){ //select control
menu=1;
counter=0;
opt=0;
pushed=1;
}
if(opt==2){ //selects setting
menu=2;
counter=0;
opt=0;
pushed=1;
}
if(opt==3){ //selects SD card menu
menu=3;
counter=0;
opt=0;
pushed=1;
}
}
if(menu==1){
if(opt==1){ //selects control---->back
menu=0;
counter=0;
opt=0;
pushed=0;
delay(200);
goto L;
}
if(opt==2){ //selects control--->moving axis
counter=0;
opt=0;
pushed=1;
menu=4;
delay(200);
}
}
if(menu==2){
if(opt==1){ //selects setting--->back
menu=0;
counter=4; // it is set to 4 for getting the arrow at settings
opt=0;
pushed=0;
delay(200);
goto L;
}
if(opt==2){ //selects SETTING--->baudrate--->115200
lcd.clear();
lcd.setCursor(1,0); // set cursor initial valu
lcd.print("115200");
counter=0;
opt=0;
pushed=1;
delay(2000);
}
}
if(menu==3){
if(opt==1){ //selects SD Card menu--->back
menu=0;
counter=7; // it is set to 7 for getting the arrow at SD CARD menu
opt=0;
pushed=0;
delay(200);
goto L;
}
}
if(menu==4){
if(opt==1){ //selects control---->moving axis--->back
menu=1;
counter=4;
opt=0;
pushed=0;
delay(200);
goto M;
}
if(opt==2){ //selects control---->moving axis--->X axis
menu=5;
counter=0;
opt=0;
pushed=1;
axis='X';
delay(200);
}
if(opt==3){ //selects control---->moving axis--->Y axis
menu=5;
counter=0;
opt=0;
pushed=1;
axis='Y';
delay(200);
goto L;
}
if(opt==4){ //selects control---->moving axis--->Z axis
menu=5;
counter=0;
opt=0;
pushed=1;
axis='Z';
delay(200);
}
}
if(menu==5){
if(opt==1){ //selects control---->moving axis--->selects X,Y,Z---->BACK
menu=4;
counter=0;
opt=0;
pushed=0;
delay(200);
goto K;
}
if(opt==2){ //selects control---->moving axis--->selects X,Y,Z---->+DIRECTION
menu=6;
counter=0;
opt=0;
pushed=1;
dir='+';
delay(200);
}
if(opt==3){ //selects control---->moving axis--->selects X,Y,Z---->-DIRECTION
menu=6;
counter=0;
opt=0;
pushed=1;
dir='-';
delay(200);
}
}
if(menu==6){
if(opt==1){ //selects control---->moving axis--->selects X,Y,Z---->selects +,-DIRECTION--->back
menu=5;
counter=0;
opt=0;
pushed=0;
delay(200);
goto N;
}
if(opt==2){ //selects control---->moving axis--->selects X,Y,Z---->selects +,-DIRECTION--->100mm
// while (digitalRead(SW)==0){
value=20;
if(axis=='X'){
if(dir=='+'){
Serial.println("G21G91X+20F300"); //gcode to move along positive x direction for 100mm with feed rate of 300mm/min.
}
if(dir=='-'){
Serial.println("G21G91X-20F300");
}
}
if(axis=='Y'){
if(dir=='+'){
Serial.println("G21G91Y+20F300");
}
if(dir=='-'){
Serial.println("G21G91Y-20F300");
}
}
if(axis=='Z'){
if(dir=='+'){
Serial.println("G21G91Z+20F300");
}
if(dir=='-'){
Serial.println("G21G91Z-20F300");
}
}
// }
counter=4;
opt=0;
pushed=1;
delay(3500);
}
if(opt==3){ //selects control---->moving axis--->selects X,Y,Z---->selects +,-DIRECTION--->10mm
// while (digitalRead(SW)==0){
value=2;
if(axis=='X'){
if(dir=='+'){
Serial.println("G21G91X+2F300"); //gcode to move along positive X direction for 10mm with feed rate of 300mm/min.
}
if(dir=='-'){
Serial.println("G21G91X-2F300");
}
}
if(axis=='Y'){
if(dir=='+'){
Serial.println("G21G91Y+2F300");
}
if(dir=='-'){
Serial.println("G21G91Y-2F300");
}
}
if(axis=='Z'){
if(dir=='+'){
Serial.println("G21G91Z+2F300");
}
if(dir=='-'){
Serial.println("G21G91Z-2F300");
}
}
// }
counter=7;
opt=0;
pushed=1;
delay(20);
}
if(opt==4){ //selects control---->moving axis--->selects X,Y,Z---->selects +,-DIRECTION--->1mm
// while (digitalRead(SW)==0){
value=0.2;
if(axis=='X'){
if(dir=='+'){
Serial.println("G21G91X+0.2F300"); //gcode to move along positive x direction for 1mm with feed rate of 300mm/min.
}
if(dir=='-'){
Serial.println("G21G91X-0.2F300");
}
}
if(axis=='Y'){
if(dir=='+'){
Serial.println("G21G91Y+0.2F300");
}
if(dir=='-'){
Serial.println("G21G91Y-0.2F300");
}
}
if(axis=='Z'){
if(dir=='+'){
Serial.println("G21G91Z+0.2F300");
}
if(dir=='-'){
Serial.println("G21G91Z-0.2F300");
}
}
// }
counter=10;
opt=0;
pushed=1;
}
}
if(counter > 12)
{
counter=0;
}
if(counter < 0)
{
counter=12;
}
}
}
//Interruption vector
ISR(PCINT0_vect){
clk_State = (PINB & B00000001); //pin 8 state, clock pin?
dt_State = (PINB & B00000010);
if (clk_State != Last_State){
// If the data state is different to the clock state, that means the encoder is rotating clockwise
if (dt_State != clk_State) {
counter ++;
}
else {
counter --;
}
}
Last_State = clk_State; // Updates the previous state of the data with the current state
}