ماژول صفحه کلید هشت تایی میکروسوئیچی
با قابلیت تنظیمات Pull-up / Pull-Down و خروجی منفی یا مثبت
Eight Switch Board with High/Low Outputs & Pull-up / Pull-Down
ماژول صفحه کلید 8 تایی پیشرفته با مقاومتهای آرایهای (Resistor Array) و انتخاب فیزیکی Pull-up/Pull-down به همراه انتخاب تحریک مثبت/منفی – راهحل کاملاً حرفهای برای اتصال کلید به میکروکنترلر.
🎛️ ویژگیهای اصلی
🔹 8 کلید تاکتایل با کیفیت صنعتی
🔹 مقاومتهای آرایهای 10KΩ 9-Pin SIP
🔹 انتخاب Pull-up/Pull-down با جامپر 2 حالته
🔹 انتخاب تحریک Active-High/Low با جامپر
🔹 خروجی مستقیم به 8 پین میکروکنترلر
🔹 LED نشانگر وضعیت هر کلید (قابل قطع)
🔹 منبع تغذیه 3.3V/5V قابل انتخاب
📊 مشخصات فنی کامل
مشخصات الکتریکی:
-
ولتاژ کاری: 3.3V یا 5V DC (با جامپر انتخاب)
-
مقاومتهای آرایهای: SIP-9 10KΩ ±1%
-
مقاومت هر کانال: 10KΩ دقیق
-
جریان مصرف: 5-30mA (بدون LED)، 50-100mA (با LED)
-
نوع کلید: تاکتایل 6×6mm با عمر 1,000,000 بار
-
ولتاژ شکست: 50V DC
-
توان مقاومتها: 1/8W هر مقاومت
-
نوع مقاومتها: Thick Film SIP Array
پیکربندی سختافزاری:
1. بخش مقاومتهای آرایهای:
مقاومت SIP-9 Array (9 پایه):
پایه 1: پین مشترک (COM)
پایه 2: مقاومت 1 (10KΩ)
پایه 3: مقاومت 2 (10KΩ)
پایه 4: مقاومت 3 (10KΩ)
پایه 5: مقاومت 4 (10KΩ)
پایه 6: مقاومت 5 (10KΩ)
پایه 7: مقاومت 6 (10KΩ)
پایه 8: مقاومت 7 (10KΩ)
پایه 9: مقاومت 8 (10KΩ)
هر مقاومت مستقل اما در یک پکیج فشرده
2. جامپرهای تنظیم:
**J1 (PU/PD Select):**
- موقعیت UP: Pull-up (مقاومت به VCC)
- موقعیت DOWN: Pull-down (مقاومت به GND)
**J2 (Active Mode):**
- موقعیت LEFT: Active-High (فعال = HIGH)
- موقعیت RIGHT: Active-Low (فعال = LOW)
**J3 (LED Enable):**
- وصل: LEDها فعال
- قطع: LEDها غیرفعال
**J4 (Voltage Select):**
- 3V3: تغذیه 3.3V
- 5V0: تغذیه 5V
3. پینهای اتصال:
پینهای ورودی/خروجی:
VCC → تغذیه مثبت (با J4 انتخاب میشود)
GND → زمین
SW1 → خروجی کلید 1
SW2 → خروجی کلید 2
SW3 → خروجی کلید 3
SW4 → خروجی کلید 4
SW5 → خروجی کلید 5
SW6 → خروجی کلید 6
SW7 → خروجی کلید 7
SW8 → خروجی کلید 8
پینهای کمکی:
LED_COM → کاتد مشترک LEDها
TEST → پین تست مدار
طرح مدار برای هر حالت:
حالت Pull-up + Active-High:
مدار برای یک کلید:
VCC → مقاومت 10KΩ → خروجی SW → میکروکنترلر
↓
کلید → GND
عملکرد:
- کلید باز: خروجی HIGH (از طریق مقاومت به VCC)
- کلید بسته: خروجی LOW (مستقیم به GND)
- فعال = HIGH (آزاد)، غیرفعال = LOW (فشار)
حالت Pull-up + Active-Low:
مدار:
VCC → مقاومت 10KΩ → خروجی SW → میکروکنترلر
↓
کلید → GND
عملکرد:
- کلید باز: خروجی HIGH
- کلید بسته: خروجی LOW
- اما منطق معکوس در برنامه
حالت Pull-down + Active-High:
مدار:
خروجی SW → میکروکنترلر
↓
مقاومت 10KΩ → GND
↓
کلید → VCC
عملکرد:
- کلید باز: خروجی LOW (از طریق مقاومت به GND)
- کلید بسته: خروجی HIGH (مستقیم به VCC)
حالت Pull-down + Active-Low:
همان مدار Pull-down اما منطق معکوس
مزایای مقاومت آرایهای:
-
صرفهجویی در فضا: 8 مقاومت در یک پکیج
-
دقت یکنواخت: همه مقاومتها از یک بچ تولید
-
نصب آسان: فقط یک قطعه برای لحیمکاری
-
پایداری حرارتی: هماهنگ
-
کاهش نویز: آرایش فشرده
🔧 نحوه پیکربندی فیزیکی
مراحل تنظیم:
1. **انتخاب ولتاژ (J4):**
- برای آردوینو 5V: جامپر روی 5V0
- برای ESP32/3.3V: جامپر روی 3V3
2. **انتخاب Pull-up/Pull-down (J1):**
- Pull-up: جامپر به سمت UP
- Pull-down: جامپر به سمت DOWN
3. **انتخاب تحریک (J2):**
- Active-High: جامپر به سمت LEFT
- Active-Low: جامپر به سمت RIGHT
4. **تنظیم LED (J3):**
- فعال: جامپر وصل
- غیرفعال: جامپر قطع (صرفهجویی انرژی)
5. **اتصال به میکروکنترلر:**
- SW1-SW8 → پینهای دیجیتال میکرو
- VCC → تغذیه منطبق با J4
- GND → زمین مشترک
جدول تنظیمات پیشنهادی:
💻 کدهای نمونه برای هر حالت
حالت 1: Pull-up + Active-High (پیشفرض):
void setup() {
Serial.begin(9600);
for(int i=2; i<=9; i++) {
pinMode(i, INPUT);
}
Serial.println("حالت: Pull-up + Active-High");
}
void loop() {
for(int i=2; i<=9; i++) {
int state = digitalRead(i);
if(state == LOW) {
Serial.print("کلید ");
Serial.print(i-1);
Serial.println(" فعال (LOW)");
}
}
delay(100);
}
حالت 2: Pull-up + Active-Low:
void setup() {
Serial.begin(9600);
for(int i=2; i<=9; i++) {
pinMode(i, INPUT);
}
Serial.println("حالت: Pull-up + Active-Low");
}
void loop() {
for(int i=2; i<=9; i++) {
int rawState = digitalRead(i);
int activeState = !rawState;
if(activeState == HIGH) {
Serial.print("کلید ");
Serial.print(i-1);
Serial.println(" فعال (پس از معکوس)");
}
}
delay(100);
}
حالت 3: Pull-down + Active-High:
void setup() {
Serial.begin(9600);
for(int i=2; i<=9; i++) {
pinMode(i, INPUT);
}
Serial.println("حالت: Pull-down + Active-High");
}
void loop() {
for(int i=2; i<=9; i++) {
int state = digitalRead(i);
if(state == HIGH) {
Serial.print("کلید ");
Serial.print(i-1);
Serial.println(" فعال (HIGH)");
}
}
delay(100);
}
کلاس همه کاره با تشخیص خودکار حالت:
class SmartButtonPanel {
private:
int pins[8];
bool isPullUp;
bool isActiveHigh;
bool lastStates[8];
public:
SmartButtonPanel(int pinArray[8]) {
for(int i=0; i<8; i++) {
pins[i] = pinArray[i];
pinMode(pins[i], INPUT);
lastStates[i] = readRaw(i);
}
detectConfiguration();
}
void detectConfiguration() {
int readings[8];
for(int i=0; i<8; i++) {
readings[i] = digitalRead(pins[i]);
}
int highCount = 0;
for(int i=0; i<8; i++) {
if(readings[i] == HIGH) highCount++;
}
isPullUp = (highCount >= 4);
Serial.print("تشخیص: حالت ");
Serial.println(isPullUp ? "Pull-up" : "Pull-down");
isActiveHigh = true;
}
int readRaw(int buttonIndex) {
return digitalRead(pins[buttonIndex]);
}
bool isPressed(int buttonIndex) {
int raw = readRaw(buttonIndex);
bool pressed;
if(isPullUp) {
pressed = (raw == LOW);
} else {
pressed = (raw == HIGH);
}
if(!isActiveHigh) {
pressed = !pressed;
}
if(pressed != lastStates[buttonIndex]) {
delay(50);
int confirm = readRaw(buttonIndex);
if(isPullUp) {
pressed = (confirm == LOW);
} else {
pressed = (confirm == HIGH);
}
if(!isActiveHigh) pressed = !pressed;
}
lastStates[buttonIndex] = pressed;
return pressed;
}
void setPullUp(bool pullUp) {
isPullUp = pullUp;
Serial.print("تنظیم دستی: ");
Serial.println(isPullUp ? "Pull-up" : "Pull-down");
}
void setActiveHigh(bool activeHigh) {
isActiveHigh = activeHigh;
Serial.print("تنظیم دستی: Active-");
Serial.println(isActiveHigh ? "High" : "Low");
}
byte readAll() {
byte result = 0;
for(int i=0; i<8; i++) {
if(isPressed(i)) {
result |= (1 << i);
}
}
return result;
}
};
int buttonPins[8] = {2,3,4,5,6,7,8,9};
SmartButtonPanel panel(buttonPins);
void setup() {
Serial.begin(9600);
}
void loop() {
byte allButtons = panel.readAll();
if(allButtons != 0) {
Serial.print("کلیدهای فعال: ");
Serial.println(allButtons, BIN);
}
delay(50);
}
سیستم کنترل با انتخاب حالت:
class ConfigurableButtonSystem {
private:
struct ButtonConfig {
bool pullUp;
bool activeHigh;
int debounceMs;
} config;
int pins[8];
unsigned long lastPressTime[8];
public:
ConfigurableButtonSystem(int pinArray[8]) {
for(int i=0; i<8; i++) {
pins[i] = pinArray[i];
pinMode(pins[i], INPUT);
lastPressTime[i] = 0;
}
config.pullUp = true;
config.activeHigh = true;
config.debounceMs = 50;
}
void setFromJumpers(bool j1, bool j2) {
config.pullUp = j1;
config.activeHigh = j2;
Serial.print("تنظیم از جامپر: ");
Serial.print(config.pullUp ? "Pull-up" : "Pull-down");
Serial.print(" + ");
Serial.println(config.activeHigh ? "Active-High" : "Active-Low");
}
bool readButton(int index) {
unsigned long now = millis();
if(now - lastPressTime[index] < config.debounceMs) {
return false;
}
int raw = digitalRead(pins[index]);
bool pressed;
if(config.pullUp) {
pressed = (raw == LOW);
} else {
pressed = (raw == HIGH);
}
if(!config.activeHigh) {
pressed = !pressed;
}
if(pressed) {
lastPressTime[index] = now;
}
return pressed;
}
};
⚙️ نحوه تست و عیبیابی
تست سختافزاری:
1. **تست مقاومتهای آرایه:**
- مولتیمتر در حالت مقاومتسنج
- اندازهگیری بین پایه 1 و هر پایه 2-9
- باید حدود 10KΩ باشد
2. **تست Pull-up:**
- J1 روی UP
- بدون فشار کلید، خروجی باید HIGH باشد
- با فشار کلید، خروجی باید LOW شود
3. **تست Pull-down:**
- J1 روی DOWN
- بدون فشار کلید، خروجی باید LOW باشد
- با فشار کلید، خروجی باید HIGH شود
4. **تست Active-Low:**
- J2 روی RIGHT
- منطق باید معکوس شود
کد تست جامع:
void comprehensiveTest() {
Serial.println("=== تست جامع صفحه کلید ===");
Serial.println("تست حالت Pull-up:");
Serial.println("تست حالت Pull-down:");
Serial.println("تست کامل شد");
}
🛠️ پروژههای عملی
پروژه 1: سیستم تنظیمات سختافزاری:
void readHardwareConfig() {
bool j1_state = digitalRead(J1_PIN);
bool j2_state = digitalRead(J2_PIN);
Serial.print("J1: ");
Serial.println(j1_state ? "Pull-up" : "Pull-down");
Serial.print("J2: ");
Serial.println(j2_state ? "Active-High" : "Active-Low");
applyConfiguration(j1_state, j2_state);
}
پروژه 2: ماشین حالت با کلیدهای قابل تنظیم:
enum ButtonMode {
MODE_PULLUP_ACTIVEHIGH,
MODE_PULLUP_ACTIVELOW,
MODE_PULLDOWN_ACTIVEHIGH,
MODE_PULLDOWN_ACTIVELOW
};
ButtonMode currentMode;
void setupModeFromJumpers() {
bool pu_pd = digitalRead(PUPD_PIN);
bool ah_al = digitalRead(AHAL_PIN);
if(pu_pd && ah_al) currentMode = MODE_PULLUP_ACTIVEHIGH;
if(pu_pd && !ah_al) currentMode = MODE_PULLUP_ACTIVELOW;
if(!pu_pd && ah_al) currentMode = MODE_PULLDOWN_ACTIVEHIGH;
if(!pu_pd && !ah_al) currentMode = MODE_PULLDOWN_ACTIVELOW;
}
✅ مزایای این طراحی
نسبت به مقاومتهای جداگانه:
نسبت به ماژولهای ثابت:
-
انعطافپذیری کامل در تنظیمات
-
سازگاری با همه میکروکنترلرها
-
قابلیت استفاده در پروژههای مختلف
-
کاهش موجودی انبار (یک ماژول برای همه کارها)
برای تولید انبوه:
🎯 بهترین انتخاب برای:
-
تولیدکنندگان تجهیزات صنعتی
-
توسعهدهندگان سیستمهای embedded
-
آزمایشگاههای آموزشی
-
پروژههای تحقیقاتی
-
محصولات نیمهساخته الکترونیکی
💡 نکته حرفهای: برای محیطهای صنعتی پرنویز، از خازن 100nF بین هر خط خروجی و GND استفاده کنید تا نویز فیلتر شود.
نقد و بررسیها
پاکسازی فیلترهنوز بررسیای ثبت نشده است.