#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include <Keypad.h>
// Định nghĩa chân cho driver động cơ bước
#define dirPin 8
#define stepPin 9
#define enablePin 10
#define phimchaytrai 12
#define phimchayphai 11
// Khai báo thông số động cơ bước
long xung = 8000; // cần 8000 xung để quay 1 góc 360 độ
long gocdomax = 180; // góc quay tối đa mặc định
// Khai báo và cấu hình bàn phím
const byte ROWS = 4; // Bốn hàng
const byte COLS = 3; // Ba cột
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {7, 6, 5, 4}; // Kết nối với các hàng của bàn phím
byte colPins[COLS] = {3, 2, 13}; // Kết nối với các cột của bàn phím
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Khai báo LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Khai báo động cơ bước với AccelStepper
AccelStepper stepper = AccelStepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
// Các cài đặt khác ở đây
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, LOW); // Enable động cơ
// Cấu hình cho nút nhấn với chế độ pull-up
pinMode(phimchaytrai, INPUT_PULLUP);
pinMode(phimchayphai, INPUT_PULLUP);
// Các cài đặt khởi tạo khác
lcd.init();
lcd.backlight();
stepper.setMaxSpeed(2000);
stepper.setAcceleration(400);
Serial.begin(9600);
showStartupScreen();
// Phần mới cho việc nhập gocdomax
bool done = false;
gocdomax = 180; // Giá trị mặc định
while (!done) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Goc max: ");
lcd.print(gocdomax);
lcd.setCursor(0, 1);
lcd.print("Nhap goc max");
char key = keypad.waitForKey(); // Chờ đợi phím được nhấn waitForKey()
if (key == '*') {
done = true; // Thoát khỏi vòng lặp, tiếp tục chương trình
lcd.clear();
lcd.blink();
lcd.setCursor(0, 1);
lcd.print("Goc max: ");
lcd.print( gocdomax);
lcd.setCursor(0, 0);
lcd.print("Goc uon:");
} else if (key == '#') {
// Reset giá trị gocdomax để nhập lại
gocdomax = 0; // Reset về nhập lại
} else if (isdigit(key)) {
// Cập nhật gocdomax dựa trên input
gocdomax = (gocdomax * 10) + (key - '0'); // Giả sử nhập liên tiếp các chữ số
}
// Bổ sung kiểm tra và xử lý thêm nếu cần
}
}
void loop() {
char key = keypad.getKey();
static String gocDoStr = ""; // Dùng để lưu trữ góc độ đã nhập
static int gocDo = 0; // Góc độ hiện tại đã nhập
// Kiểm tra các phím nhấn và điều khiển động cơ
static bool running = false; // Biến trạng thái động cơ
if (digitalRead(phimchaytrai) == LOW) { // Nếu nút chạy trái được nhấn
if (!running) { // Kiểm tra nếu động cơ chưa đang chạy
stepper.move(-1000000); // Di chuyển một khoảng lớn để đảm bảo nó sẽ chạy cho đến khi nút được thả
running = true;
}
} else if (digitalRead(phimchayphai) == LOW) { // Nếu nút chạy phải được nhấn
if (!running) { // Kiểm tra nếu động cơ chưa đang chạy
stepper.move(1000000); // Di chuyển một khoảng lớn để đảm bảo nó sẽ chạy cho đến khi nút được thả
running = true;
}
} else {
if (running) { // Nếu không có nút nào được nhấn và động cơ đang chạy
stepper.stop(); // Dừng động cơ
//stepper.runToPosition(); // Chờ động cơ dừng hẳn
running = false;
//stepper.setCurrentPosition(0);
}
}
if (key) {
if (key == '*') {
// Khi nhập xong góc độ và nhấn *, chuyển đổi góc độ sang bước và di chuyển động cơ
gocDo = gocDoStr.toInt();
if (gocDo > gocdomax) { // Giới hạn góc độ tối đa là góc độ max
gocDo = 0;
lcd.clear();
lcd.print("Goc max: ");
lcd.print( gocdomax);
delay(2000); // Hiển thị thông báo trong 2 giây
gocDoStr = "";
}
long steps = (long)gocDo * xung / 360; // Giả sử xung chia cho 360 độ
stepper.move(steps);
gocDoStr = ""; // Reset chuỗi sau khi xử lý
} else if (key == '#') {
// Khi nhấn #, quay trở lại vị trí ban đầu
stepper.stop(); // Dừng động cơ
stepper.moveTo(0);
gocDoStr = "";
} else if (isdigit(key)) {
// Nếu phím nhấn là số, thêm vào chuỗi góc độ
gocDoStr += key;
}
lcd.clear();
lcd.blink();
lcd.setCursor(0, 1);
lcd.print("Goc max: ");
lcd.print( gocdomax);
lcd.setCursor(0, 0);
lcd.print("Goc uon:");
lcd.print(gocDoStr);
}
stepper.run();
}
void showStartupScreen() // Hiển thị màn hình khởi động
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("- -");
lcd.setCursor(0, 1);
lcd.print("- -");
delay(150);
lcd.setCursor(0, 0);
lcd.print("-- --");
lcd.setCursor(0, 1);
lcd.print("-- --");
delay(100);
lcd.setCursor(0, 0);
lcd.print("--BI ER--");
lcd.setCursor(0, 1);
lcd.print("---0 1---");
delay(70);
lcd.setCursor(0, 0);
lcd.print("--BIGB AKER--");
lcd.setCursor(0, 1);
lcd.print("---09 01---");
delay(50);
lcd.setCursor(0, 0);
lcd.print("--BIGBOY_MAKER--");
lcd.setCursor(0, 1);
lcd.print("---0935797901---");
delay(5000);
lcd.clear();
}