#include <Wire.h>
#include <RTClib.h>
#include <Keypad.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// สร้างอ็อบเจ็กต์ RTC
RTC_DS3231 rtc;
// สร้างอ็อบเจ็กต์ LCD โดยใช้ I2C address 0x27 และขนาด 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// สร้างอ็อบเจ็กต์ Servo
Servo myservo;
// ตัวแปรสำหรับการตั้งเวลา
int setHour = 0;
int setMinute = 0;
bool timeSet = false;
bool servoTriggered = false;
// ขนาดของแป้นพิมพ์
const byte ROWS = 4;
const byte COLS = 4; // ปรับขนาดเป็น 4 แถว 4 คอลัมน์
// การตั้งค่าแป้นพิมพ์
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'} // เพิ่มปุ่ม * 0 และ #
};
// พินที่เชื่อมต่อกับแถวและคอลัมน์ของแป้นพิมพ์
byte rowPins[ROWS] = {2, 3, 4, 5}; // ใช้แถว 4 แถว
byte colPins[COLS] = {6, 7, 8, 9}; // ใช้คอลัมน์ 4 คอลัมน์
// สร้างอ็อบเจ็กต์ Keypad
Keypad customKeypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
myservo.attach(10); // เชื่อมต่อเซอร์โวกับพิน 10
Serial.begin(9600); // เริ่มต้นการสื่อสารผ่าน Serial
lcd.begin(16, 2); // เริ่มต้น LCD โดยระบุขนาดเป็น 16x2
lcd.setBacklight(255); // เปิดไฟหลัง LCD
// ตรวจสอบว่ามีการเชื่อมต่อกับ RTC หรือไม่
if (!rtc.begin()) {
lcd.print("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
lcd.print("RTC lost power");
// กำหนดวันที่และเวลาเริ่มต้น (กำหนดใหม่ตามต้องการ)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.print("Set Time: HH:MM");
}
void loop() {
char customKey = customKeypad.getKey();
if (customKey) {
Serial.println(customKey);
if (customKey >= '0' && customKey <= '9') {
// ตั้งเวลาสำหรับเซอร์โว
if (!timeSet) {
if (setHour < 10) {
setHour = setHour * 10 + (customKey - '0');
lcd.setCursor(5, 0);
lcd.print(setHour < 10 ? "0" : "");
lcd.print(setHour);
} else if (setHour >= 10 && setMinute < 10) {
setMinute = setMinute * 10 + (customKey - '0');
lcd.setCursor(8, 0);
lcd.print(setMinute < 10 ? "0" : "");
lcd.print(setMinute);
}
}
} else if (customKey == '#') {
// กด # เพื่อยืนยันเวลา
timeSet = true;
lcd.setCursor(0, 1);
lcd.print("Time set, wait...");
} else if (customKey == '*') {
// กด * เพื่อรีเซ็ตเวลา
setHour = 0;
setMinute = 0;
timeSet = false;
servoTriggered = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Time: HH:MM");
lcd.setCursor(0, 1);
lcd.print("Press # to set");
}
}
// ตรวจสอบเวลาและควบคุมเซอร์โว
if (timeSet && !servoTriggered) {
DateTime now = rtc.now();
if (now.hour() == setHour && now.minute() == setMinute) {
myservo.write(0); // สั่งให้ Servo หมุนไปองศาที่ 0
delay(3500); // หน่วงเวลา 1000ms
myservo.write(90); // สั่งให้ Servo หมุนไปองศาที่ 90
delay(1000); // หน่วงเวลา 1000ms
servoTriggered = true; // เซอร์โวทำงานแล้ว
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Done!");
}
}
}