#include <Keypad.h>
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
//LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables to hold entered number on Keypad
volatile int firstnumber=99; // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;
// Variables to hold Distance and CurrentPosition
int keyfullnumber=0; // used to store the final calculated distance value
int currentposition=0; // Used for display
int steppermotor = 12;
int botaozero = 11;
int botaoend = 10;
int valbotaozero = 0;
int valbotaoend = 0;
int state=1;
// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Keypad Library definition
// AccelStepper Setup
AccelStepper stepper(1, A0, A1); // 1 = Easy Driver interface
// Arduino A0 connected to STEP pin of Easy Driver
// Arduino A1 connected to DIR pin of Easy Driver
void setup() {
pinMode(steppermotor , OUTPUT);
pinMode(botaozero , INPUT);
//Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("Guilhotina A3");
lcd.setCursor(4, 1);
lcd.print("Bem Vindo");
delay(2000);
digitalWrite(steppermotor, HIGH);
lcd.clear();
// AccelStepper speed and acceleration setup
stepper.setMaxSpeed(1500); // Not to fast or you will have missed steps
stepper.setAcceleration(1500); // Same here
lcd.setCursor(0, 0);
lcd.print("Set> mm");
lcd.setCursor(0, 1);
lcd.print("Posicao> mm");
lcd.setCursor(6, 0);
}
void loop() {
//Leitura Botoes Matriz 4x4
char keypressed = keypad.getKey(); // Get value of keypad button if pressed
if (keypressed != NO_KEY){ // If keypad button pressed check which key it was
switch (keypressed) {
case '1':
checknumber(1);
break;
case '2':
checknumber(2);
break;
case '3':
checknumber(3);
break;
case '4':
checknumber(4);
break;
case '5':
checknumber(5);
break;
case '6':
checknumber(6);
break;
case '7':
checknumber(7);
break;
case '8':
checknumber(8);
break;
case '9':
checknumber(9);
break;
case '0':
checknumber(0);
break;
case '*':
deletenumber();
break;
case '#':
calculatedistance();
break;
case 'A':
botaoa();
break;
case 'B':
botaob();
break;
case 'C':
botaoc();
break;
case 'D':
botaod();
break;
}
}
//lcd.setCursor(10, 0);
//lcd.print(cont);
botzero();
botend();
switch(state){
case 0: ; // idle state
break;
case 1: runStepper();
break;
}
delay(5);
}
void checknumber(int x){
if (firstnumber == 99) { // Check if this is the first number entered
firstnumber=x;
String displayvalue = String(firstnumber); // Transform int to a string for display
drawnokiascreen(displayvalue); // Redraw Nokia lcd
} else {
if (secondnumber == 99) { // Check if it's the second number entered
secondnumber=x;
String displayvalue = (String(firstnumber) + String(secondnumber));
drawnokiascreen(displayvalue);
} else { // It must be the 3rd number entered
thirdnumber=x;
String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
drawnokiascreen(displayvalue);
}
}
}
void deletenumber() { // Used to backspace entered numbers
if (thirdnumber !=99) {
String displayvalue = (String(firstnumber) + String(secondnumber));
drawnokiascreen(displayvalue);
thirdnumber=99;
}
else {
if (secondnumber !=99) {
String displayvalue = String(firstnumber);
drawnokiascreen(displayvalue);
secondnumber=99;
}
else {
if (firstnumber !=99) {
String displayvalue = "";
drawnokiascreen(displayvalue);
firstnumber=99;
}
}
}
}
void calculatedistance() { // Used to create a full number from entered numbers
if (thirdnumber == 99 && secondnumber == 99 && firstnumber != 99) {
keyfullnumber=firstnumber;
movestepper(keyfullnumber);
}
if (secondnumber != 99 && thirdnumber == 99) {
keyfullnumber=(firstnumber*10)+secondnumber;
movestepper(keyfullnumber);
}
if (thirdnumber != 99) {
keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
movestepper(keyfullnumber);
}
resetnumbers(); // Reset numbers to get ready for new entry
}
void movestepper(int z) { // Move the stepper
int calculatedmove=(z*50); // Calculate number of steps needed in mm
stepper.runToNewPosition(calculatedmove);
currentposition = int(z);
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(currentposition);
lcd.setCursor(5, 0);
}
void resetnumbers() { // Reset numbers for next entry
firstnumber=99;
secondnumber=99;
thirdnumber=99;
}
void drawnokiascreen(String y) {
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(5, 0);
lcd.print(y);
lcd.setCursor(10, 1);
lcd.print(currentposition);
lcd.setCursor(5, 0);
}
void botaoa() {
int a=0;
a = currentposition + 10;
movestepper(a);
}
void botaob() {
int a=0;
a = currentposition - 10;
movestepper(a);
}
void botaoc() {
int a=0;
a = currentposition + 1;
movestepper(a);
}
void botaod() {
int a=0;
a = currentposition - 1;
movestepper(a);
}
void botzero() {
valbotaozero = digitalRead(botaozero);
if (valbotaozero == HIGH) {
currentposition=0;
stepper.setCurrentPosition(0);
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(currentposition);
lcd.setCursor(5, 0);
//movestepper(0);
}
else {
}
}
void botend() {
}
void runStepper(){
bool b = false;
while( !b )
{
if( digitalRead(botaoend) == 1){
stepper.setCurrentPosition(0);
//stepper.setSpeed(500);
stepper.runToNewPosition(2500);
delay(2000);
//digitalWrite(enPin, LOW);
state = 0;
break;
}
stepper.setSpeed(1500);
stepper.runSpeed();
}
}