نحوه اتصال کیپد به برد ESP32 (آموزش جامع)

این یک راهنمای کامل برای اتصال کیپد به ESP32 است. در این مقاله، شما یاد میگیرید چگونه از ماتریس کیپد ESP32 با Arduino IDE استفاده کنید. چند مثال عملی ایجاد میکنیم تا موضوع را تمرین کنید و شما میتوانید این مثالها را برای رسیدن به نیازهای پروژه خود تغییر دهید. مثال اول نحوه اتصال ESP32 به کیپدهای 4×4 و 4×3 را نشان میدهد، سپس استفاده از کیپد همراه با LCD و در نهایت ایجاد یک سیستم قفل الکترونیکی مبتنی بر رمز عبور با کیپد و LCD ESP32 را آموزش میدهیم.
مثالهای کاربردی کیپد ESP32 که در این آموزش ایجاد میکنیم عبارتند از:
- مثال دمو اتصال کیپد ESP32 برای ماتریس 4×4 و 3×4
- مثال استفاده از کیپد ESP32 با LCD (با i2c LCD)
- سیستم قفل مبتنی بر رمز عبور با کیپد ESP32
اتصال کیپد به برد ESP32
کیپد یک ماتریس از دکمهها است که در ردیفها و ستونها به هم متصل شدهاند تا واحد کامل را تشکیل دهند. در نرمافزار، از طریق پینهای ردیف و ستون روی میکروکنترلر اسکن انجام میدهیم تا تشخیص دهیم کدام کلید توسط کاربر فشار داده شده است. در ادامه، نمودار داخلی کیپد به وضوح نشان داده شده است.

تصویر زیر پین اوت کیپد را نشان میدهد:

برای کیپد 4×4، تعداد 8 پین وجود دارد (4 ردیف و 4 ستون). و برای کیپد 4×3، تعداد 6 پین (4 ردیف و 3 ستون) موجود است.
نحوه اتصال ESP32 به کیپد 4×4 و 4×3 به شکل زیر است.


کتابخانه کی پد ESP32 (Arduino Core)
قبل از استفاده از کیپد، ابتدا باید کتابخانه Keypad برای ESP32 Arduino core نصب شود، زیرا این کتابخانه در Arduino به صورت پیشفرض وجود ندارد. نصب آن ساده است؛ کافیست از منوی Tools، Library Manager را باز کنید.
سپس، نام کتابخانه کی پد را جستجو کرده و روی Install کلیک کنید.
پس از نصب، میتوانید کتابخانه Keypad را در هر پروژهای با وارد کردن فایل هدر کتابخانه استفاده کنید:
#include <Keypad.h>
شما باید تعداد ردیفها و ستونها در کیپد خود را مشخص کنید (برای ماتریس 4×4، 4 ردیف و 4 ستون) و همینطور برای سایر انواع کیپدها. این کار با تعریفهای زیر انجام میشود:
#define ROWS 4 #define COLS 4
سپس باید یک keyMap ایجاد کنید که کاراکترهای متناظر با هر کلید روی کیپد را مشخص کند. این کار با تعریف یک آرایه دوبعدی انجام میشود:
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
در مرحله بعد باید پینهای GPIO که برای اتصال کیپد استفاده میکنیم، مشخص شوند. پینهای ردیف و ستون با تعریف دو آرایه زیر انجام میشود:
uint8_t rowPins[ROWS] = {14, 27, 26, 25}; // GPIO14, GPIO27, GPIO26, GPIO25
uint8_t colPins[COLS] = {33, 32, 18, 19}; // GPIO33, GPIO32, GPIO18, GPIO19
حال باید یک نمونه از کلاس Keypad ایجاد کرده و تمام اطلاعات قبلی را به آن بدهیم:
Keypad keypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
برای خواندن وضعیت کیپد، کافیست از تابع زیر استفاده کنید که کاراکتر متناظر با کلیدی که توسط کاربر فشار داده شده را برمیگرداند:
char key = keypad.getKey();
این مراحل پایهای برای استفاده از کیپد ESP32 هستند و در مثالهای بعدی این آموزش عملی خواهند شد.
برخی از توابع مفید در کتابخانه Keypad
در اینجا مروری کوتاه بر برخی از توابع کاربردی کتابخانه Keypad ارائه شده است که ممکن است در پروژه خود به آنها نیاز داشته باشید:
setDebounceTime(unsigned int time)مدت زمان بر حسب میلیثانیه را تعیین میکند که کیپد قبل از پذیرش فشردن کلید جدید منتظر میماند.KeyState getState()وضعیت فعلی هر کلید را برمیگرداند. چهار وضعیت موجود شامل IDLE، PRESSED، RELEASED و HOLD است.setHoldTime(unsigned int time)مدت زمان بر حسب میلیثانیه که کاربر باید یک دکمه را نگه دارد تا وضعیت HOLD فعال شود را تنظیم میکند.addEventListener(keypadEvent)رویدادی را فعال میکند در صورتی که کیپد کلیک شود. شما باید تابع callback خود را به آن بدهید.boolean keyStateChanged()وضعیت تغییر کلید را اطلاع میدهد. به جای بررسی مداوم وضعیت کلید، میتوانید متوجه شوید که آیا تغییر کرده است یا خیر.char waitForKey()تا زمانی که کسی کلیدی را فشار دهد، منتظر میماند. توجه داشته باشید که این یک رویه blocking است و ممکن است باعث اختلال در زمانبندی سیستم یا ایجاد تأخیر غیرمنتظره شود.
کد ساده اتصال کیپد به برد ESP32
در ادامه دو مثال برای تست عملکرد کتابخانه کیپد ESP32 با ماتریسهای 4×4 و 4×3 ارائه شده است. شما میتوانید کد را برای دستیابی به عملکردهای مختلف تغییر دهید.
در این مثالها، فشردن هر کلید روی کیپد باعث ارسال کاراکتر متناظر آن کلید به سریال مانیتور میشود. این یک برنامه ساده برای تست عملکرد کیپد است.
#include <Keypad.h>
#define ROWS 4
#define COLS 4
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uint8_t rowPins[ROWS] = {14, 27, 26, 25}; // GPIO14, GPIO27, GPIO26, GPIO25
uint8_t colPins[COLS] = {33, 32, 18, 19}; // GPIO33, GPIO32, GPIO18, GPIO19
Keypad keypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(115200);
}
void loop(){
char key = keypad.getKey();
if (key) {
Serial.println(key);
}
}
خروجی روی سریال مانیتور نشان میدهد که تمام کلیدها همانطور که انتظار میرود به درستی کار میکنند.

کد نمونه کیپد 3*4
#include <Keypad.h>
#define ROWS 4
#define COLS 3
char keyMap[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
uint8_t rowPins[ROWS] = {14, 27, 26, 25}; // GPIO14, GPIO27, GPIO26, GPIO25
uint8_t colPins[COLS] = {33, 32, 18}; // GPIO33, GPIO32, GPIO18
Keypad keypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(115200);
}
void loop(){
char key = keypad.getKey();
if (key) {
Serial.println(key);
}
}
خروجی در سریال مانیتور نشان میدهد که تمام کلیدها به درستی کار میکنند و هیچ مشکلی وجود ندارد.

پروژه نمونه اتصال کیپد و ال سی دی به ESP32
در این مثال، یک LED به پروژه اضافه میکنیم و متن وارد شده از طریق کیپد به جای سریال مانیتور روی LCD نمایش داده میشود. از نسخه I2C LCD 16×2 استفاده میکنیم زیرا بهینهترین روش برای استفاده از پینهای GPIO است. تمامی کاراکترهای کلیدها روی LCD نمایش داده میشوند به جز کلید “D” که به عنوان دکمه “پاک کردن صفحه” برنامهریزی شده است.
صفحه نمایش همچنین زمانی پاک میشود که به کاراکتر شانزدهم برسیم که محدودیت تعداد کاراکتر در هر خط است.
شماتیک مدار پروژه

نحوه اتصال ESP32 به I2C LCD و کیپد به شکل زیر است:
| پین ESP32 | اتصال به |
|---|---|
| GPIO14 | Row1 |
| GPIO27 | Row2 |
| GPIO26 | Row3 |
| GPIO25 | Row4 |
| GPIO33 | Col1 |
| GPIO32 | Col2 |
| GPIO18 | Col3 |
| GPIO19 | Col4 |
| GPIO22 | SCL |
| GPIO21 | SDA |
کد پروژه اتصال LCD و Keypad به ESP32
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ROWS 4
#define COLS 4
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uint8_t rowPins[ROWS] = {14, 27, 26, 25};
uint8_t colPins[COLS] = {33, 32, 18, 19};
uint8_t LCD_CursorPosition = 0;
Keypad keypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C I2C_LCD(0x27, 16, 2);
void setup(){
Serial.begin(115200);
I2C_LCD.begin();
I2C_LCD.backlight();
I2C_LCD.clear();
}
void loop(){
char key = keypad.getKey();
if (key) {
Serial.print(key);
I2C_LCD.setCursor(LCD_CursorPosition++, 0);
if(LCD_CursorPosition == 16 || key == 'D') {
I2C_LCD.clear();
LCD_CursorPosition = 0;
} else {
I2C_LCD.print(key);
}
}
}
کد پروژه قفل با رمز عبور کی پد ESP32
این یک سیستم ساده قفل مبتنی بر رمز عبور با ESP32 کیپد و I2C LCD است. رمز عبور یک رشته 6 کاراکتری است و کاربر تنها میتواند 6 رقم وارد کند. اگر رمز عبور صحیح باشد، پیام “Access Granted!” روی LCD نمایش داده میشود و در غیر این صورت “Wrong PassWord!” نمایش داده میشود. کلید ‘D’ برای پاک کردن نمایشگر و تلاش دوباره استفاده میشود.
سیم کشی و اتصالات دقیقا همانند پروژه قبلی است.
کد نمونه
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ROWS 4
#define COLS 4
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uint8_t rowPins[ROWS] = {14, 27, 26, 25};
uint8_t colPins[COLS] = {33, 32, 18, 19};
uint8_t LCD_CursorPosition = 0;
String PassWord = "134679";
String InputStr = "";
Keypad keypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C I2C_LCD(0x27, 16, 2);
void setup(){
Serial.begin(115200);
I2C_LCD.begin();
I2C_LCD.backlight();
I2C_LCD.clear();
I2C_LCD.setCursor(0, 0);
I2C_LCD.print("Enter PassWord:");
}
void loop(){
char key = keypad.getKey();
if (key) {
InputStr += key;
I2C_LCD.setCursor(LCD_CursorPosition++, 1);
if(LCD_CursorPosition == 6) {
String message;
if(InputStr == PassWord) {
message = "Access Granted!";
} else {
message = "Wrong PassWord!";
}
InputStr = "";
I2C_LCD.clear();
LCD_CursorPosition = 0;
I2C_LCD.print(message);
} else if(key == 'D') {
InputStr = "";
I2C_LCD.clear();
LCD_CursorPosition = 0;
I2C_LCD.print("Enter PassWord:");
} else {
I2C_LCD.print(key);
}
}
}
در نهایت، کیپدها کاربردهای متنوعی دارند و در آموزشهای آینده به برخی از آنها خواهیم پرداخت. نسخه بهتر سیستم قفل مبتنی بر رمز عبور میتواند با استفاده از NVS (حافظه غیر فرار) در ESP32 ساخته شود تا کاربر بتواند رمز عبور جدید وارد کند و سیستم به جای حالت hard-coded، انعطافپذیر باشد.







