// [][][][] [][][][] [] [] [][] [][][][]
// [] [] [] [] [] [] [] [] []
// [] [][] [] [] [] [] [] [] [] []
// [] [] [] [][][][] [][][][] [][][][] []
// [] [][] [] [] [] [] [] [] []
// [] [] [] [] [] [] [] []
// [][][][] [] [] [] [] [] []
// # คู่มือการใช้งานโปรแกรมล็อกรหัสด้วยแป้นพิมพ์และจอ LCD พร้อมเซอร์โวมอเตอร์
// ## รายการอุปกรณ์
// 1. ESP32 board
// 2. แป้นพิมพ์ (Keypad) แบบ 4x4
// 3. จอแสดงผล LCD (LiquidCrystal_I2C) ขนาด 16x2
// 4. เซอร์โวมอเตอร์ (Servo Motor)
// 5. สายไฟ (Jumper wires)
// 6. ปุ่มกด (Button)
// ## การเชื่อมต่อฮาร์ดแวร์
// ### การเชื่อมต่อแป้นพิมพ์
// - **แถว (ROWS):**
// - Pin 23 (ESP32) -> Pin แถว 1 (Keypad)
// - Pin 19 (ESP32) -> Pin แถว 2 (Keypad)
// - Pin 18 (ESP32) -> Pin แถว 3 (Keypad)
// - Pin 5 (ESP32) -> Pin แถว 4 (Keypad)
// - **คอลัมน์ (COLS):**
// - Pin 4 (ESP32) -> Pin คอลัมน์ 1 (Keypad)
// - Pin 2 (ESP32) -> Pin คอลัมน์ 2 (Keypad)
// - Pin 15 (ESP32) -> Pin คอลัมน์ 3 (Keypad)
// - Pin 14 (ESP32) -> Pin คอลัมน์ 4 (Keypad)
// ### การเชื่อมต่อจอ LCD
// - **VCC** -> 3.3V (ESP32)
// - **GND** -> GND (ESP32)
// - **SCL** -> SCL (ESP32)
// - **SDA** -> SDA (ESP32)
// ### การเชื่อมต่อเซอร์โวมอเตอร์
// - **VCC** -> 5V (ESP32)
// - **GND** -> GND (ESP32)
// - **Signal** -> Pin 13 (ESP32)
// ### การเชื่อมต่อปุ่มกด
// - **หนึ่งขาของปุ่ม** -> Pin 27 (ESP32)
// - **อีกขาของปุ่ม** -> GND (ESP32)
// ### การเชื่อมต่อ LED
// - **Anode (ยาวกว่า)** -> Pin 12 (ESP32) พร้อมตัวต้านทาน 220 โอห์ม
// - **Cathode (สั้นกว่า)** -> GND (ESP32)
// ## การติดตั้งไลบรารี
// 1. เปิด Arduino IDE
// 2. ไปที่ Sketch -> Include Library -> Manage Libraries
// 3. ค้นหาและติดตั้งไลบรารี `Keypad`, `LiquidCrystal_I2C` และ `ESP32Servo`
// ## ขั้นตอนการใช้งานโปรแกรม
// 1. ต่อแผงวงจรตามการเชื่อมต่อที่ระบุ
// 2. เปิด Arduino IDE แล้วอัพโหลดโค้ดที่ให้ไปยังบอร์ด ESP32
// 3. เมื่อเปิดระบบ จอ LCD จะแสดงข้อความ "Enter Code"
// 4. กดปุ่มหมายเลขตามรหัสที่ต้องการป้อน
// 5. กด `A` เพื่อตรวจสอบรหัสที่ป้อน
// - หากรหัสถูกต้อง จะแสดงข้อความ "The door open!!" บนจอ LCD, LED จะสว่างและเซอร์โวมอเตอร์จะหมุนเพื่อเปิดประตู
// - หากรหัสไม่ถูกต้อง จะแสดงข้อความ "Wrong Code!" บนจอ LCD
// 6. กด `B` เพื่อลบรหัสที่ป้อนทีละตัว
// 7. กด `C` เพื่อลบรหัสทั้งหมดและเริ่มป้อนใหม่
// 8. สามารถกดปุ่มที่เชื่อมต่อกับ Pin 27 เพื่อเปิดประตูได้ทันที โดยเซอร์โวมอเตอร์จะหมุนเพื่อเปิดประตูและ LED จะสว่าง
// โปรแกรมนี้ช่วยให้ผู้ใช้งานสามารถใช้แป้นพิมพ์ จอ LCD เซอร์โวมอเตอร์ และปุ่มกดในการล็อกอินด้วยรหัสผ่านและควบคุมการเปิดปิดประตูได้อย่างง่ายดาย
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
Servo myservo;
int menu = 0;
int button_pin = 27;
bool button_press = false;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 4, 2, 15, 14 };
uint8_t rowPins[ROWS] = { 23, 19, 18, 5 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String enteredCode = "";
const String correctCode = "1234";
bool codeEntered = false;
void setup() {
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
pinMode(button_pin, INPUT);
myservo.attach(13);
myservo.write(180);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Enter Code");
}
void loop() {
// การกดรหัส
char key = keypad.getKey();
if (key != NO_KEY) {
// การกดยืนยันรหัสผ่าน
if (key == 'A') {
if (enteredCode == correctCode) {
lcd.setCursor(0, 0);
lcd.print("The door open!!");
digitalWrite(12, HIGH);
myservo.write(0);
delay(3000);
digitalWrite(12, LOW);
myservo.write(180);
} else {
lcd.setCursor(0, 0);
lcd.print("Wrong Code! ");
lcd.setCursor(0, 1);
lcd.print("PIN: ");
}
delay(1000);
lcd.clear();
enteredCode = "";
// การลบรหัสผ่าน ที่ละตัว
} else if (key == 'B') {
if (enteredCode.length() > 0) {
enteredCode.remove(enteredCode.length() - 1);
lcd.setCursor(0, 1);
lcd.print("PIN: " + enteredCode + " ");
}
// ลบรหัสผ่านทั้งหมด
} else if (key == 'C') {
enteredCode = ""; // ลบรหัสทั้งหมด
lcd.setCursor(0, 1);
lcd.print("PIN: ");
} else if (key >= '0' && key <= '9' && enteredCode.length() < 4) {
enteredCode += key;
lcd.setCursor(0, 1);
lcd.print("PIN: " + enteredCode + " ");
}
}
// การกดปุ่ม
int button_state = digitalRead(button_pin);
if (button_state == HIGH && !button_press) {
if (button_state == HIGH) {
digitalWrite(12, HIGH);
lcd.clear();
lcd.print("The door open!!");
myservo.write(0);
delay(3000);
digitalWrite(12, LOW);
lcd.clear();
myservo.write(180);
}
}
}