#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // Kết nối LCD với chân 13,12,11,10,9,8 của Arduino
int encoderPinA = 3; // Chân A của encoder kết nối với chân 3 của Arduino
int encoderPinB = 4; // Chân B của encoder kết nối với chân 4 của Arduino
int encoderButtonPin = 2; // Chân nút nhấn của encoder kết nối với chân 2 của Arduino
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
void setup() {
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(encoderButtonPin, INPUT_PULLUP);
lcd.begin(16, 2); // Khởi tạo màn hình LCD 16x2
lcd.print("Nhap du lieu");
// Gắn hàm resetValue vào sự kiện nhấn nút của encoder
attachInterrupt(digitalPinToInterrupt(encoderButtonPin), resetValue, LOW);
}
void loop() {
if (rotated()) {
encoderValue += (encoderDirection() == 1) ? 1 : -1; // Cộng hoặc trừ 1 tùy thuộc vào hướng quay
displayValue(); // Hiển thị giá trị lên màn hình
delay(200); // Đợi để tránh việc nhận nhiều lần xoay trong thời gian ngắn
}
}
boolean rotated() {
int MSB = digitalRead(encoderPinA); // Đọc trạng thái của chân A của encoder
int LSB = digitalRead(encoderPinB); // Đọc trạng thái của chân B của encoder
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
return true; // Xác định có sự thay đổi hướng quay
} else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
return true; // Xác định có sự thay đổi hướng quay
}
lastEncoded = encoded;
return false;
}
int encoderDirection() {
int MSB = digitalRead(encoderPinA); // Đọc trạng thái của chân A của encoder
int LSB = digitalRead(encoderPinB); // Đọc trạng thái của chân B của encoder
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
return 1; // Hướng quay phải
} else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
return -1; // Hướng quay trái
}
lastEncoded = encoded;
return 0; // Không có sự thay đổi hướng quay
}
void displayValue() {
lcd.clear(); // Xóa màn hình LCD để cập nhật giá trị mới
lcd.setCursor(0, 0);
lcd.print("Gia tri encoder:");
lcd.setCursor(0, 1);
lcd.print(encoderValue);
}
void resetValue() {
encoderValue = 0; // Reset giá trị về 0 khi nhấn nút
displayValue(); // Hiển thị giá trị đã được reset lên màn hình
}