#include <Servo.h>
#include <LiquidCrystal.h>
#define OK_BUTTON 4
#define BUZZER_PIN 13
#define SERVO_PIN A0
Servo tap;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int servoAngle = 0;
int servoStep = 5; // Mỗi lần nhấn nút, servo sẽ quay thêm 5 độ
int minAngle = 0; // Góc quay tối thiểu
int maxAngle = 180; // Góc quay tối đa
unsigned long buttonPressStartTime = 0; // Thời điểm bắt đầu nhấn nút
bool longPressDetected = false; // Trạng thái nhấn giữ nút
void setup() {
pinMode(OK_BUTTON, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
lcd.begin(16, 2);
tap.attach(SERVO_PIN);
noTone(BUZZER_PIN);
printAngle();
}
void loop() {
if (digitalRead(OK_BUTTON) == HIGH) {
// Nếu nút OK được nhấn
if (!longPressDetected) {
// Nếu chưa phát hiện long press
buttonPressStartTime = millis(); // Lưu thời điểm bắt đầu nhấn nút
longPressDetected = true; // Đã phát hiện long press
}
if (millis() - buttonPressStartTime >= 3000 && millis() - buttonPressStartTime < 5000) {
// Nếu đã nhấn giữ nút trên 3 giây nhưng chưa đến 5 giây
servoAngle -= servoStep; // Quay servo ngược kim đồng hồ
if (servoAngle < minAngle) {
servoAngle = minAngle; // Đặt lại góc nếu quá giới hạn
}
tap.write(servoAngle); // Gửi góc quay mới tới servo
printAngle(); // Hiển thị góc servo lên LCD
} else if (millis() - buttonPressStartTime >= 5000) {
// Nếu đã nhấn giữ nút trên 5 giây
longPressDetected = false; // Đặt lại trạng thái nhấn nút
servoAngle = 0; // Đặt góc servo về 0 độ
tap.write(servoAngle); // Gửi góc quay mới tới servo
printAngle(); // Hiển thị góc servo lên LCD
} else {
// Nếu nhấn nút nhưng chưa đủ lâu để được xem xét là long press
if (servoAngle + servoStep <= maxAngle) {
// Kiểm tra xem servo có thể quay thêm 5 độ không vượt quá giới hạn tối đa
servoAngle += servoStep; // Tăng góc servo
tap.write(servoAngle); // Gửi góc quay mới tới servo
printAngle(); // Hiển thị góc servo lên LCD
} else {
// Nếu servo không thể quay thêm 5 độ mà vượt quá giới hạn tối đa
for (int i = 0; i < 3; i++) {
tone(BUZZER_PIN, 1000); // Bật còi
delay(200); // Đợi 0.2 giây
noTone(BUZZER_PIN); // Tắt còi
delay(200); // Đợi 0.2 giây
}
servoAngle = 0; // Đặt góc servo về 0 độ
tap.write(servoAngle); // Gửi góc quay mới tới servo
printAngle(); // Hiển thị góc servo lên LCD
}
}
delay(200); // Chờ 0.2 giây để tránh việc nhận nhiều lần nhấn từ nút
} else {
// Nếu không nhấn nút
longPressDetected = false; // Đặt lại trạng thái nhấn nút
}
}
void printAngle() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Servo Angle: ");
lcd.print(servoAngle);
}