ماژول سوئیچ کلید
(Key Switch Module)
کنترل امن و مطمئن مدارات
ماژول سوئیچ کلید (Key Switch Module) – کنترل مکانیکی امن برای پروژههای الکترونیکی
ماژول سوئیچ کلید (Key Switch Module) یک ماژول کنترل ورودی مکانیکی است که امکان کنترل امن و فیزیکی مدارات الکترونیکی را فراهم میآورد. این ماژول با استفاده از کلید قفلی مکانیکی، سطح جدیدی از امنیت و قابلیت اطمینان را به پروژههای الکترونیکی اضافه میکند. مناسب برای سیستمهای امنیتی، کنترل دسترسی، دستگاههای صنعتی و پروژههای آموزشی.
ویژگیهای کلیدی و مزایا
-
کنترل فیزیکی امن: نیاز به کلید فیزیکی برای فعالسازی
-
ساختار مستحکم: بدنه فلزی با پوشش ضدزنگ
-
طول عمر بالا: بیش از 50,000 بار چرخه کلیدزنی
-
نصب آسان: طراحی ماژولار با پینهای استاندارد
-
امنیت الکتریکی: ایزولاسیون کامل بین بخش مکانیکی و الکترونیکی
-
سازگاری گسترده: کار با 3.3V و 5V سیستمهای دیجیتال
-
چندین حالت کاری: NO (Normally Open) و NC (Normally Closed)
-
قیمت مقرون به صرفه: ارزانترین راه برای افزودن کنترل کلیدی
مشخصات فنی کامل
| پارامتر | مشخصات فنی |
|---|---|
| نوع کلید | کلید قفلی مکانیکی (Key Lock Switch) |
| ولتاژ کاری | 3V تا 24V DC/AC |
| جریان مجاز | 3A (250V AC)، 5A (125V AC)، 2A (30V DC) |
| مقاومت عایقی | بیش از 100MΩ |
| مقاومت تماسی | کمتر از 50mΩ |
| ولتاژ شکست | 1500V AC برای 1 دقیقه |
| پینهای خروجی | 3 پین: COM، NO، NC |
| نوع اتصال | اسکرو ترمینال یا پینهای PCB |
| مواد بدنه | فلز گالوانیزه با پوشش نیکل |
| نوع کلید (Key) | کلید خارداری (Tubular Key) یا کلید ساده |
| زمان پاسخ | کمتر از 10ms |
| دمای کاری | -25 تا +85 درجه سانتیگراد |
| چرخه عمر | 50,000 بار کلیدزنی |
| ابعاد ماژول | 22mm × 32mm × 25mm (بدون کلید) |
| سوراخ نصب | قطر 22mm (استاندارد پنل) |
پینهای ماژول سوئیچ کلید
| پین ماژول | نام | علامت | عملکرد |
|---|---|---|---|
| COM | Common | COM | پین مشترک (همیشه متصل) |
| NO | Normally Open | NO | باز در حالت عادی – وصل با چرخش کلید |
| NC | Normally Closed | NC | بسته در حالت عادی – قطع با چرخش کلید |
| (اختیاری) LED+ | LED مثبت | + | آند LED نشانگر |
| (اختیاری) LED- | LED منفی | – | کاتد LED نشانگر |
حالتهای کاری مختلف
حالت ۱: Normally Open (NO)
-
در حالت عادی: مدار باز است (قطع)
-
با چرخش کلید: مدار بسته میشود (وصل)
-
کاربرد: سیستمهای روشن/خاموش، استارت دستگاهها
حالت ۲: Normally Closed (NC)
-
در حالت عادی: مدار بسته است (وصل)
-
با چرخش کلید: مدار باز میشود (قطع)
-
کاربرد: سیستمهای آلارم، قطع اضطراری
حالت ۳: تغییر وضعیت (Changeover)
-
استفاده همزمان از NO و NC
-
یک مدار وصل و یک مدار قطع میشود
-
کاربرد: سیستمهای تغییر حالت، کلیدگزینی
اتصال به آردوینو (پایهای)
سیمکشی حالت NO:
کلید COM ---> آردوینو 5V کلید NO ---> مقاومت 10kΩ ---> آردوینو GND کلید NO ---> آردوینو D2 (ورودی دیجیتال)
کد پایه برای خواندن وضعیت:
// خواندن وضعیت کلید قفلی const int keySwitchPin = 2; // پین متصل به NO int keyState = 0; // وضعیت فعلی کلید int lastKeyState = 0; // وضعیت قبلی کلید bool systemActive = false; // وضعیت سیستم void setup() { pinMode(keySwitchPin, INPUT_PULLUP); // استفاده از مقاومت داخلی Pull-up Serial.begin(9600); Serial.println("ماژول سوئیچ کلید - سیستم فعال شد"); Serial.println("کلید را بچرخانید..."); Serial.println("------------------------------"); } void loop() { // خواندن وضعیت کلید (با Pull-up، LOW یعنی کلید وصل) keyState = digitalRead(keySwitchPin); // اگر وضعیت تغییر کرد if (keyState != lastKeyState) { delay(50); // Debounce delay // اگر کلید وصل شد (فشار داده شد) if (keyState == LOW) { systemActive = !systemActive; // تغییر وضعیت سیستم if (systemActive) { Serial.println(">>> سیستم فعال شد - کلید در حالت ON"); Serial.println("دستگاه روشن و آماده کار است"); } else { Serial.println(">>> سیستم غیرفعال شد - کلید در حالت OFF"); Serial.println("دستگاه خاموش شد"); } Serial.println("------------------------------"); } lastKeyState = keyState; } // اگر سیستم فعال است، عملیات اصلی را انجام بده if (systemActive) { // کدهای عملیاتی سیستم static unsigned long lastBlink = 0; if (millis() - lastBlink > 1000) { Serial.println("سیستم در حال کار..."); lastBlink = millis(); } } delay(100); }
اتصال پیشرفته با LED نشانگر
سیمکشی با LED:
کلید COM ---> آردوینو 5V کلید NO ---> آردوینو D2 کلید NO ---> مقاومت 10kΩ ---> GND LED+ ---> مقاومت 220Ω ---> آردوینو D13 LED- ---> GND
کد با LED نشانگر:
// کنترل کلید با LED نشانگر const int keyPin = 2; const int ledPin = 13; const int buzzerPin = 8; // پین بازر اختیاری int systemStatus = 0; // 0: خاموش, 1: روشن, 2: قفل شده unsigned long lastChangeTime = 0; const unsigned long lockTimeout = 10000; // 10 ثانیه برای قفل خودکار void setup() { pinMode(keyPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT); Serial.begin(9600); Serial.println("سیستم کنترل کلید حرفهای"); Serial.println("------------------------"); Serial.println("دستورات:"); Serial.println("ON: چرخاندن کلید به راست"); Serial.println("OFF: چرخاندن کلید به چپ"); Serial.println("LOCK: نگه داشتن بیش از 3 ثانیه"); } void loop() { int keyReading = digitalRead(keyPin); static unsigned long keyPressTime = 0; static bool keyWasPressed = false; // اگر کلید فشرده شد if (keyReading == LOW) { if (!keyWasPressed) { keyPressTime = millis(); keyWasPressed = true; } // اگر بیش از 3 ثانیه فشرده نگه داشته شد if (millis() - keyPressTime > 3000) { if (systemStatus != 2) { systemStatus = 2; // حالت قفل Serial.println(">>> سیستم قفل شد"); digitalWrite(ledPin, HIGH); tone(buzzerPin, 1000, 500); lastChangeTime = millis(); } } } // اگر کلید رها شد if (keyReading == HIGH && keyWasPressed) { keyWasPressed = false; unsigned long pressDuration = millis() - keyPressTime; // اگر کمتر از 3 ثانیه بود (کلید معمولی) if (pressDuration < 3000) { if (systemStatus != 2) { // اگر سیستم قفل نیست systemStatus = (systemStatus == 0) ? 1 : 0; if (systemStatus == 1) { Serial.println(">>> سیستم روشن شد"); digitalWrite(ledPin, HIGH); } else { Serial.println(">>> سیستم خاموش شد"); digitalWrite(ledPin, LOW); } lastChangeTime = millis(); tone(buzzerPin, 800, 200); } } } // قفل خودکار بعد از 10 ثانیه if (systemStatus == 1 && (millis() - lastChangeTime > lockTimeout)) { systemStatus = 0; Serial.println(">>> خاموشی خودکار فعال شد"); digitalWrite(ledPin, LOW); tone(buzzerPin, 600, 300); } // چشمک LED در حالت قفل if (systemStatus == 2) { static unsigned long lastBlink = 0; if (millis() - lastBlink > 500) { digitalWrite(ledPin, !digitalRead(ledPin)); lastBlink = millis(); } } delay(50); }
کاربردهای عملی ماژول سوئیچ کلید
۱. سیستمهای امنیتی و کنترل دسترسی:
-
قفل دربهای الکترونیکی
-
سیستمهای آلارم ضدسرقت
-
کنترل دسترسی به تجهیزات حساس
۲. دستگاههای صنعتی و ماشینآلات:
-
کلید اصلی دستگاههای صنعتی
-
سیستمهای قطع اضطراری (E-STOP)
-
کنترل ماشینآلات CNC و خط تولید
۳. پروژههای خودرویی و دریایی:
-
کلید احضار موتور قایقها
-
سیستم استارت خودروهای الکتریکی
-
کنترل تجهیزات جانبی خودرو
۴. تجهیزات آزمایشگاهی و پزشکی:
-
کنترل دستگاههای اندازهگیری
-
سیستمهای ایمنی تجهیزات پزشکی
-
قفل تجهیزات حساس آزمایشگاهی
۵. پروژههای آموزشی و نمایشگاهی:
-
دستگاههای نمایشگاهی تعاملی
-
کیتهای آموزشی مدارات کنترل
-
ماکتهای صنعتی آموزشی
۶. اتوماسیون خانگی و ساختمانی:
-
کنترل مرکزی سیستمهای خانه هوشمند
-
کلید اصلی سیستم امنیتی ساختمان
-
کنترل روشنایی اضطراری
پروژه عملی: سیستم امنیتی با کلید فیزیکی
قطعات مورد نیاز:
-
ماژول سوئیچ کلید
-
آردوینو Uno
-
ماژول رله 2 کانال
-
بازر پیزو (Buzzer)
-
LED قرمز و سبز
-
مقاومتهای 220Ω
-
سنسور PIR حرکت
-
برد بورد و سیمهای جامپر
کد سیستم امنیتی کامل:
// سیستم امنیتی حرفهای با کلید فیزیکی #include <EEPROM.h> // تعریف پینها const int keyPin = 2; const int pirPin = 3; const int relayPin = 4; const int buzzerPin = 5; const int ledRed = 6; const int ledGreen = 7; const int buttonPin = 8; // دکمه تنظیم رمز // متغیرهای سیستم int securityMode = 0; // 0: غیرفعال, 1: فعال, 2: آلارم unsigned long alarmStartTime = 0; const unsigned long alarmDuration = 300000; // 5 دقیقه آلارم int secretCode[4] = {1, 2, 3, 4}; // رمز پیشفرض int inputCode[4] = {0, 0, 0, 0}; int codePosition = 0; void setup() { // تنظیم پینها pinMode(keyPin, INPUT_PULLUP); pinMode(pirPin, INPUT); pinMode(relayPin, OUTPUT); pinMode(buzzerPin, OUTPUT); pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); // بارگذاری رمز از EEPROM loadCodeFromEEPROM(); Serial.begin(9600); Serial.println("سیستم امنیتی حرفهای"); Serial.println("--------------------"); Serial.println("دستورات:"); Serial.println("1. کلید به راست: فعال کردن سیستم"); Serial.println("2. کلید به چپ: غیرفعال کردن سیستم"); Serial.println("3. نگه داشتن کلید 5 ثانیه: تغییر رمز"); Serial.println("--------------------"); // اولیهسازی خروجیها digitalWrite(relayPin, HIGH); // رله غیرفعال digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); // سیستم آماده } void loop() { // خواندن وضعیت کلید int keyState = digitalRead(keyPin); static unsigned long keyHoldTime = 0; static bool keyHeld = false; // مدیریت کلید if (keyState == LOW) { if (!keyHeld) { keyHoldTime = millis(); keyHeld = true; } // اگر بیش از 5 ثانیه نگه داشته شد if (millis() - keyHoldTime > 5000) { changeSecretCode(); keyHeld = false; } } else { if (keyHeld) { keyHeld = false; unsigned long holdTime = millis() - keyHoldTime; // اگر کمتر از 1 ثانیه بود (کلید معمولی) if (holdTime < 1000) { if (securityMode == 0) { activateSecurity(); } else if (securityMode == 1) { if (verifyCode()) { deactivateSecurity(); } } } } } // مدیریت حالت امنیتی switch(securityMode) { case 0: // غیرفعال digitalWrite(ledGreen, HIGH); digitalWrite(ledRed, LOW); digitalWrite(relayPin, HIGH); break; case 1: // فعال digitalWrite(ledGreen, LOW); digitalWrite(ledRed, HIGH); digitalWrite(relayPin, LOW); // رله فعال - درب قفل // بررسی سنسور حرکت if (digitalRead(pirPin) == HIGH) { triggerAlarm(); } break; case 2: // آلارم handleAlarm(); break; } // مدیریت دکمه ورود رمز if (digitalRead(buttonPin) == LOW && securityMode == 1) { enterCode(); } delay(100); } // توابع سیستم void activateSecurity() { securityMode = 1; Serial.println(">>> سیستم امنیتی فعال شد"); Serial.println("رمزی 4 رقمی وارد کنید..."); tone(buzzerPin, 1200, 200); codePosition = 0; for (int i = 0; i < 4; i++) inputCode[i] = 0; } void deactivateSecurity() { securityMode = 0; Serial.println(">>> سیستم امنیتی غیرفعال شد"); tone(buzzerPin, 800, 200); digitalWrite(relayPin, HIGH); // باز کردن درب } void triggerAlarm() { securityMode = 2; alarmStartTime = millis(); Serial.println("!!! آلارم: حرکت تشخیص داده شد !!!"); Serial.println("سیستم به پلیس اطلاع داد"); } void handleAlarm() { // چشمک LED و بوق static unsigned long lastBlink = 0; if (millis() - lastBlink > 500) { digitalWrite(ledRed, !digitalRead(ledRed)); tone(buzzerPin, 1500, 400); lastBlink = millis(); } // خاموش کردن خودکار آلارم پس از 5 دقیقه if (millis() - alarmStartTime > alarmDuration) { securityMode = 1; digitalWrite(ledRed, HIGH); Serial.println("آلارم خاموش شد"); } } void changeSecretCode() { Serial.println(">>> حالت تغییر رمز فعال شد"); Serial.println("رمز جدید 4 رقمی را وارد کنید:"); codePosition = 0; while (codePosition < 4) { if (Serial.available() > 0) { int digit = Serial.read() - '0'; if (digit >= 0 && digit <= 9) { secretCode[codePosition] = digit; Serial.print("*"); codePosition++; } } delay(10); } Serial.println("\n>>> رمز با موفقیت تغییر کرد"); saveCodeToEEPROM(); tone(buzzerPin, 1000, 300); } bool verifyCode() { Serial.println("رمز فعلی را وارد کنید:"); codePosition = 0; unsigned long startTime = millis(); while (codePosition < 4 && millis() - startTime < 30000) { if (Serial.available() > 0) { int digit = Serial.read() - '0'; if (digit >= 0 && digit <= 9) { inputCode[codePosition] = digit; Serial.print("*"); codePosition++; } } delay(10); } // بررسی تطابق رمز bool match = true; for (int i = 0; i < 4; i++) { if (inputCode[i] != secretCode[i]) { match = false; break; } } if (match) { Serial.println("\n>>> رمز صحیح است"); return true; } else { Serial.println("\n>>> رمز نادرست است"); tone(buzzerPin, 300, 1000); return false; } } void enterCode() { Serial.println("رمز را از روی کیپد وارد کنید:"); // اینجا میتوانید کیپد متصل کنید } void loadCodeFromEEPROM() { for (int i = 0; i < 4; i++) { secretCode[i] = EEPROM.read(i); if (secretCode[i] > 9) secretCode[i] = i + 1; } } void saveCodeToEEPROM() { for (int i = 0; i < 4; i++) { EEPROM.write(i, secretCode[i]); } }
نحوه نصب فیزیکی روی پنل
مراحل نصب استاندارد:
-
سوراخ 22mm روی پنل ایجاد کنید
-
کلید را از پشت پنل قرار دهید
-
مهره قفلی را از جلو ببندید
-
واشر آببندی (در صورت نیاز) اضافه کنید
-
سیمها را به ترمینال وصل کنید
-
کلید را تست کنید
نکات نصب:
-
پنل حداقل 1.5mm ضخامت داشته باشد
-
از واشر استفاده کنید برای پنلهای نازک
-
سیمها را قلع اندود کنید قبل از اتصال
-
کلید را بیش از حد سفت نکنید (حس چرخش آزادانه داشته باشد)
مقایسه با سایر سوئیچهای کنترل
| ویژگی | سوئیچ کلید قفلی | سوئیچ روغنی | سوئیچ لمسی | سوئیچ Rocker |
|---|---|---|---|---|
| امنیت | خیلی بالا (نیاز به کلید فیزیکی) | متوسط | پایین | پایین |
| طول عمر | بسیار بالا (50,000+) | بالا (25,000) | متوسط (100,000 لمسی) | بالا (50,000) |
| مقاومت محیطی | عالی (ضد آب، ضد گردوغبار) | خوب | ضعیف | خوب |
| نصب | نیاز به سوراخ 22mm | نیاز به سوراخ 16mm | سطحی | نیاز به سوراخ |
| قیمت | متوسط | ارزان | گران | ارزان |
| ظاهر | حرفهای و امنیتی | صنعتی | مدرن | معمولی |
پروژههای پیشرفته پیشنهادی
۱. سیستم کنترل دسترسی چندسطحی:
-
کلیدهای مختلف برای سطوح دسترسی مختلف
-
لاگ زمان دسترسیها در SD کارت
-
ارسال SMS هنگام دسترسی غیرمجاز
۲. جعبه ابزار امنیتی:
-
قفل الکترونیکی با کلید فیزیکی
-
آلارم ضدسرقت با سنسور لرزش
-
GPS Tracking برای موقعیتیابی
۳. دستگاه خودپرداز DIY:
-
کلید اصلی برای اپراتور
-
سیستم محافظت در برابر دستکاری
-
ذخیرهسازی امن پول
۴. سیستم کنترل خط تولید:
-
کلید ایمنی اپراتور
-
سیستم قطع اضطراری دو مرحلهای
-
مانیتورینگ وضعیت دستگاه
۵. قفل درب هوشمند:
-
ترکیب کلید فیزیکی و رمز دیجیتال
-
باز کردن درب از طریق موبایل
-
تاریخچه دسترسیها
نکات حیاتی برای استفاده ایمن
⚠️ نکات ایمنی الکتریکی:
-
برای بارهای AC از رله مناسب استفاده کنید
-
هرگز مستقیماً موتورها را وصل نکنید – از کنتاکتور استفاده کنید
-
فیوز حفاظتی در مدار قرار دهید
-
اتصال به زمین (Earth) را فراموش نکنید
-
برای ولتاژهای بالا از کلیدهای ریت شده استفاده کنید
🔧 نگهداری و سرویس:
-
هر 6 ماه اتصالات را بررسی کنید
-
تمیز کردن کنتاکتها با هوای فشرده
-
روغن کاری مکانیزم با روغن سیلیکون
-
جایگزینی کلید پس از 50,000 بار استفاده
⚡ مشخصات الکتریکی مهم:
-
ولتاژ اتصال: 250V AC حداکثر
-
جریان اتصال کوتاه: 100A برای 1 ثانیه
-
قدرت قطع: 300W برای DC، 625VA برای AC
-
ظرفیت خازنی: 20μF در 250V AC
پکیجهای خرید پیشنهادی نیکی سایت
پکیج مبتدی (آموزشی):
-
ماژول سوئیچ کلید 2A (2 عدد)
-
آردوینو Nano
-
ماژول رله 1 کانال
-
LED و مقاومت
-
سیمهای جامپر
-
پیچ و مهره نصب
پکیج حرفهای (سیستم امنیتی):
-
ماژول سوئیچ کلید 5A (3 عدد با کلیدهای مختلف)
-
آردوینو Mega
-
ماژول رله 4 کانال
-
ماژول SD کارت
-
ماژول SIM800L
-
جعبه فلزی ضد دستکاری
پکیج صنعتی:
-
سوئیچ کلید صنعتی 10A (IP65)
-
PLC کوچک یا آردوینو Industrial
-
کنتاکتور 20A
-
ترمینالبلوک مخصوص
-
فیوز و محافظ
-
کابل شیلددار
پکیج آموزشی (برای مدارس):
-
ماژول سوئیچ کلید (10 عدد)
-
برد آموزشی مخصوص
-
کتاب پروژههای عملی
-
فیلم آموزشی نصب
-
قطعات جانبی کامل
سوالات متداول (FAQ)
✅ آیا میتوانم کلید را عوض کنم؟
بله، کلیدها قابل تعویض هستند اما باید از همان سری باشند.
✅ حداکثر جریان مجاز چقدر است؟
برای مدل استاندارد: 2A در 30V DC، برای مدل صنعتی: تا 10A در 250V AC.
✅ آیا ضد آب است؟
بله، مدلهای با درجه IP65 کاملاً ضد آب و گردوغبار هستند.
✅ آیا میتوانم به صورت موازی استفاده کنم؟
بله، برای افزایش جریان میتوانید COM و NO چند کلید را موازی کنید.
✅ تفاوت NO و NC چیست؟
NO: در حالت عادی باز، با کلید وصل میشود
NC: در حالت عادی بسته، با کلید قطع میشود
✅ عمر مکانیکی کلید چقدر است؟
حداقل 50,000 بار چرخش کامل (90 درجه).
✅ آیا نیاز به مقاومت Pull-up دارم؟
بله، در مدارات دیجیتال باید از مقاومت 10kΩ Pull-up استفاده کنید.
✅ آیا میتوانم برای AC 220V استفاده کنم؟
بله، اما حتماً از مدل ریت شده برای 250V AC استفاده کنید.
استانداردهای ایمنی و گواهیها
گواهیهای بینالمللی:
-
CE: استاندارد اروپا
-
RoHS: عاری از مواد خطرناک
-
UL: استاندارد آمریکا (مدلهای خاص)
-
CCC: استاندارد چین
مشخصات فنی تأیید شده:
-
درجه حفاظت: IP40 تا IP67
-
مقاومت حرارتی: کلاس B (130°C)
-
مقاومت ضربه: IK08 (مقاوم در برابر ضربه)
-
مقاومت اشتعال: UL94 V-0
تستهای کیفیت:
-
تاست استقامت دیالکتریک: 1500V AC برای 1 دقیقه
-
تست عمر: 50,000 چرخه در اتاق تست
-
تاست دما و رطوبت: 85°C و 85% رطوبت برای 500 ساعت
-
تست شوک حرارتی: -25°C تا +85°C برای 100 چرخه
چرا ماژول سوئیچ کلید را از نیکی سایت بخرید؟
✅ کیفیت تضمین شده: از برندهای معتبر مانند Omron، EAO، Honeywell
✅ تست کامل: تست مکانیکی، الکتریکی و محیطی قبل از ارسال
✅ پشتیبانی فنی مادامالعمر: حتی پس از پایان گارانتی
✅ آموزش فارسی کامل: ویدئو، کتابچه، شماتیک
✅ تنوع بینظیر: انواع کلید، رنگ، آمپر مختلف
✅ قیمت رقابتی: تخفیف عمده برای خریدهای سازمانی
✅ تحویل فوری: ارسال ساعتی در تهران
✅ مشاوره رایگان: کمک در انتخاب مدل مناسب برای کاربرد شما
✅ نمونه رایگان: برای پروژههای دانشگاهی و تحقیقاتی
✅ بستهبندی حرفهای: ضدضربه و ضدرطوبت برای شهرستان
✅ تضمین اصالت: کد پیگیری تولید برای هر قطعه
✅ خدمات پس از فروش: تعمیر، تعویض، ارتقا
✅ تخفیف آموزشی: ۲۰٪ تخفیف برای مدارس و دانشگاهها









ترانزیستورها
خازنها
دیودها
رگولاتورها
مقاومتها
کریستال و اسیلاتور
مدارات مجتمع
ابزارها
تجهیزات
تجهیزات لحیمکاری
مولتیمتر و ابزار اندازهگیری
منبع تغذیه و باتری
تستر