#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <Thread.h>
// Khai báo các chân kết nối với màn hình LCD2002
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 20
#define LCD_ROWS 4
// Khai báo các chân kết nối với động cơ
#define MOTOR_PIN 9
// Khai báo các biến
volatile long encoderValue = 0;
volatile long lastEncoderValue = 0;
volatile int motorSpeed = 0;
volatile bool motorRunning = false;
// Khai báo đối tượng LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
// Khai báo đối tượng encoder
Encoder encoder(2, 3);
// Khai báo đối tượng luồng điều khiển động cơ
Thread motorThread;
// Hàm thực hiện tác vụ điều khiển động cơ
void motorTask() {
while (true) {
if (motorRunning) {
analogWrite(MOTOR_PIN, motorSpeed);
} else {
analogWrite(MOTOR_PIN, 0);
}
delay(10);
}
}
// Hàm đọc giá trị từ rotary encoder
void readEncoder() {
long newEncoderValue = encoder.read();
if (newEncoderValue != lastEncoderValue) {
encoderValue += (newEncoderValue - lastEncoderValue);
lastEncoderValue = newEncoderValue;
}
}
void setup() {
// Khởi tạo đối tượng LCD
lcd.init();
lcd.backlight();
// Khởi tạo đối tượng encoder
encoder.write(0);
// Khởi tạo đối tượng luồng điều khiển động cơ
motorThread.onRun(motorTask);
motorThread.setInterval(10);
//motorThread.setPriority(HIGH_PRIORITY);
//myThread.setStackSizeInWords(64);
//motorThread.run();
}
void loop() {
// Đọc giá trị từ rotary encoder
readEncoder();
// Hiển thị giá trị tốc độ động cơ lên màn hình LCD
lcd.setCursor(0, 0);
lcd.print("Motor Speed: ");
lcd.print(motorSpeed);
lcd.print(" ");
// Hiển thị giá trị từ rotary encoder lên màn hình LCD
lcd.setCursor(0, 1);
lcd.print("Encoder Value: ");
lcd.print(encoderValue);
lcd.print(" ");
// Kiểm tra nút nhấn của rotary encoder
if (digitalRead(4) == LOW) {
motorRunning = !motorRunning;
delay(100);
}
// Cập nhật tốc độ động cơ từ giá trị của rotary encoder
motorSpeed = map(encoderValue, -100, 100, 0, 255);
motorSpeed = constrain(motorSpeed, 0, 255);
// Chuyển đổi giữa các luồng
delay(0);
}