#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Joystick.h>
const int joyX = A3;
const int joyY = A7;
const int joyButton = A6;
const int ylimitPin = 12;
const int zlimitPin = 13;
const byte ROWS = 5;
const byte COLS = 3;
const int listSize = 10; // 陣列最大大小,適用於模式D
int modeChange = 0;
int numlocation = 0;
int button = 0;
int i = 1; //校正模式臨時用
long xmoveSteps = 0;
long ymoveSteps = 0;
const int enablePin = 8;
const int xdirPin = 5;
const int xstepPin = 2;
const int ydirPin = 6;
const int ystepPin = 3;
const int zdirPin = 7;
const int zstepPin = 4;
int Anum_01 = 0;
int Anum_02 = 0;
int Dnum_01 = 0;
int Dnum_02 = 0;
int num = 1;
int x_axis[listSize];
int y_axis[listSize];
char xsymbol = '.';
int xnum_01 = 0;
int xnum_02 = 0;
int xnum_03 = 0;
int xnum_04 = 0;
char ysymbol = '.';
int ynum_01 = 0;
int ynum_02 = 0;
int ynum_03 = 0;
int ynum_04 = 0;
bool A_Correction = false;
bool B_Manual = false;
bool C_Semi_automatic = false; // mode_C啟用變數
bool D_Automatic = false;
bool modeReturn = false; // 重複使用,返回變數
bool modeStart = false;
bool D_modeStart = false;
char keys[ROWS][COLS] = {
{'s', ' ', ' '}, // S: STOP暫停/開始
{'<', ' ', ' '},
{'>', ' ', ' '},
{' ', 'o', ' '}, // o: on/off總電源
{' ', ' ', 'm'} // mode
};
byte rowPins[ROWS] = {A12, A13, A14, A8, A10};
byte colPins[COLS] = {A15, A9, A11};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Joystick myJoystick(joyX, joyY, joyButton);
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(xdirPin, OUTPUT);
pinMode(xstepPin, OUTPUT);
pinMode(ydirPin, OUTPUT);
pinMode(ystepPin, OUTPUT);
pinMode(zdirPin, OUTPUT);
pinMode(zstepPin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(52, OUTPUT);
pinMode(51, OUTPUT);
pinMode(50, OUTPUT);
pinMode(A4, INPUT);
pinMode(ylimitPin, INPUT);
pinMode(zlimitPin, INPUT);
digitalWrite(17, LOW); // RGB: 藍
digitalWrite(18, LOW); // RGB: 綠
digitalWrite(19, HIGH); // RGB: 紅(常開)
digitalWrite(enablePin, LOW);
lcd.setCursor(0, 0);
lcd.print("mode_A");
}
void loop() {
// Arduino窗口讀取
if (Serial.available() > 0) {
// 模式讀取
char modeChoose = Serial.read();
mode_online();
}
// 實體按鍵讀取
char keys = keypad.getKey();
if (keys != NO_KEY) {
mode_Offline(keys);
}
}
// 模式(線上)
void mode_online() {
}
// 馬達啟動,通用副程式,以判斷模式為基礎
void motor_ON() {
// mode_A,校正模式...
while (A_Correction == true) {
char keys = keypad.getKey();
// 校正程式(校正次數Anum_01,已校正次數累計顯示Anum_02,當前狀態(燈號、訊息))...
while (i <= Anum_01) {
// 當前狀態顯示
digitalWrite(A3, HIGH);
digitalWrite(A5, LOW);
lcd.setCursor(0, 2);
lcd.print("state: moving ");
lcd.print(i);
// 馬達向前移動(Y、Z)...
// 碰觸到限位開關後返回...
Serial.println(ylimitPin);
Serial.println(zlimitPin);
delay(500);
i++;
}
// 儲存數值並顯示
digitalWrite(A3, LOW);
digitalWrite(A5, HIGH);
lcd.setCursor(0, 1);
lcd.print("Current total: ");
lcd.print(Anum_02);
lcd.setCursor(0, 2);
lcd.print("state: finish ");
// 判斷是否按下'm'
if (keys == 'm') {
lcd.setCursor(0, 0);
lcd.print("mode_A: return");
i = 0;
A_Correction = false;
D_Automatic = false;
modeStart = false;
break;
}
// fix
if (keys == 's') {
i = 0;
A_Correction = false;
// 原因不明
D_Automatic = false;
modeStart = false;
//mode_A();
break;
}
}
// mode_B,手動(搖桿)模式
while (B_Manual == true) {
/*// 狀態顯示(移動中(綠),print: move)
digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
lcd.setCursor(8, 0);
lcd.print("move ");*/
// 讀取搖桿數值
int xValue = analogRead(joyX);
int yValue = analogRead(joyY);
/*lcd.setCursor(3, 2);
lcd.print("X: ");
lcd.print(xValue);
lcd.setCursor(11, 2);
lcd.print("Y: ");
lcd.print(yValue);
delay(250);
lcd.setCursor(3, 2);
lcd.print("X: ");
lcd.setCursor(11, 2);
lcd.print("Y: ");*/
// 判斷搖桿幅度。如果搖桿幅度過小,跳出副程式。
if (400 < xValue && xValue < 700 && 400 < yValue && yValue < 700) {
Serial.print("YG_P");
digitalWrite(A4, LOW);
digitalWrite(A5, HIGH);
lcd.setCursor(8, 0);
lcd.print("start");
xsymbol = '.';
ysymbol = '.';
B_Manual = false;
break;
}
// 馬達運作
if (xsymbol == '+') {
// X軸馬達正轉...
Serial.println("X軸+");
digitalWrite(xdirPin, HIGH);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
} else if (xsymbol == '-') {
// X軸馬達反轉...
Serial.println("X軸-");
digitalWrite(xdirPin, LOW);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
} else if (ysymbol == '+') {
// Y軸馬達正轉...
Serial.println("Y軸+");
digitalWrite(ydirPin, HIGH);
digitalWrite(zdirPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
} else if (ysymbol == '-') {
// Y軸馬達反轉...
Serial.println("Y軸-");
digitalWrite(ydirPin, LOW);
digitalWrite(zdirPin, LOW);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
} else if (xsymbol == '@') {
// X、Y軸馬達正、反轉...
Serial.println("X、Y軸馬達正、反轉");
digitalWrite(xdirPin, HIGH);
digitalWrite(ydirPin, LOW);
digitalWrite(zdirPin, LOW);
digitalWrite(xstepPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
} else if (ysymbol == '#') {
// X、Y軸馬達反轉...
Serial.println("X、Y軸馬達反轉");
digitalWrite(xdirPin, LOW);
digitalWrite(ydirPin, LOW);
digitalWrite(zdirPin, LOW);
digitalWrite(xstepPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
} else if (xsymbol == '$') {
// X、Y軸馬達正轉...
Serial.println("X、Y軸馬達正轉");
digitalWrite(xdirPin, HIGH);
digitalWrite(ydirPin, HIGH);
digitalWrite(zdirPin, HIGH);
digitalWrite(xstepPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
} else if (ysymbol == '%') {
// X、Y軸馬達反、正轉...
Serial.println("X、Y軸馬達反、正轉");
digitalWrite(xdirPin, LOW);
digitalWrite(ydirPin, HIGH);
digitalWrite(zdirPin, HIGH);
digitalWrite(xstepPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
}
}
// mode_C,半自動(數值)模式
while (C_Semi_automatic == true) {
char keys = keypad.getKey();
// 狀態顯示(移動中(綠),print: move)
/*digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
lcd.setCursor(8, 0);
lcd.print("start ");*/
// 馬達根據數值運作(xmoveSteps, ymoveSteps)...
while (xmoveSteps != 0 || ymoveSteps != 0) {
if (xmoveSteps > 0) {
digitalWrite(xdirPin, HIGH);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
xmoveSteps--;
}
if (ymoveSteps > 0) {
digitalWrite(ydirPin, HIGH);
digitalWrite(zdirPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
ymoveSteps--;
}
if (xmoveSteps < 0) {
digitalWrite(xdirPin, LOW);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
xmoveSteps++;
}
if (ymoveSteps < 0) {
digitalWrite(ydirPin, LOW);
digitalWrite(zdirPin, LOW);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
ymoveSteps++;
}
//Serial.println(xmoveSteps);
//Serial.println(ymoveSteps);
delay(1);
}
// 按下'o'暫停
if (keys == 'o') {
modeStart = false;
lcd.setCursor(8, 0);
lcd.print("continue");
digitalWrite(A5, HIGH);
digitalWrite(A4, LOW);
break;
}
}
// mode_D,全自動模式
while (D_Automatic == true) {
char keys = keypad.getKey();
lcd.setCursor(8, 0);
lcd.print("press 's' ");
if (keys == 's' && i <= Dnum_01) {
lcd.setCursor(8, 0);
lcd.print("moveing ");
/*Serial.print("Point ");
Serial.print(i);
Serial.print(": (");
Serial.print(x_axis[i]);
Serial.print(", ");
Serial.print(y_axis[i]);
Serial.println(")");
lcd.setCursor(0, 3);*/
// 馬達根據數值運作(xmoveSteps, ymoveSteps)...
while (x_axis[i] != 0 || y_axis[i] != 0) {
if (x_axis[i] > 0) {
digitalWrite(xdirPin, HIGH);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
x_axis[i]--;
}
if (y_axis[i] > 0) {
digitalWrite(ydirPin, HIGH);
digitalWrite(zdirPin, HIGH);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
y_axis[i]--;
}
if (x_axis[i] < 0) {
digitalWrite(xdirPin, LOW);
digitalWrite(xstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(xstepPin, LOW);
delayMicroseconds(10);
x_axis[i]++;
}
if (y_axis[i] < 0) {
digitalWrite(ydirPin, LOW);
digitalWrite(zdirPin, LOW);
digitalWrite(ystepPin, HIGH);
digitalWrite(zstepPin, HIGH);
delayMicroseconds(10);
digitalWrite(ystepPin, LOW);
digitalWrite(zstepPin, LOW);
delayMicroseconds(10);
y_axis[i]++;
}
//Serial.println(xmoveSteps);
//Serial.println(ymoveSteps);
delay(1);
}
i++;
}
else if (i> Dnum_01)
break;
}
}
// 模式C、D步數換算
void mathSteps(long & moveSteps, char symbol, int num_01, int num_02, int num_03, int num_04, int rowlocation, int collocation, char axis, int xy_axis[], int &num) {
// 僅在模式C下運作
if (C_Semi_automatic == true) {
// axis steps
lcd.setCursor(7, collocation);
lcd.print(" ");
Serial.print(symbol);
float numDistance = (10 * num_01) + (1 * num_02) + (0.1 * num_03) + (0.01 * num_04);
if (symbol == '-') {
numDistance = 0 - numDistance;
}
Serial.println(numDistance);
moveSteps = static_cast<long>((static_cast<double>(numDistance) * 3200) / 0.8);
if (moveSteps < 200 && num_04 == 5 && symbol == '+')
moveSteps += 1;
else if (moveSteps < 200 && num_04 == 5 && symbol == '-')
moveSteps -= 1;
Serial.println(moveSteps);
lcd.setCursor(rowlocation, collocation);
lcd.print(axis);
lcd.print("Step: ");
lcd.print(moveSteps);
}
// 僅在模式D下運作
if (D_Automatic == true) {
// 進行運算、儲存...
float numDistance = (10 * num_01) + (1 * num_02) + (0.1 * num_03) + (0.01 * num_04);
if (symbol == '-') {
numDistance = 0 - numDistance;
}
moveSteps = static_cast<long>((static_cast<double>(numDistance) * 3200) / 0.8);
if (moveSteps < 200 && num_04 == 5 && symbol == '+')
moveSteps += 1;
else if (moveSteps < 200 && num_04 == 5 && symbol == '-')
moveSteps -= 1;
Serial.println(moveSteps);
xy_axis[num] = moveSteps;
}
}
// 數字位置識別與閃爍(num: 需要變更的數字, flashingLocation: 閃爍位置, location: 數字位置)
void numLocationRecognition(int &num, int COL_flashingLocation, int ROW_flashingLocation, int location) {
while (true) {
// 引用副程式,num: 該位置數值、flashingLocation: 閃爍位置
numChanges(num, COL_flashingLocation, ROW_flashingLocation);
// 按下"s"取消數值變更後跳出
if (numlocation != location)
break;
// 按下"m"後確認返回
if (modeReturn == true) {
modeReturn = false;
A_Correction = false;
C_Semi_automatic = false;
D_Automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
// 在模式A中按下'o'啟動馬達,校正模式
if (A_Correction == true && modeStart == true && D_Automatic == false) {
modeStart = false;
Anum_02 += Anum_01;
motor_ON();
break;
}
// 在模式C中按下'o'啟動馬達,motor_ON副程式
if (C_Semi_automatic == true && modeStart == true) {
modeStart = false;
// 呼叫步數計算副程式
mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x', x_axis, Dnum_02);
mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y', y_axis, Dnum_02);
motor_ON();
break;
}
// 在模式D中按下'o'進入數值選擇...
if (D_Automatic == true && modeStart == true) {
modeStart = false;
lcd.setCursor(0, 2);
lcd.print("X:");
lcd.print(xsymbol);
lcd.setCursor(3, 2);
lcd.print(xnum_01);
lcd.print(xnum_02);
lcd.print(".");
lcd.print(xnum_03);
lcd.print(xnum_04);
lcd.setCursor(9, 2);
lcd.print("Y:");
lcd.print(ysymbol);
lcd.setCursor(12, 2);
lcd.print(ynum_01);
lcd.print(ynum_02);
lcd.print(".");
lcd.print(ynum_03);
lcd.print(ynum_04);
lcd.setCursor(17, 2);
lcd.print("(mm");
// 若Dnum_02小於Dnum_01則+1,並儲存參數
if (Dnum_02 <= Dnum_01) {
lcd.setCursor(17, 1);
lcd.print("N:");
lcd.print(Dnum_02);
// 歸零數值、位置重置
/*numlocation = 0;
xsymbol = '+', ysymbol = '+';
xnum_01 = 0, xnum_02 = 0, xnum_03 = 0, xnum_04 = 0;
ynum_01 = 0, ynum_02 = 0, ynum_03 = 0, ynum_04 = 0;*/
// 引用換算副程式、儲存數值...
mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x', x_axis, Dnum_02);
mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y', y_axis, Dnum_02);
Dnum_02++;
} else if (Dnum_02 > Dnum_01) {
// 跳往馬達通用副程式...
A_Correction = false;
motor_ON();
lcd.setCursor(0, 0);
lcd.print("mode_D: finish ");
lcd.setCursor(0, 2);
lcd.print("press return... ");
Dnum_01 = 0;
Dnum_02 = 0;
break;
}
// 這邊跳往數值選擇
A_Correction = false;
D_numChoose();
break;
}
// 預設數值閃爍
lcd.setCursor(COL_flashingLocation, ROW_flashingLocation);
lcd.print(" ");
delay(150);
lcd.setCursor(COL_flashingLocation, ROW_flashingLocation);
lcd.print(num);
delay(150);
}
}
// 手動模式(按鍵)數值選擇
void numChanges(int &num, int COL_location, int ROW_location) {
char keys = keypad.getKey();
Serial.print(keys);
if (keys == '<') {
// 僅在模式A、D作用
// 這邊D_Automatic卡腳了... fix
if (A_Correction == true /*|| D_Automatic == true*/)
numlocation = 0;
else
numlocation += 1;
} else if (keys == '>') {
// 僅在模式A、D作用
if (A_Correction == true /*|| D_Automatic == true*/)
numlocation = 0;
else if (numlocation > 0)
numlocation -= 1;
else
numlocation = 9;
} else if (keys == 's') {
while (true) {
char keys = keypad.getKey();
if (keys == '<') {
lcd.setCursor(COL_location, ROW_location);
if (num > 0)
num -= 1;
else
num = 9;
lcd.print(num);
delay(300);
} else if (keys == '>') {
lcd.setCursor(COL_location, ROW_location);
if (num < 9)
num += 1;
else
num = 0;
lcd.print(num);
delay(300);
} else if (keys == 's') {
break;
}
}
} else if (keys == 'm') {
modeReturn = true;
} else if (keys == 'o') {
modeStart = true;
}
return;
}
// 手動模式(按鍵)符號選擇
void symbolChanges(char &symbol, int COL_location, int ROW_location) {
char keys = keypad.getKey();
Serial.print(keys);
if (keys == '<') {
numlocation += 1;
} else if (keys == '>') {
if (numlocation > 0)
numlocation -= 1;
else
numlocation = 9;
} else if (keys == 's') {
while (true) {
char keys = keypad.getKey();
if (keys == '<') {
lcd.setCursor(COL_location, ROW_location);
if (symbol == '+')
symbol = '-';
else if (symbol == '-')
symbol = '+';
lcd.print(symbol);
delay(300);
} else if (keys == '>') {
lcd.setCursor(COL_location, ROW_location);
if (symbol == '-')
symbol = '+';
else if (symbol == '+')
symbol = '-';
lcd.print(symbol);
delay(300);
} else if (keys == 's') {
break;
}
}
} else if (keys == 'm') {
modeReturn = true;
} else if (keys == 'o') {
modeStart = true;
}
return;
}
// 數值選擇,僅在模式D下使用
void D_numChoose() {
while (true) {
char keys = keypad.getKey();
switch (keys) {
case '<':
while (D_Automatic == true) {
Serial.print(keys);
if (numlocation == 9) {
while (true) {
symbolChanges(xsymbol, 2, 2);
if (numlocation != 9)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
// 這個須修改
if (modeStart == true) {
modeStart = false;
// ??
//mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x');
//mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y');
//motor_ON();
break;
}
lcd.setCursor(2, 2);
lcd.print(" ");
delay(150);
lcd.setCursor(0, 2);
lcd.print("X:");
lcd.print(xsymbol);
delay(150);
}
} else if (numlocation == 8) {
numLocationRecognition(xnum_01, 3, 2, 8);
} else if (numlocation == 7) {
numLocationRecognition(xnum_02, 4, 2, 7);
} else if (numlocation == 6) {
numLocationRecognition(xnum_03, 6, 2, 6);
} else if (numlocation == 5) {
numLocationRecognition(xnum_04, 7, 2, 5);
}// ysymbol
else if (numlocation == 4) {
while (true) {
symbolChanges(ysymbol, 11, 2);
if (numlocation != 4)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
//mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x');
//mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y');
//motor_ON();
break;
}
lcd.setCursor(11, 2);
lcd.print(" ");
delay(150);
lcd.setCursor(9, 2);
lcd.print("Y:");
lcd.print(ysymbol);
delay(150);
}
} else if (numlocation == 3) {
numLocationRecognition(ynum_01, 12, 2, 3);
} else if (numlocation == 2) {
numLocationRecognition(ynum_02, 13, 2, 2);
} else if (numlocation == 1) {
numLocationRecognition(ynum_03, 15, 2, 1);
} else if (numlocation == 0) {
numLocationRecognition(ynum_04, 16, 2, 0);
}
// reset
else {
numlocation = 0;
}
}
break;
case '>':
while (D_Automatic == true) {
Serial.print(keys);
if (numlocation == 9) {
while (true) {
symbolChanges(xsymbol, 2, 2);
if (numlocation != 9)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
//mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x');
//mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y');
//motor_ON();
break;
}
lcd.setCursor(2, 2);
lcd.print(" ");
delay(150);
lcd.setCursor(0, 2);
lcd.print("X:");
lcd.print(xsymbol);
delay(150);
}
} else if (numlocation == 8) {
numLocationRecognition(xnum_01, 3, 2, 8);
} else if (numlocation == 7) {
numLocationRecognition(xnum_02, 4, 2, 7);
} else if (numlocation == 6) {
numLocationRecognition(xnum_03, 6, 2, 6);
} else if (numlocation == 5) {
numLocationRecognition(xnum_04, 7, 2, 5);
}// ysymbol
else if (numlocation == 4) {
while (true) {
symbolChanges(ysymbol, 11, 2);
if (numlocation != 4)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
//mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x');
//mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y');
//motor_ON();
break;
}
lcd.setCursor(11, 2);
lcd.print(" ");
delay(150);
lcd.setCursor(9, 2);
lcd.print("Y:");
lcd.print(ysymbol);
delay(150);
}
} else if (numlocation == 3) {
numLocationRecognition(ynum_01, 12, 2, 3);
} else if (numlocation == 2) {
numLocationRecognition(ynum_02, 13, 2, 2);
} else if (numlocation == 1) {
numLocationRecognition(ynum_03, 15, 2, 1);
} else if (numlocation == 0) {
numLocationRecognition(ynum_04, 16, 2, 0);
}
// reset
else {
numlocation = 0;
}
}
break;
// 按下's'直接跳出
case 's':
modeReturn = true;
break;
// 模式切換、返回
case 'm':
lcd.clear();
if (modeChange < 3) {
modeChange += 1;
lcd.setCursor(0, 0);
if (modeChange == 0)
lcd.print("mode_A");
if (modeChange == 1)
lcd.print("mode_B");
if (modeChange == 2)
lcd.print("mode_C");
if (modeChange == 3)
lcd.print("mode_D");
} else {
modeChange = 0;
lcd.setCursor(0, 0);
lcd.print("mode_A");
}
Serial.println(modeChange);
break;
}
if (modeReturn == true) {
modeReturn = false;
lcd.setCursor(8, 0);
lcd.print("press Again");
break;
}
}
}
// 模式(線下)
void mode_Offline(int keys) {
switch (keys) {
// 手動模式(數值)下數值減少,左(選到數字時後閃爍)
case '<':
// 僅在模式A下使用
while (A_Correction == true) {
// Anum_01
numLocationRecognition(Anum_01, 15, 1, 0);
break;
}
// 僅在模式C下使用
while (C_Semi_automatic == true) {
// xsymbol
if (numlocation == 9) {
while (true) {
symbolChanges(xsymbol, 2, 1);
if (numlocation != 9)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x', x_axis, Dnum_02);
mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y', y_axis, Dnum_02);
motor_ON();
break;
}
lcd.setCursor(2, 1);
lcd.print(" ");
delay(150);
lcd.setCursor(0, 1);
lcd.print("X:");
lcd.print(xsymbol);
delay(150);
}
}
// xnum_01
else if (numlocation == 8) {
numLocationRecognition(xnum_01, 3, 1, 8);
}
// xnum_02
else if (numlocation == 7) {
numLocationRecognition(xnum_02, 4, 1, 7);
}
// xnum_03
else if (numlocation == 6) {
numLocationRecognition(xnum_03, 6, 1, 6);
}
// xnum_04
else if (numlocation == 5) {
numLocationRecognition(xnum_04, 7, 1, 5);
}
// ysymbol
else if (numlocation == 4) {
while (true) {
symbolChanges(ysymbol, 11, 1);
if (numlocation != 4)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
mathSteps(xmoveSteps, xsymbol, xnum_01, xnum_02, xnum_03, xnum_04, 0, 2, 'x', x_axis, Dnum_02);
mathSteps(ymoveSteps, ysymbol, ynum_01, ynum_02, ynum_03, ynum_04, 0, 3, 'y', y_axis, Dnum_02);
motor_ON();
break;
}
lcd.setCursor(11, 1);
lcd.print(" ");
delay(150);
lcd.setCursor(9, 1);
lcd.print("Y:");
lcd.print(ysymbol);
delay(150);
}
}
// ynum_01
else if (numlocation == 3) {
numLocationRecognition(ynum_01, 12, 1, 3);
}
// ynum_02
else if (numlocation == 2) {
numLocationRecognition(ynum_02, 13, 1, 2);
}
// ynum_03
else if (numlocation == 1) {
numLocationRecognition(ynum_03, 15, 1, 1);
}
// ynum_04
else if (numlocation == 0) {
numLocationRecognition(ynum_04, 16, 1, 0);
}
// reset
else {
numlocation = 0;
}
}
// 僅在模式D下使用 fix
while (D_Automatic == true) {
A_Correction = true;
numLocationRecognition(Dnum_01, 15, 1, 0);
//A_Correction = false;
break;
}
break;
// 手動模式(數值)下數值增加,右(選到數字時後閃爍)
case '>':
// 僅在模式A下使用
while (A_Correction == true) {
// Anum_01
numLocationRecognition(Anum_01, 15, 1, 0);
}
// 僅在模式C下使用
while (C_Semi_automatic == true) {
// xsymbol
if (numlocation == 9) {
while (true) {
symbolChanges(xsymbol, 2, 1);
if (numlocation != 9)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
D_modeStart = false;
motor_ON();
break;
}
lcd.setCursor(2, 1);
lcd.print(" ");
delay(150);
lcd.setCursor(0, 1);
lcd.print("X:");
lcd.print(xsymbol);
delay(150);
}
}
// xnum_01
else if (numlocation == 8) {
numLocationRecognition(xnum_01, 3, 1, 8);
}
// xnum_02
else if (numlocation == 7) {
numLocationRecognition(xnum_02, 4, 1, 7);
}
// xnum_03
else if (numlocation == 6) {
numLocationRecognition(xnum_03, 6, 1, 6);
}
// xnum_04
else if (numlocation == 5) {
numLocationRecognition(xnum_04, 7, 1, 5);
}
// ysymbol
else if (numlocation == 4) {
while (true) {
symbolChanges(ysymbol, 11, 1);
if (numlocation != 4)
break;
if (modeReturn == true) {
modeReturn = false;
C_Semi_automatic = false;
lcd.setCursor(8, 0);
lcd.print("return");
break;
}
if (modeStart == true) {
modeStart = false;
motor_ON();
break;
}
lcd.setCursor(11, 1);
lcd.print(" ");
delay(150);
lcd.setCursor(9, 1);
lcd.print("Y:");
lcd.print(ysymbol);
delay(150);
}
}
// ynum_01
else if (numlocation == 3) {
numLocationRecognition(ynum_01, 12, 1, 3);
}
// ynum_02
else if (numlocation == 2) {
numLocationRecognition(ynum_02, 13, 1, 2);
}
// ynum_03
else if (numlocation == 1) {
numLocationRecognition(ynum_03, 15, 1, 1);
}
// ynum_04
else if (numlocation == 0) {
numLocationRecognition(ynum_04, 16, 1, 0);
}
// reset
else {
numlocation = 0;
}
}
// 僅在模式D下使用 fix
while (D_Automatic == true) {
A_Correction = true;
numLocationRecognition(Dnum_01, 15, 1, 0);
//A_Correction = false;
break;
}
break;
// 數值選擇、模式確認
case 's':
switch (modeChange) {
case 0:
Serial.println("A_02");
mode_A();
B_Manual = false;
C_Semi_automatic = false;
D_Automatic = false;
break;
case 1:
xsymbol = '.', ysymbol = '.';
mode_B();
A_Correction = false;
C_Semi_automatic = false;
D_Automatic = false;
break;
case 2:
// 數值歸零
xsymbol = '+', ysymbol = '+';
xnum_01 = 0, xnum_02 = 0, xnum_03 = 0, xnum_04 = 0;
ynum_01 = 0, ynum_02 = 0, ynum_03 = 0, ynum_04 = 0;
mode_C();
A_Correction = false;
B_Manual = false;
D_Automatic = false;
break;
case 3:
Serial.println("D");
// 數值歸零
xsymbol = '+', ysymbol = '+';
xnum_01 = 0, xnum_02 = 0, xnum_03 = 0, xnum_04 = 0;
ynum_01 = 0, ynum_02 = 0, ynum_03 = 0, ynum_04 = 0;
mode_D();
A_Correction = false;
B_Manual = false;
C_Semi_automatic = false;
break;
}
break;
// 模式切換、返回
case 'm':
lcd.clear();
if (modeChange < 3) {
modeChange += 1;
lcd.setCursor(0, 0);
if (modeChange == 0)
lcd.print("mode_A");
if (modeChange == 1)
lcd.print("mode_B");
if (modeChange == 2)
lcd.print("mode_C");
if (modeChange == 3)
lcd.print("mode_D");
} else {
modeChange = 0;
lcd.setCursor(0, 0);
lcd.print("mode_A");
}
Serial.println(modeChange);
break;
// 啟動、暫停
case 'o':
Serial.print(keys);
break;
}
}
// 校正模式(常規(紅)、碰到限位開關(藍)、移動(綠))
void mode_A() {
// LCD顯示
Anum_01 = 0;
lcd.clear();
Serial.println("# 當前為mode_A,點位校正(Correction Mode)模式!");
lcd.setCursor(0, 0);
lcd.print("mode_A: Input ");
lcd.setCursor(0, 1);
lcd.print("set frequency: ");
lcd.print(Anum_01);
// 模式A_校正模式啟用
A_Correction = true;
}
// 手動模式(常規(紅)、碰到限位開關(藍)、移動(綠))
void mode_B() {
// LCD顯示
Serial.println("# 當前為mode_B,搖桿調整(Manual Mode)模式!");
lcd.setCursor(0, 0);
lcd.print("mode_B: Input ");
while (true) {
int buttonState = digitalRead(joyButton);
char keys = keypad.getKey();
if (modeReturn == true || keys == 'm') {
lcd.clear();
lcd.setCursor(3, 3);
lcd.setCursor(0, 0);
lcd.print("mode_B: return");
modeReturn = false;
buttonState = 0;
button = 0;
break;
}
while (buttonState == 0) {
char keys = keypad.getKey();
digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
int xValue = analogRead(joyX);
int yValue = analogRead(joyY);
int buttonState = digitalRead(joyButton);
Serial.print("\tButton: ");
Serial.println(buttonState);
lcd.setCursor(6, 1);
lcd.print("Stick ON ");
lcd.setCursor(3, 2);
lcd.print("X: ");
lcd.print(xValue);
lcd.setCursor(11, 2);
lcd.print("Y: ");
lcd.print(yValue);
delay(250);
lcd.setCursor(3, 2);
lcd.print("X: ");
lcd.setCursor(11, 2);
lcd.print("Y: ");
// 馬達雙軸判斷
if (xValue < 300 && yValue < 300) {
xsymbol = '@';
B_Manual = true;
motor_ON();
} else if (xValue > 700 && yValue < 300) {
ysymbol = '#';
B_Manual = true;
motor_ON();
} else if (xValue < 300 && yValue > 700) {
xsymbol = '$';
B_Manual = true;
motor_ON();
} else if (xValue > 700 && yValue > 700) {
ysymbol = '%';
B_Manual = true;
motor_ON();
}
// 馬達單軸判斷
else if (xValue < 300) {
xsymbol = '-';
B_Manual = true;
motor_ON();
} else if (xValue > 700) {
xsymbol = '+';
B_Manual = true;
motor_ON();
} else if (yValue < 300) {
ysymbol = '-';
B_Manual = true;
motor_ON();
} else if (yValue > 700) {
ysymbol = '+';
B_Manual = true;
motor_ON();
}
if (buttonState == 0 && button == 1) {
button = 0;
digitalWrite(A4, LOW);
digitalWrite(A5, HIGH);
lcd.setCursor(6, 1);
lcd.print("Stick OFF");
break;
}
if (modeReturn == true) {
digitalWrite(A4, LOW);
digitalWrite(A5, HIGH);
break;
}
// 's'為確認當前搖桿位置存儲, 紀錄當前座標。
while (keys == 's' && button == 1) {
char keys = keypad.getKey();
digitalWrite(A4, LOW);
digitalWrite(A5, HIGH);
lcd.setCursor(3, 3);
lcd.print("location lock!");
// 再次按下's'則繼續搖桿模式
if (keys == 's') {
lcd.setCursor(3, 3);
lcd.print(" ");
button = 0;
break;
}
// 按下'm'則直接返回,並儲存位置
if (keys == 'm') {
modeReturn = true;
// 儲存位置
// ....
break;
}
}
button = 1;
}
}
}
// 半自動模式(常規(紅)、藍))
void mode_C() {
// LCD顯示
lcd.clear();
Serial.println("# 當前為mode_C,半自動(Semi Automatic Mode)模式!");
lcd.setCursor(0, 0);
lcd.print("mode_C: Input");
lcd.setCursor(0, 1);
lcd.print("X:");
lcd.print(xsymbol);
lcd.setCursor(3, 1);
lcd.print(xnum_01);
lcd.print(xnum_02);
lcd.print(".");
lcd.print(xnum_03);
lcd.print(xnum_04);
lcd.setCursor(9, 1);
lcd.print("Y:");
lcd.print(ysymbol);
lcd.setCursor(12, 1);
lcd.print(ynum_01);
lcd.print(ynum_02);
lcd.print(".");
lcd.print(ynum_03);
lcd.print(ynum_04);
lcd.setCursor(17, 1);
lcd.print("(mm");
// 模式C_半自動模式啟用
C_Semi_automatic = true;
}
// 自動模式
void mode_D() {
Dnum_01 = 0;
lcd.clear();
Serial.println("# 當前為mode_D,自動(Automatic Mode)模式!");
lcd.setCursor(0, 0);
lcd.print("mode_D: Input");
lcd.setCursor(0, 1);
lcd.print("set frequency: ");
lcd.print(Dnum_01);
// 模式D_自動模式啟用
D_Automatic = true;
}