#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED顯示屏寬度,單位為像素
#define SCREEN_HEIGHT 64 // OLED顯示屏高度,單位為像素
#define OLED_RESET -1 // 不使用軟件重置OLED顯示屏
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int buttonPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 13 , 44}; // 定義9個按鈕的引腳
const int numButtons =10 ; // 按鈕的數量
const int modeButtons =3 ; // 按鈕的數量
const int ledPin[]={46,48,50,52,51,53,47,49};
int mode =0;
int ledmode =0;
int x=0;
int y= 0;
int line = 1;
int ratemode =0;
int resulttime =0;
int cycle = 0;
int volmode =0;
int lacate =0;
int selection =0;
int selectionstate =0;
int switchVariable = 0;
int dotrate = 0;
int dotvol = 0;
int dotprograte = 0;
int dotprogvol = 0;
int funcline = 0;
int funclacate = 0;
int ratevolstate = 0;
int ratetimestate = 0;
int volvolstate = 0;
int programconnectnum = 0;
int cycletimes = 0;
int direct = 0;
unsigned long startstate = 0;
float screw = 1; //螺絲間距
float motoronecycle = 0;
float syringeradius = 0;
float howstepvol = 0;
float howcyclenum = 0;
float howstep = 0;
float howcycle = 0;
float howstepnum = 0;
float prognumresult1 = 0;
float prognumresult2 = 0;
float prognum1 = 0;
float prognum2 = 0;
int stepsPerMinute = 0 ; // 設置每分鐘步數
unsigned long stepInterval; // 每步的時間間隔(微秒)
unsigned long lastStepTime = 0; // 記錄上一次步進的時間
unsigned long startTime = 0; // 記錄開始時間
int stepsTaken = 0; // 記錄已經走的步數
int (*currentMatrix)[4];
int numbers1[] = {0, 0, 0, 0}; //rate
int numbers2[] = {0, 0, 0, 0}; //vol
int numbers3[] = {0, 0, 0, 0}; //prog rate
int numbers5[] = {0, 0, 0, 0}; //prog vol
int numbers6[] = {0, 0, 0, 0, 0}; //prog num
int numbers7[] = {0, 0, 0, 0}; //Pause time function
float matrix[5][4] = {
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{3, 0, 0, 0}
};
int ledmatrix[4][5] = {
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
};
/*int numbers3_2[] = {0, 0, 0, 0};
int numbers3_2[] = {0, 0, 0, 0};
int numbers3_3[] = {0, 0, 0, 0};
int numbers3_3[] = {0, 0, 0, 0};*/
int numbers4[] = {0, 9, 2, 2}; //syringe size
float result1 = 0;
float result2 = 0;
double result3 = 0;
//float result4 = 14.43;
float result4 = 9;
int indot =0;
bool motor = false;
bool inrate = false;
bool invol = false;
bool indir = false;
bool inPause = false;
bool inend = false;
bool outend = false;
bool infuncrate = false;
bool scale= false;
bool end1= false;
bool end2= false;
bool startlongpress= false;
bool startprogram= false;
bool startprogrampause = false;
bool startprogramcontinue = false;
//bool infuncPause = false;
//bool infuncend = false;
int swrate = 0;
int dirPin = 22;
int stepperPin = 24;
int EN=26;
unsigned long pressStartTime = 0; // 開始按下按鈕的時間
unsigned long pressStartTimes = 0; // 開始按下按鈕的時間
unsigned long pressTimes = 0; // 開始按下按鈕的時間
const int number = 4;
bool inMode = true;
bool fucnumrate = false;
bool buttonPressed[numButtons] = {false}; // 按鈕按下狀態
void setup() {
Serial.begin(9600); // 初始化串口通信
pinMode(dirPin, OUTPUT);
pinMode(stepperPin, OUTPUT);
pinMode(EN, OUTPUT);
for (int i = 0; i < numButtons; i++) {
pinMode(ledPin[i], OUTPUT);
}
// 初始化OLED顯示屏
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 initialization failed"));
while(true);
}
// 清空顯示屏
display.clearDisplay();
//pinMode(buttonPins[7], INPUT_PULLUP);
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP); // 設置按鈕引腳為輸入並啟用內部上拉電阻
}
}
void loop() {
int buttonState = digitalRead(buttonPins[4]); // 讀取按鈕的狀態
if ((buttonState == LOW && !buttonPressed[4])or mode ==1) { // 檢查按鈕是否被按下且未被報告過
volumeled();
inMode = true;
mode =1;
while (inMode){
updateDisplay1();
displayText("rate");
indot = dotrate;
dot1();
buttomrate1();
//Serial.println(x);
buttonState = digitalRead(buttonPins[4]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[4]) {
//Serial.println(x);
x=x+1;
//Serial.println(x);
if(x==2){
ratemode=ratemode+1;
//Serial.println(x);
}
x=1;
//Serial.println("----------------------");
buttonPressed[4] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState == HIGH && buttonPressed[4]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[4] = false; // 按鈕釋放後重置按下標誌
}
rateled();
volled();
volvolstate = ratemode;
ratevolstate = ratemode;
ratetimestate = volmode;
//Serial.println("k");
//select();
select();
direct1();
start1();
if (digitalRead(buttonPins[5]) == LOW ) {
inMode = false;
mode =2;
indot=0;
} else if (digitalRead(buttonPins[6]) == LOW ) {
inMode = false;
mode =3;
indot=0;
} else if (digitalRead(buttonPins[8]) == LOW ) {
inMode = false;
mode =4;
indot=0;
}
}
x=1;
buttonPressed[4] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[4]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[4] = false; // 按鈕釋放後重置按下標誌
}
int buttonState2 = digitalRead(buttonPins[5]); // 讀取按鈕的狀態
if ((buttonState2 == LOW && !buttonPressed[5]) or mode==2) { // 檢查按鈕是否被按下且未被報告過
volumeled();
inMode = true;
mode =2;
//Serial.println(result1);
//Serial.println(result2);
//Serial.println(result3);
//Serial.println(result4);
while (inMode){
updateDisplay2();
displayText("volum");
//updateDisplay2();
indot = dotvol;
dot1();
buttomrate2();
//Serial.println(y);
buttonState2 = digitalRead(buttonPins[5]); // 讀取按鈕的狀態
if (buttonState2 == LOW && !buttonPressed[5]) {
//Serial.println(y);
y=y+1;
//Serial.println(y);
if(y==2){
volmode=volmode+1;
//Serial.println(y);
}
y=1;
//Serial.println("----------------------");
buttonPressed[5] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState2 == HIGH && buttonPressed[5]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[5] = false; // 按鈕釋放後重置按下標誌
}
rateled();
volled();
volvolstate = ratemode;
ratevolstate = ratemode;
ratetimestate = volmode;
select();
direct1();
start1();
if (digitalRead(buttonPins[4]) == LOW ) {
inMode = false;
mode =1;
indot=0;
} else if (digitalRead(buttonPins[6]) == LOW ) {
inMode = false;
mode =3;
indot=0;
} else if (digitalRead(buttonPins[8]) == LOW ) {
inMode = false;
mode =4;
indot=0;
}
}
y=1;
buttonPressed[5] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState2 == HIGH && buttonPressed[5]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[5] = false; // 按鈕釋放後重置按下標誌
}
int buttonState3 = digitalRead(buttonPins[6]); // 讀取按鈕的狀態
if ((buttonState3 == LOW && !buttonPressed[6])or mode==3) { // 檢查按鈕是否被按下且未被報告過
volumeled();
inMode = true;
mode =3;
//Serial.println(result4);
while (inMode){
//Serial.println(line);
fuctiondisplay();
displayText2("prog:func",line);
arrow();
function();
if (digitalRead(buttonPins[6])==LOW) { //顯示1~4數值
line = 1;
lacate = 0;
clearMatrix(matrix,5,4);
matrix[4][0]=3;
for (int i = 0; i < 4; i++) {
numbers3[i] = 0; // 數字循環
numbers5[i] = 0; // 數字循環
numbers7[i] = 0; // 數字循環
selection = 0;
}
cycle = 0;
}
//updateDisplay3();
//buttomrate3();
rateled();
volled();
if (digitalRead(buttonPins[4]) == LOW ) {
inMode = false;
mode =1;
} else if (digitalRead(buttonPins[5]) == LOW ) {
inMode = false;
mode =2;
} else if (digitalRead(buttonPins[8]) == LOW ) {
inMode = false;
mode =4;
}
}
buttonPressed[6] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState3 == HIGH && buttonPressed[6]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[6] = false; // 按鈕釋放後重置按下標誌
}
int buttonState4 = digitalRead(buttonPins[8]); // 讀取按鈕的狀態
if ((buttonState4 == LOW && !buttonPressed[8]) or mode==4) { // 檢查按鈕是否被按下且未被報告過
mmled();
inMode = true;
mode =4;
result4 = 0;
while (inMode){
updateDisplay4();
displayText("syringe size");
display.display();
buttomrate4();
int buttonState4 = digitalRead(buttonPins[8]); // 讀取按鈕的狀態
//Serial.println(result4);
//rateled();
//volled();
//start2();
if (digitalRead(buttonPins[4]) == LOW ) {
inMode = false;
mode =1;
} else if (digitalRead(buttonPins[6]) == LOW ) {
inMode = false;
mode =3;
} else if (digitalRead(buttonPins[5]) == LOW ) {
inMode = false;
mode =2;
}
}
for (int i = 0; i < 4; i++) {
result4 = result4 * 10 + numbers4[i];
}
result4 = result4 / 100;
buttonPressed[8] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState2 == HIGH && buttonPressed[8]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[8] = false; // 按鈕釋放後重置按下標誌
}
}
void updateDisplay1() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers1[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
//display.display(); // 更新顯示
}
void updateDisplay2() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers2[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
//display.display(); // 更新顯示
}
void fuctiondisplay() {
display.clearDisplay(); // 清空顯示屏
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 20);
display.println(" Rate");
display.setCursor(0, 35);
display.println(" Pause");
display.setCursor(0, 50);
display.println(" End");
//display.display();
}
void updateDisplay3() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers3[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
//display.display(); // 更新顯示
}
void updateDisplay4() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers4[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
display.setCursor(55,40);
display.println(".");
//display.display(); // 更新顯示
}
void updateDisplay5() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers5[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
//display.display(); // 更新顯示
}
void updateDisplay6() {
display.clearDisplay(); // 清空顯示屏
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 20);
display.println(" in");
display.setCursor(0, 35);
display.println(" out");
//display.display();
}
void updateDisplay7() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(0, 35); // 設置光標位置
for (int j = 0; j < number; j++) {
display.print(numbers7[j]); // 在顯示屏上顯示數字
display.print(" "); // 添加空格分隔
}
display.setCursor(55,35);
display.println(":");
//display.display(); // 更新顯示
}
void displayText(String text) {
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(text);
//display.display();
}
void displayText2(String text, int line) {
String lineStr = String(line);
String texts = text + lineStr;
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(texts);
//display.display();
}
void displayText3(String text, int line, String text1) {
String lineStr = String(line);
String texts = text + lineStr + text1;
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(texts);
//display.display();
}
void cycleDisplay() {
display.clearDisplay(); // 清空顯示屏
// 在顯示屏上顯示四個數字
display.setTextSize(3); // 設置文字大小
display.setTextColor(SSD1306_WHITE); // 設置文字顏色
display.setCursor(100, 35); // 設置光標位置
display.println(cycle);
//display.display(); // 更新顯示
}
void funcnum0(float num1, float num2, float num3) {
display.clearDisplay();
String end1num = String(num1);
String end2num = String(num2);
if (num1>=1000){
int preratenum = (int)num1;
end1num = "rate:" + String(preratenum);
}else if((1000 > num1) && (num1 >= 100)){
end1num = "rate:" + String(num1,1);
}else if((100 > num1) && (num1 >= 10)){
end1num = "rate:" + String(num1,2);
}else if(10>num1){
end1num = "rate:" + String(num1,3);
}
if (num2>=1000){
int prevolnum = (int)num2;
end2num = "vol: " + String(prevolnum);
}else if((1000 > num2) && (num2 >= 100)){
end2num = "vol: " + String(num2,1);
}else if((100 > num2) && (num2 >= 10)){
end2num = "vol: " + String(num2,2);
}else if(10>num2){
end2num = "vol: " + String(num2,3);
}
String end3num = String(num3);
if (num3==0){
end3num = "dir: push";
}
if(num3==1){
end3num = "dir: pull";
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func1:");
display.setCursor(0, 15);
display.println(end1num);
display.setCursor(0, 30);
display.println(end2num);
display.setCursor(0, 45);
display.println(end3num);
}
void funcnum1(float num1, float num2, float num3) {
display.clearDisplay();
String end1num = String(num1);
String end2num = String(num2);
if (num1>=1000){
int preratenum = (int)num1;
end1num = "rate:" + String(preratenum);
}else if((1000 > num1) && (num1 >= 100)){
end1num = "rate:" + String(num1,1);
}else if((100 > num1) && (num1 >= 10)){
end1num = "rate:" + String(num1,2);
}else if(10>num1){
end1num = "rate:" + String(num1,3);
}
if (num2>=1000){
int prevolnum = (int)num2;
end2num = "vol: " + String(prevolnum);
}else if((1000 > num2) && (num2 >= 100)){
end2num = "vol: " + String(num2,1);
}else if((100 > num2) && (num2 >= 10)){
end2num = "vol: " + String(num2,2);
}else if(10>num2){
end2num = "vol: " + String(num2,3);
}
String end3num = String(num3);
if (num3==0){
end3num = "dir: push";
}
if(num3==1){
end3num = "dir: pull";
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func2:");
display.setCursor(0, 15);
display.println(end1num);
display.setCursor(0, 30);
display.println(end2num);
display.setCursor(0, 45);
display.println(end3num);
}
void funcnum2(float num1, float num2, float num3) {
display.clearDisplay();
String end1num = String(num1);
String end2num = String(num2);
if (num1>=1000){
int preratenum = (int)num1;
end1num = "rate:" + String(preratenum);
}else if((1000 > num1) && (num1 >= 100)){
end1num = "rate:" + String(num1,1);
}else if((100 > num1) && (num1 >= 10)){
end1num = "rate:" + String(num1,2);
}else if(10>num1){
end1num = "rate:" + String(num1,3);
}
if (num2>=1000){
int prevolnum = (int)num2;
end2num = "vol: " + String(prevolnum);
}else if((1000 > num2) && (num2 >= 100)){
end2num = "vol: " + String(num2,1);
}else if((100 > num2) && (num2 >= 10)){
end2num = "vol: " + String(num2,2);
}else if(10>num2){
end2num = "vol: " + String(num2,3);
}
String end3num = String(num3);
if (num3==0){
end3num = "dir: push";
}
if(num3==1){
end3num = "dir: pull";
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func3:");
display.setCursor(0, 15);
display.println(end1num);
display.setCursor(0, 30);
display.println(end2num);
display.setCursor(0, 45);
display.println(end3num);
}
void funcnum3(float num1, float num2, float num3) {
display.clearDisplay();
String end1num = String(num1);
String end2num = String(num2);
if (num1>=1000){
int preratenum = (int)num1;
end1num = "rate:" + String(preratenum);
}else if((1000 > num1) && (num1 >= 100)){
end1num = "rate:" + String(num1,1);
}else if((100 > num1) && (num1 >= 10)){
end1num = "rate:" + String(num1,2);
}else if(10>num1){
end1num = "rate:" + String(num1,3);
}
if (num2>=1000){
int prevolnum = (int)num2;
end2num = "vol: " + String(prevolnum);
}else if((1000 > num2) && (num2 >= 100)){
end2num = "vol: " + String(num2,1);
}else if((100 > num2) && (num2 >= 10)){
end2num = "vol: " + String(num2,2);
}else if(10>num2){
end2num = "vol: " + String(num2,3);
}
String end3num = String(num3);
if (num3==0){
end3num = "dir: push";
}
if(num3==1){
end3num = "dir: pull";
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func4:");
display.setCursor(0, 15);
display.println(end1num);
display.setCursor(0, 30);
display.println(end2num);
display.setCursor(0, 45);
display.println(end3num);
}
void timenum0(float num1) {
display.clearDisplay();
int pretimenum = num1/100;
int backtimenum = num1 - (pretimenum*100);
String end1num = "no found";
if ((10 > backtimenum) && (10 > pretimenum) ){
end1num = "0"+String(pretimenum)+":0"+String(backtimenum);
}else if (10 > backtimenum){
end1num = String(pretimenum)+":0"+String(backtimenum);
}else if (10 > pretimenum){
end1num = "0"+String(pretimenum)+":"+String(backtimenum);
}else {
end1num = String(pretimenum)+":"+String(backtimenum);
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func1:Pause");
/*display.setCursor(0, 15);
display.println("Pause:");*/
display.setTextSize(3);
display.setCursor(20, 35);
display.println(end1num);
}
void timenum1(float num1) {
display.clearDisplay();
int pretimenum = num1/100;
int backtimenum = num1 - (pretimenum*100);
String end1num = "no found";
if ((10 > backtimenum) && (10 > pretimenum) ){
end1num = "0"+String(pretimenum)+":0"+String(backtimenum);
}else if (10 > backtimenum){
end1num = String(pretimenum)+":0"+String(backtimenum);
}else if (10 > pretimenum){
end1num = "0"+String(pretimenum)+":"+String(backtimenum);
}else {
end1num = String(pretimenum)+":"+String(backtimenum);
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func2:Pause");
/*display.setCursor(0, 15);
display.println("Pause:");*/
display.setTextSize(3);
display.setCursor(20, 35);
display.println(end1num);
}
void timenum2(float num1) {
display.clearDisplay();
int pretimenum = num1/100;
int backtimenum = num1 - (pretimenum*100);
String end1num = "no found";
if ((10 > backtimenum) && (10 > pretimenum) ){
end1num = "0"+String(pretimenum)+":0"+String(backtimenum);
}else if (10 > backtimenum){
end1num = String(pretimenum)+":0"+String(backtimenum);
}else if (10 > pretimenum){
end1num = "0"+String(pretimenum)+":"+String(backtimenum);
}else {
end1num = String(pretimenum)+":"+String(backtimenum);
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func3:Pause");
/*display.setCursor(0, 15);
display.println("Pause:");*/
display.setTextSize(3);
display.setCursor(20, 35);
display.println(end1num);
}
void timenum3(float num1) {
display.clearDisplay();
int pretimenum = num1/100;
int backtimenum = num1 - (pretimenum*100);
String end1num = "no found";
if ((10 > backtimenum) && (10 > pretimenum) ){
end1num = "0"+String(pretimenum)+":0"+String(backtimenum);
}else if (10 > backtimenum){
end1num = String(pretimenum)+":0"+String(backtimenum);
}else if (10 > pretimenum){
end1num = "0"+String(pretimenum)+":"+String(backtimenum);
}else {
end1num = String(pretimenum)+":"+String(backtimenum);
}
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func4:Pause");
/*display.setCursor(0, 15);
display.println("Pause:");*/
display.setTextSize(3);
display.setCursor(20, 35);
display.println(end1num);
}
void endfuctiondisplay() {
display.clearDisplay(); // 清空顯示屏
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("func:");
if (matrix[0][0]!=0){
display.setTextSize(1);
if(matrix[0][0]==1){
display.setCursor(0, 20);
display.println("1.rate");
}
if(matrix[0][0]==2){
display.setCursor(0, 20);
display.println("1.Pause");
}
if(matrix[0][0]==3){
display.setCursor(0, 20);
display.println("1.end");
}
}
if (matrix[1][0]!=0){
if(matrix[1][0]==1){
display.setCursor(0, 30);
display.println("2.rate");
}
if(matrix[1][0]==2){
display.setCursor(0, 30);
display.println("2.Pause");
}
if(matrix[1][0]==3){
display.setCursor(0, 30);
display.println("2.end");
}
}
if (matrix[2][0]!=0){
if(matrix[2][0]==1){
display.setCursor(0, 40);
display.println("3.rate");
}
if(matrix[2][0]==2){
display.setCursor(0, 40);
display.println("3.Pause");
}
if(matrix[2][0]==3){
display.setCursor(0, 40);
display.println("3.end");
}
}
if (matrix[3][0]!=0){
if(matrix[3][0]==1){
display.setCursor(0, 50);
display.println("4.rate");
}
if(matrix[3][0]==2){
display.setCursor(0, 50);
display.println("4.Pause");
}
if(matrix[3][0]==3){
display.setCursor(0, 50);
display.println("4.end");
}
}
if (matrix[4][0]!=0){
String textline = "Cycle:" + String(cycle);
display.setTextSize(2);
if(matrix[4][0]==1){
display.setCursor(40, 45);
display.println(textline);
}
if(matrix[4][0]==2){
display.setCursor(40, 45);
display.println(textline);
}
if(matrix[4][0]==3){
display.setCursor(40, 45);
display.println(textline);
}
}
//display.display();
}
void startdisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("Stepper Motor Control"));
display.setCursor(0, 15);
display.print(F("Steps: "));
display.println(stepsTaken);
display.setCursor(0, 40);
display.print(F("Time: "));
display.print((millis() - startTime) / 1000);
display.println(F(" s"));
display.display();
}
void buttomrate1(){ //rate
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
pressStartTime = millis();
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
if ( millis() - pressStartTime < 1000) {
// 短按功能
numbers1[i]++;
if (numbers1[i] > 9) {
numbers1[i] = 0; // 數字循環
}
} else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
indot=indot+1;
if(indot>=4){
indot=0;
}
}
dotrate = indot;
updateDisplay1(); // 更新顯示屏上的數字
//delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void buttomrate2(){ //volume
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
pressStartTime = millis();
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
if ( millis() - pressStartTime < 1000) {
// 短按功能
numbers2[i]++;
if (numbers2[i] > 9) {
numbers2[i] = 0; // 數字循環
}
}else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
indot=indot+1;
if(indot>=4){
indot=0;
}
}
dotvol = indot;
updateDisplay2(); // 更新顯示屏上的數字
delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void function(){ //programming
for (int i = 0; i < 4; i++) {
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
//Serial.println("number");
pressStartTime = millis();
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
//Serial.println("number1");
if ((millis() - pressStartTime < 1000) && i == 0) {
// 短按功能
lacate=lacate+1;
if (lacate==3){
lacate = 0;
}
}else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
funcline = line-1;
funclacate = lacate+1;
switch (lacate) {
case 0://rate
funcrate();
//currentMatrix = matrix1;
//Serial.println("rate");
matrix[funcline][1] = prognumresult1;
matrix[funcline][2] = prognumresult2;
matrix[funcline][3] = selection;
fucnumrate = false;
break;
case 1://Pause
inPause = true;
while(inPause){
updateDisplay7();
displayText3("func",line,":Pause");
display.display();
funcPause();
//currentMatrix = matrix2;
}
matrix[funcline][1] = resulttime;
fucnumrate = false;
break;
case 2://end
//currentMatrix = matrix3;
inend = true;
while(inend){
cycleDisplay();
displayText3("func",line,":end cycle");
display.display();
funcend();
}
//Serial.println("no2");
matrix[funcline][1] = cycle;
break;
}
fucnumrate = false;
matrix[funcline][0] = funclacate;
numbers6[funcline]=funclacate;
//Serial.println(numbers6[0]);
//Serial.println(numbers6[1]);
//Serial.println(numbers6[2]);
//Serial.println(numbers6[3]);
//Serial.println(numbers6[4]);
if (lacate == 3){
//programscale();
}
if (lacate==2){ // 顯示
outend = true;
while(outend){ //顯示數值和開始
endfuctiondisplay();
if (digitalRead(buttonPins[0])==LOW && matrix[0][0]==1) { //顯示1~4數值
funcnum0(matrix[0][1], matrix[0][2], matrix[0][3]);
}
if (digitalRead(buttonPins[0])==LOW && matrix[0][0]==2) { //顯示1~4數值
timenum0(matrix[0][1]);
}
if (digitalRead(buttonPins[1])==LOW && matrix[1][0]==1) { //顯示1~4數值
funcnum1(matrix[1][1], matrix[1][2], matrix[1][3]);
}
if (digitalRead(buttonPins[1])==LOW && matrix[1][0]==2) { //顯示1~4數值
timenum1(matrix[1][1]);
}
if (digitalRead(buttonPins[2])==LOW && matrix[2][0]==1) { //顯示1~4數值
funcnum2(matrix[2][1], matrix[2][2], matrix[2][3]);
}
if (digitalRead(buttonPins[2])==LOW && matrix[2][0]==2) { //顯示1~4數值
timenum2(matrix[2][1]);
}
if (digitalRead(buttonPins[3])==LOW && matrix[3][0]==1) { //顯示1~4數值
funcnum3(matrix[3][1], matrix[3][2], matrix[3][3]);
}
if (digitalRead(buttonPins[3])==LOW && matrix[3][0]==2) { //顯示1~4數值
timenum3(matrix[3][1]);
}
display.display();
//program start
programstart();
if (digitalRead(buttonPins[6])==LOW) {
outend = false;
}
}
line = 1;
lacate = 0;
clearMatrix(matrix,5,4);
matrix[4][0]=3;
cycle = 0;
for (int i = 0; i < 4; i++) {
numbers3[i] = 0; // 數字循環
numbers5[i] = 0; // 數字循環
numbers7[i] = 0; // 數字循環
selection = 0;
}
}
line=line+1;
if (line==5){
//line=5;
end1 = true;
while (end1){
cycleDisplay();
displayText3("func",line,":end cycle");
display.display();
funcend();
}
matrix[4][1] = cycle;
end2 = true;
while (end2){
//Serial.println("fok");
endfuctiondisplay();
//Serial.println("sok");
if (digitalRead(buttonPins[0])==LOW && matrix[0][0]==1) { //顯示1~4數值
funcnum0(matrix[0][1], matrix[0][2], matrix[0][3]);
}
if (digitalRead(buttonPins[0])==LOW && matrix[0][0]==2) { //顯示1~4數值
timenum0(matrix[0][1]);
}
if (digitalRead(buttonPins[1])==LOW && matrix[1][0]==1) { //顯示1~4數值
funcnum1(matrix[1][1], matrix[1][2], matrix[1][3]);
}
if (digitalRead(buttonPins[1])==LOW && matrix[1][0]==2) { //顯示1~4數值
timenum1(matrix[1][1]);
}
if (digitalRead(buttonPins[2])==LOW && matrix[2][0]==1) { //顯示1~4數值
funcnum2(matrix[2][1], matrix[2][2], matrix[2][3]);
}
if (digitalRead(buttonPins[2])==LOW && matrix[2][0]==2) { //顯示1~4數值
timenum2(matrix[2][1]);
}
if (digitalRead(buttonPins[3])==LOW && matrix[3][0]==1) { //顯示1~4數值
funcnum3(matrix[3][1], matrix[3][2], matrix[3][3]);
}
if (digitalRead(buttonPins[3])==LOW && matrix[3][0]==2) { //顯示1~4數值
timenum3(matrix[3][1]);
}
//display.display();
//Serial.println("ok");
display.display();
programstart();
if (digitalRead(buttonPins[6])==LOW) { //顯示1~4數值
end1 = false;
end2 = false;
}
}
line = 1;
lacate = 0;
clearMatrix(matrix,5,4);
matrix[4][0]=3;
cycle = 0;
for (int i = 0; i < 4; i++) {
numbers3[i] = 0; // 數字循環
numbers5[i] = 0; // 數字循環
numbers7[i] = 0; // 數字循環
selection = 0;
}
}
if (line==6){
line=1;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
}
}
} buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void buttomrate3(){ //programming
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
numbers3[i]++;
if (numbers3[i] > 9) {
numbers3[i] = 0; // 數字循環
}
updateDisplay3(); // 更新顯示屏上的數字
delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void buttomrate4(){ //Syringe size
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
numbers4[i]++;
if (numbers4[i] > 9) {
numbers4[i] = 0; // 數字循環
}
updateDisplay4(); // 更新顯示屏上的數字
delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
/*void step(boolean dir,int steps){
digitalWrite(dirPin,dir);
delay(50);
for(int p=0;p<steps;p++){
digitalWrite(stepperPin, HIGH);
delayMicroseconds(3200);
digitalWrite(stepperPin, LOW);
delayMicroseconds(3200);
}
}*/
void start1(){
int buttonState11 = digitalRead(buttonPins[7]); // 讀取按鈕的狀態
if (buttonState11 == LOW && !buttonPressed[7]) {
//Serial.println(indot);
//Serial.println(result1,4);
motor=true;
startTime = millis();
pressStartTime = millis();
while (digitalRead(buttonPins[7]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
if (millis() - pressStartTime < 1000) {
// 短按功能
//delay(1000);
math();
stepsPerMinute = howstep ;
if (ratetimestate==1){
setStepInterval(stepsPerMinute);
//Serial.println("in ratetimestate==1");
lastStepTime = micros();
while (motor==true){
//Serial.println("in while");
digitalWrite(ledPin[7], HIGH);
digitalWrite(EN, LOW);
if (((micros() - lastStepTime)/1000) >= stepInterval) {
//Serial.println("in (micros() - lastStepTime)/1000) >= stepInterval)");
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 保持高電平足夠短的時間
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
lastStepTime = micros();
stepsTaken++; // 增加步数计数器
//Serial.println(millis() - startTime);
if (stepsTaken >= (int)howstepnum) {
motor=false;
}
}
if (digitalRead(buttonPins[7]) == LOW){
motor=false;
//delay(1000);
}
}
}else if(ratetimestate==0){
setStepIntervalhr(stepsPerMinute);
lastStepTime = micros();
while (motor==true){
digitalWrite(ledPin[7], HIGH);
digitalWrite(EN, LOW);
if (((micros() - lastStepTime)/1000) >= stepInterval) {
//Serial.println(setStepIntervalhr);
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 保持高電平足夠短的時間
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
lastStepTime = micros();
stepsTaken++; // 增加步数计数器
//Serial.println(millis() - startTime);
if (stepsTaken >= (int)howstepnum) {
motor=false;
}
}
if (digitalRead(buttonPins[7]) == LOW){
motor=false;
//delay(1000);
}
}
}
} else {
// 長按功能
startlongpress = true;
while(startlongpress == true){
digitalWrite(ledPin[7], HIGH);
/*digitalWrite(stepperPin, HIGH);
delayMicroseconds(1000); // 保持高電平足夠短的時間
digitalWrite(stepperPin, LOW);
delayMicroseconds(1000);
Serial.println("Long");*/
int steps = 200; // 假設200步是一圈
digitalWrite(EN, LOW);
for (int i = 0; i < steps; i++) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 步進脈衝時間間隔
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
}
if (digitalRead(buttonPins[7]) == HIGH){
startlongpress = false;
}
}
}
buttonPressed[7] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState11 == HIGH && buttonPressed[7]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[7] = false; // 按鈕釋放後重置按下標誌
}
digitalWrite(ledPin[7], LOW);
stepsTaken = 0;
}
void arrow(){
if (lacate==0){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,20);
display.println("-->");
display.display();
}
if (lacate==1){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,35);
display.println("-->");
display.display();
}
else if (lacate==2){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,50);
display.println("-->");
display.display();
}
}
void arrow2(){
if (selection==0){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,20);
display.println("-->");
display.display();
}
if (selection==1){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,35);
display.println("-->");
display.display();
}
}
void dot1(){
if (indot==0){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20,40);
display.println("");
display.display();
}
if (indot==1){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20,40);
display.println(".");
display.display();
}
else if (indot==2){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(55,40);
display.println(".");
display.display();
}
else if (indot==3){
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(90,40);
display.println(".");
display.display();
}
}
void select(){
if(mode==1){
result1 = 0;
if(indot==0){
for (int i = 0; i < 4; i++) {
result1 = result1 * 10 + numbers1[i];
}
}else if(indot==1){
for (int i = 0; i <4; i++) {
result1 = result1 * 10 + numbers1[i];
}
result1 = result1 / 1000;
}else if(indot==2){
for (int i = 0; i <4; i++) {
result1 = result1 * 10 + numbers1[i];
}
result1 = result1 / 100;
}else if(indot==3){
for (int i = 0; i <4; i++) {
result1 = result1 * 10 + numbers1[i];
}
result1 = result1 / 10;
}
}
if(mode==2){
result2 = 0;
if(indot==0){
for (int i = 0; i < 4; i++) {
result2 = result2 * 10 + numbers2[i];
}
}else if(indot==1){
for (int i = 0; i <4; i++) {
result2 = result2 * 10 + numbers2[i];
}
result2 = result2 / 1000;
}else if(indot==2){
for (int i = 0; i <4; i++) {
result2 = result2 * 10 + numbers2[i];
}
result2 = result2 / 100;
}else if(indot==3){
for (int i = 0; i <4; i++) {
result2 = result2 * 10 + numbers2[i];
}
result2 = result2 / 10;
}
}
if(mode==3){
result3 = 0;
if(indot==0){
for (int i = 0; i < 4; i++) {
result3 = result3 * 10 + numbers3[i];
}
}else if(indot==1){
for (int i = 0; i <4; i++) {
result3 = result3 * 10 + numbers3[i];
}
result3 = result3 / 1000;
}else if(indot==2){
for (int i = 0; i <4; i++) {
result3 = result3 * 10 + numbers3[i];
}
result3 = result3 / 100;
}else if(indot==3){
for (int i = 0; i <4; i++) {
result3 = result3 * 10 + numbers3[i];
}
result3 = result3 / 10;
}
}
}
void rateled(){
//if (ledmode==1){
//ratemode=ratemode+1;
//}
if (ratemode==2){
ratemode=0;
}
else if (ratemode==0){
digitalWrite(ledPin[0], HIGH);
digitalWrite(ledPin[1], LOW);
}
else if (ratemode==1){
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[0], LOW);
}
}
void volled(){
//if (ledmode==2){
//volmode=volmode+1;
//}
if (volmode==2){
volmode=0;
}
if (volmode==0){
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], LOW);
}
else if (volmode==1){
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[2], LOW);
}
}
void volumeled(){
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], LOW);
}
void mmled(){
digitalWrite(ledPin[5], HIGH);
digitalWrite(ledPin[4], LOW);
}
void funcrate(){
infuncrate = true;
while (infuncrate){
switch (swrate) {
case 0://rate
inrate = true;
while (inrate){
updateDisplay3(); // 更新顯示屏上的數字
displayText3("func",line,":rate");
dot1();
pressrate1();
progfuncratenum();
/*if (digitalRead(buttonPins[4])==LOW) {
ratemode=ratemode+1;
}*/
int buttonState1 = digitalRead(buttonPins[4]); // 讀取按鈕的狀態
if (buttonState1 == LOW && !buttonPressed[4]) {
ratemode=ratemode+1;
buttonPressed[4] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState1 == HIGH && buttonPressed[4]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[4] = false; // 按鈕釋放後重置按下標誌
}
ledmatrix[funcline][0]= ratemode;
/*if (digitalRead(buttonPins[5])==LOW) {
volmode=volmode+1;
}*/
int buttonState2 = digitalRead(buttonPins[5]); // 讀取按鈕的狀態
if (buttonState2 == LOW && !buttonPressed[5]) {
volmode=volmode+1;
buttonPressed[5] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState2 == HIGH && buttonPressed[5]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[5] = false; // 按鈕釋放後重置按下標誌
}
ledmatrix[funcline][1]= volmode;
rateled();
volled();
//updateDisplay3(); // 更新顯示屏上的數字
//display.display();
}
fucnumrate = false;
indot=0;
break;
case 1://volume
invol = true;
while (invol){
updateDisplay5(); // 更新顯示屏上的數字
displayText3("func",line,":vol");
dot1();
pressrate2();
progfuncvolnum();
int buttonState3 = digitalRead(buttonPins[4]); // 讀取按鈕的狀態
if (buttonState3 == LOW && !buttonPressed[4]) {
ratemode=ratemode+1;
buttonPressed[4] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState3 == HIGH && buttonPressed[4]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[4] = false; // 按鈕釋放後重置按下標誌
}
ledmatrix[funcline][2]= ratemode;
int buttonState4 = digitalRead(buttonPins[5]); // 讀取按鈕的狀態
if (buttonState4 == LOW && !buttonPressed[5]) {
volmode=volmode+1;
buttonPressed[5] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState4 == HIGH && buttonPressed[5]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[5] = false; // 按鈕釋放後重置按下標誌
}
ledmatrix[funcline][3]= volmode;
rateled();
volled();
}
fucnumrate = false;
indot=0;
break;
case 2://direction
indir = true;
while (indir){
updateDisplay6(); // 更新顯示屏上的數字
displayText3("func",line,":dir");
arrow2();
ledmatrix[funcline][4]= selection;
//dot1();
pressrate3();
}
fucnumrate = false;
indot=0;
break;
}
}
}
void pressrate1(){ //programming
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
while (digitalRead(buttonPins[0]) == LOW && !fucnumrate){
}
fucnumrate = true;
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
pressStartTimes = millis();
pressTimes = millis();
//int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
while (digitalRead(buttonPins[1]) == LOW && millis() - pressTimes < 500) {
// 等待按鈕釋放或達到長按時間
}
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTimes < 1000) {
// 等待按鈕釋放或達到長按時間
}
//Serial.println("number1");
if(i == 1 && digitalRead(buttonPins[1]) == LOW && (millis() - pressTimes >= 500)){
swrate=swrate+1;
inrate = false;
}
else if ( millis() - pressStartTimes < 1000) {
// 短按功能
numbers3[i]++;
if (numbers3[i] > 9) {
numbers3[i] = 0; // 數字循環
}
}else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
indot=indot+1;
if(indot>=4){
indot=0;
}
}
/*if (i==1 && millis() - pressTimes < 500) {
Serial.println("buttonPins[1]");
}else if(i == 1 && digitalRead(buttonPins[1] && (millis() - pressTimes < 500)) == LOW){
swrate=swrate+1;
Serial.println("swrate+1");
inrate = false;
}*/
//Serial.println("hollow1");
updateDisplay3(); // 更新顯示屏上的數字
delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
}else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void pressrate2(){ //programming
// 監測每個按鈕的狀態並通過串口輸出
for (int i = 0; i < 4; i++) {
//Serial.println(fucnumrate);
while (digitalRead(buttonPins[1]) == LOW && !fucnumrate){
}
fucnumrate = true;
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
pressStartTimes = millis();
pressTimes = millis();
//int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
while (digitalRead(buttonPins[1]) == LOW && millis() - pressTimes < 500) {
// 等待按鈕釋放或達到長按時間
}
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTimes < 1000) {
// 等待按鈕釋放或達到長按時間
}
//Serial.println("number1");
if(i == 1 && digitalRead(buttonPins[1]) == LOW && (millis() - pressTimes >= 500)){
swrate=swrate+1;
invol = false;
}
else if ( millis() - pressStartTimes < 1000) {
// 短按功能
numbers5[i]++;
if (numbers5[i] > 9) {
numbers5[i] = 0; // 數字循環
}
}else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
indot=indot+1;
if(indot>=4){
indot=0;
}
}
/*if (i==1 && millis() - pressTimes < 500) {
Serial.println("buttonPins[1]");
}else if(i == 1 && digitalRead(buttonPins[1]) == LOW && (millis() - pressTimes >= 500)){
swrate=swrate+1;
Serial.println("swrate+1");
invol = false;
}*/
//Serial.println("hollow1");
updateDisplay5(); // 更新顯示屏上的數字
delay(80);
buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void pressrate3(){
for (int i = 0; i < 4; i++) {
while (digitalRead(buttonPins[i]) == LOW && !fucnumrate){
}
fucnumrate = true;
int buttonState = digitalRead(buttonPins[i]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[i]) { // 檢查按鈕是否被按下且未被報告過
pressStartTime = millis();
while (digitalRead(buttonPins[0]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
//Serial.println("number1");
if ( i == 0 && millis() - pressStartTime < 1000) {
// 短按功能
selection=selection+1;
if (selection==2){
selection = 0;
}
}else if(i == 0 && digitalRead(buttonPins[0]) == LOW){
// 長按功能
selectionstate = selection;
swrate=0;
infuncrate = false;
indir = false;
} buttonPressed[i] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[i]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[i] = false; // 按鈕釋放後重置按下標誌
}
}
}
void funcPause(){
//infuncPause = true;
//while (infuncPause){
for (int x = 0; x < 4; x++) {
while (digitalRead(buttonPins[0]) == LOW && !fucnumrate){
}
fucnumrate = true;
int buttonState = digitalRead(buttonPins[x]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[x]) { // 檢查按鈕是否被按下且未被報告過
pressTimes = millis();
while (digitalRead(buttonPins[1]) == LOW && millis() - pressTimes < 500) {
// 等待按鈕釋放或達到長按時間
}
//displayText("func:Pause");
updateDisplay7();
if ( millis() - pressTimes < 500) {
// 短按功能
numbers7[x]++;
if (numbers7[x] > 9) {
numbers7[x] = 0; // 數字循環
}
if (numbers7[2] > 5) {
numbers7[2] = 0; // 數字循環
}
}else if(x == 1 && digitalRead(buttonPins[1]) == LOW){
inPause = false;
//infuncPause = false;
}
resulttime = 0;
for (int i = 0; i < 4; i++) {
resulttime = resulttime * 10 + numbers7[i];
}
delay(80);
//displayText("func:Pause");
updateDisplay7();
buttonPressed[x] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[x]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[x] = false; // 按鈕釋放後重置按下標誌
}
}
//}
}
void funcend(){
for (int x = 0; x < 2; x++) {
while (digitalRead(buttonPins[0]) == LOW && !fucnumrate){
}
fucnumrate = true;
int buttonState = digitalRead(buttonPins[x]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[x]) { // 檢查按鈕是否被按下且未被報告過
if ( x==0 && digitalRead(buttonPins[0]) == LOW) {
// 短按功能
cycle++;
if (cycle > 9) {
cycle = 0; // 數字循環
}
}else if(x == 1 && digitalRead(buttonPins[1]) == LOW){
end1 = false;
inend = false;
}
delay(80);
//displayText("func:end cycle");
cycleDisplay();
buttonPressed[x] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[x]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[x] = false; // 按鈕釋放後重置按下標誌
}
}
}
void progfuncratenum(){
prognumresult1 = 0;
if(indot==0){
for (int i = 0; i < 4; i++) {
prognumresult1 = prognumresult1 * 10 + numbers3[i];
}
}else if(indot==1){
for (int i = 0; i <4; i++) {
prognumresult1 = prognumresult1 * 10 + numbers3[i];
}
prognumresult1 = prognumresult1 / 1000;
}else if(indot==2){
for (int i = 0; i <4; i++) {
prognumresult1 = prognumresult1 * 10 + numbers3[i];
}
prognumresult1 = prognumresult1 / 100;
}else if(indot==3){
for (int i = 0; i <4; i++) {
prognumresult1 = prognumresult1 * 10 + numbers3[i];
}
prognumresult1 = prognumresult1 / 10;
}
}
void progfuncvolnum(){
prognumresult2 = 0;
if(indot==0){
for (int i = 0; i < 4; i++) {
prognumresult2 = prognumresult2 * 10 + numbers5[i];
}
}else if(indot==1){
for (int i = 0; i <4; i++) {
prognumresult2 = prognumresult2 * 10 + numbers5[i];
}
prognumresult2 = prognumresult2 / 1000;
}else if(indot==2){
for (int i = 0; i <4; i++) {
prognumresult2 = prognumresult2 * 10 + numbers5[i];
}
prognumresult2 = prognumresult2 / 100;
}else if(indot==3){
for (int i = 0; i <4; i++) {
prognumresult2 = prognumresult2 * 10 + numbers5[i];
}
prognumresult2 = prognumresult2 / 10;
}
//Serial.println(prognumresult2);
}
void clearMatrix(float mat[5][4], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
mat[i][j] = 0.0;
}
}
}
//result4 syringe size ratevolstate ratetimestate result1 result2
void math(){
if (ratevolstate==1){
result1 = result1*0.001;
}
if (volvolstate==1){
result2 = result2*0.001;
}
startstate = (result2/result1)*60*1000; //time毫秒
if (ratetimestate==0){ //hr
startstate = startstate*60;
}
Serial.print("ratetimestate: ");
Serial.println(ratetimestate);
Serial.print("動作時間: ");
Serial.println(startstate);
Serial.println(result1,10);
Serial.println(result2,10);
syringeradius = result4/2;
Serial.print("syringe半徑: ");
Serial.println(syringeradius);
motoronecycle = syringeradius*syringeradius*3.1415926*screw; //一圈有多少的量
Serial.print("一圈有多少的量: ");
Serial.println(motoronecycle,10);
howstepvol = (0.18/360)*motoronecycle*0.001; //一步有多少的量
Serial.print("一步有多少的量: ");
Serial.println(howstepvol,10);
howstep = result1/howstepvol; //每分鐘要走幾步
Serial.print("每分鐘要走幾步: ");
Serial.println(howstep,10);
Serial.print("in math (int)howstep: ");
Serial.println((int)howstep);
howstepnum = result2/howstepvol;//總共要走幾步
howstepnum = round(howstepnum);
Serial.print("總共要走幾步: ");
Serial.println(howstepnum);
howcycle = howstep/2000; //每分鐘要轉幾圈
Serial.print("每分鐘要轉幾圈: ");
Serial.println(howcycle);
howcyclenum = howstepnum/2000; //每分鐘要轉幾圈
Serial.print("總共要轉幾圈: ");
Serial.println(howcyclenum);
}
void setStepInterval(int stepsPerMinute) {
// 計算每步的時間間隔(微秒)
stepInterval = ((6L * 10000L) / stepsPerMinute);
}
void setStepIntervalhr(int stepsPerMinute) {
// 計算每步的時間間隔(微秒)
stepInterval = ((36L * 100000L) / stepsPerMinute);
}
void porgrammath(){
prognum1 = matrix[programconnectnum][1];
prognum2 = matrix[programconnectnum][2];
if (ledmatrix[programconnectnum][0]==1){
prognum1 = matrix[programconnectnum][1]*0.001;
}
if (ledmatrix[programconnectnum][2]==1){
prognum2 = matrix[programconnectnum][2]*0.001;
}
startstate = (matrix[programconnectnum][2]/matrix[programconnectnum][1])*60*1000; //time毫秒
if (ledmatrix[programconnectnum][1]==0){ //hr
startstate = startstate*60;
}
syringeradius = result4/2;
motoronecycle = syringeradius*syringeradius*3.1415926*screw; //一圈有多少的量
howstepvol = (0.18/360)*motoronecycle*0.001; //一步有多少的量
howstep = prognum1/howstepvol; //每分鐘要走幾步
howstepnum = prognum2/howstepvol;//總共要走幾步
howstepnum = round(howstepnum);
howcycle = howstep/2000; //每分鐘要轉幾圈
howcyclenum = howstepnum/2000; //每分鐘要轉幾圈
}
void programstart(){
int buttonState11 = digitalRead(buttonPins[7]); // 讀取按鈕的狀態
if ((buttonState11 == LOW && !buttonPressed[7]) || startprogramcontinue==true) {
//Serial.println(indot);
//Serial.println(result1,4);
motor=true;
startTime = millis();
pressStartTime = millis();
while (digitalRead(buttonPins[7]) == LOW && millis() - pressStartTime < 1000) {
// 等待按鈕釋放或達到長按時間
}
if (millis() - pressStartTime < 1000) {
// 短按功能
if (matrix[0][0]==3){
cycletimes = matrix[0][1];
}else if (matrix[1][0]==3){
cycletimes = matrix[1][1];
}else if (matrix[2][0]==3){
cycletimes = matrix[2][1];
}else if (matrix[3][0]==3){
cycletimes = matrix[3][1];
}else if (matrix[4][0]==3){
cycletimes = matrix[4][1];
}
for(int d = 0; d < cycletimes; d++){
for(int i = 0; i < 4; i++){
programconnectnum = i;
if (matrix[i][0]==1) {
porgrammath();
stepsPerMinute = howstep ;
if (ledmatrix[programconnectnum][1]==1){
if(matrix[programconnectnum][3]==0){
digitalWrite(dirPin, LOW);
}
if(matrix[programconnectnum][3]==1){
digitalWrite(dirPin, HIGH);
digitalWrite(ledPin[6], HIGH);
}
setStepInterval(stepsPerMinute);
lastStepTime = micros();
motor=true;
while (motor==true){
digitalWrite(ledPin[7], HIGH);
if (((micros() - lastStepTime)/1000) >= stepInterval) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 保持高電平足夠短的時間
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
lastStepTime = micros();
stepsTaken++; // 增加步数计数器
//Serial.println(millis() - startTime);
if (stepsTaken >= (int)howstepnum) {
motor=false;
}
}
if (digitalRead(buttonPins[7]) == LOW){
motor=false;
startprogramcontinue=false;
//delay(1000);
}
}
}else if(ledmatrix[programconnectnum][1]==0){
if(matrix[programconnectnum][3]==0){
digitalWrite(dirPin, LOW);
}
if(matrix[programconnectnum][3]==1){
digitalWrite(dirPin, HIGH);
digitalWrite(ledPin[6], HIGH);
}
setStepIntervalhr(stepsPerMinute);
lastStepTime = micros();
motor=true;
while (motor==true){
digitalWrite(ledPin[7], HIGH);
if (((micros() - lastStepTime)/1000) >= stepInterval) {
//Serial.println(setStepIntervalhr);
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 保持高電平足夠短的時間
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
lastStepTime = micros();
stepsTaken++; // 增加步数计数器
//Serial.println(millis() - startTime);
if (stepsTaken >= (int)howstepnum) {
motor=false;
}
}
if (digitalRead(buttonPins[7]) == LOW){
i = 4;
motor=false;
//delay(1000);
}
}
}
}else if(matrix[i][0]==2){
startprogrampause = true;
float timestop = matrix[i][1];
float pretimestop = (int)(timestop/100);
float backtimestop = (int)(timestop)-(int)(timestop/100)*100;
unsigned long alltimestop = (pretimestop*60)+backtimestop;
lastStepTime = micros();
while(startprogrampause == true){
digitalWrite(ledPin[7], HIGH);
if (((micros() - lastStepTime)/1000) >= (alltimestop*60*1000)) {
startprogrampause = false;
lastStepTime = micros();
}
if (digitalRead(buttonPins[7]) == LOW){
i = 4;
startprogrampause = false;
//delay(1000);
}
}
digitalWrite(ledPin[7], LOW);
}else if(matrix[i][0]==3){
i = 4;
}
stepsTaken = 0;
}
}
}else {
// 長按功能
startlongpress = true;
while(startlongpress == true){
digitalWrite(ledPin[7], HIGH);
int steps = 200; // 假設200步是一圈
for (int i = 0; i < steps; i++) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(500); // 步進脈衝時間間隔
digitalWrite(stepperPin, LOW);
delayMicroseconds(500);
}
if (digitalRead(buttonPins[7]) == HIGH){
startlongpress = false;
}
}
}
buttonPressed[7] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState11 == HIGH && buttonPressed[7]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[7] = false; // 按鈕釋放後重置按下標誌
}
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[6], LOW);
stepsTaken = 0;
startprogramcontinue == true;
}
void direct1(){
int buttonState = digitalRead(buttonPins[9]); // 讀取按鈕的狀態
if (buttonState == LOW && !buttonPressed[9]) { // 檢查按鈕是否被按下且未被報告過
direct++;
if(direct==2){
direct=0;
}
if (direct==0){
digitalWrite(ledPin[6], LOW);
digitalWrite(dirPin, LOW);
}else if (direct==1){
digitalWrite(dirPin, HIGH);
digitalWrite(ledPin[6], HIGH);
}
buttonPressed[9] = true; // 按鈕被按下後設置按下標誌
} else if (buttonState == HIGH && buttonPressed[9]) { // 檢查按鈕是否釋放且已被報告過
buttonPressed[9] = false; // 按鈕釋放後重置按下標誌
}
}