// [][][][] [][][][] [] [] [][] [][][][]
// [] [] [] [] [] [] [] [] []
// [] [][] [] [] [] [] [] [] [] []
// [] [] [] [][][][] [][][][] [][][][] []
// [] [][] [] [] [] [] [] [] []
// [] [] [] [] [] [] [] []
// [][][][] [] [] [] [] [] []
// # คู่มือการใช้งานโปรแกรมล็อกรหัสด้วยแป้นพิมพ์และจอ OLED พร้อมเซอร์โวมอเตอร์
// ## รายการอุปกรณ์
// 1. ESP32 board
// 2. แป้นพิมพ์ (Keypad) แบบ 4x4
// 3. จอแสดงผล OLED ขนาด 128x64 (Adafruit SSD1306)
// 4. เซอร์โวมอเตอร์ (Servo Motor)
// 5. สายไฟ (Jumper wires)
// 6. ปุ่มกด (Button)
// 7. LED พร้อมตัวต้านทาน 220 โอห์ม
// ## การเชื่อมต่อฮาร์ดแวร์
// ### การเชื่อมต่อแป้นพิมพ์
// - **แถว (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)
// ### การเชื่อมต่อจอ OLED
// - **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`, `Adafruit SSD1306`, และ `ESP32Servo`
// ## ขั้นตอนการใช้งานโปรแกรม
// 1. ต่อแผงวงจรตามการเชื่อมต่อที่ระบุ
// 2. เปิด Arduino IDE แล้วอัพโหลดโค้ดที่ให้ไปยังบอร์ด ESP32
// 3. เมื่อเปิดระบบ จอ OLED จะแสดงข้อความที่ถูกต้องตามการป้อนข้อมูลของคุณ
// 4. กดปุ่มหมายเลขตามรหัสที่ต้องการป้อน
// 5. กด `A` เพื่อตรวจสอบรหัสที่ป้อน
// - หากรหัสถูกต้อง จะแสดงข้อความ "open !" บนจอ OLED, LED จะสว่างและเซอร์โวมอเตอร์จะหมุนเพื่อเปิดประตู
// - หากรหัสไม่ถูกต้อง จะแสดงข้อความ "Wrong" บนจอ OLED
// 6. กด `C` เพื่อลบรหัสทั้งหมดและเริ่มป้อนใหม่
// 7. สามารถกดปุ่มที่เชื่อมต่อกับ Pin 27 เพื่อเปิดประตูได้ทันที โดยเซอร์โวมอเตอร์จะหมุนเพื่อเปิดประตูและ LED จะสว่าง
// ## การทำงานของโปรแกรม
// - เมื่อโปรแกรมเริ่มต้นทำงาน จอ OLED จะพร้อมแสดงผล
// - เมื่อผู้ใช้งานกดปุ่มบนแป้นพิมพ์ จอ OLED จะแสดงผลลัพธ์การกดปุ่มนั้น
// - การกด `A` จะทำการตรวจสอบรหัสที่ป้อน
// - หากรหัสถูกต้อง: จะแสดง "open !", LED จะสว่างและเซอร์โวมอเตอร์จะหมุนไปที่ตำแหน่งเปิด
// - หากรหัสไม่ถูกต้อง: จะแสดง "Wrong"
// - การกด `C` จะลบรหัสทั้งหมดที่ป้อนไว้
// - การกดปุ่มกดที่เชื่อมต่อกับ Pin 27 จะเปิดประตูทันที โดยเซอร์โวมอเตอร์จะหมุนไปที่ตำแหน่งเปิดและ LED จะสว่าง
// โปรแกรมนี้ช่วยให้ผู้ใช้งานสามารถใช้แป้นพิมพ์ จอ OLED เซอร์โวมอเตอร์ และปุ่มกดในการล็อกอินด้วยรหัสผ่านและควบคุมการเปิดปิดประตูได้อย่างง่ายดาย
#include <Keypad.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
Servo myservo;
int menu = 0;
int button_pin = 27;
bool button_press = false;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
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";
void setup() {
Serial.begin(115200);
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
pinMode(button_pin, INPUT);
myservo.attach(13);
myservo.write(180);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(3);
display.setCursor(0, 16);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);
display.print(key);
display.display();
if (key == 'A') {
if (enteredCode == correctCode) {
display.clearDisplay();
display.setCursor(0, 16);
display.println("open !");
display.display();
digitalWrite(12, HIGH);
myservo.write(0);
delay(3000);
digitalWrite(12, LOW);
myservo.write(180);
display.clearDisplay();
display.display();
enteredCode = "";
display.setCursor(0, 16);
} else {
display.clearDisplay();
display.setCursor(0, 16);
display.println("Wrong");
display.display();
delay(3000);
display.clearDisplay();
display.display();
enteredCode = "";
display.setCursor(0, 16);
}
} else if (key == 'C') {
display.clearDisplay();
display.display();
enteredCode = "";
display.setCursor(0, 16);
} else {
enteredCode += key;
}
}
int button_state = digitalRead(button_pin);
if (button_state == HIGH && !button_press) {
if (button_state == HIGH) {
digitalWrite(12, HIGH);
display.clearDisplay();
display.setCursor(0, 16);
display.println("open !");
display.display();
myservo.write(0);
delay(3000);
digitalWrite(12, LOW);
display.clearDisplay();
display.display();
enteredCode = "";
display.setCursor(0, 16);
myservo.write(180);
}
}
}