Arduino รับค่าจาก keypad 2 หลัก

เขียนโปรแกรมรับค่าจากคีย์แพดแสดงผล LCD16x2
ฟังก์ชั่นที่ใช้ในกลุ่ม LCD //arduino.cc/en/Tutorial/LiquidCrystal
-lcd.begin()//arduino.cc/en/Reference/LiquidCrystalBegin
-lcd.print() //arduino.cc/en/Reference/LiquidCrystalPrint
-lcd.setCursor() //arduino.cc/en/Reference/LiquidCrystalSetCursor
-Liquid Crystal Library (ฟังก์ชั่นอื่น ๆ ที่มีให้ใช้งาน) //arduino.cc/en/Reference/LiquidCrystal
*ไลบารี่ LiquidCrystal.h มีมาให้แล้วพร้อมโปรแกรม Arduino IDE ไม่ต้องติดตั้งเพิ่ม

ไลบารี่เพิ่มเติม
-Keypah.h (ไลบรารี่ตัวเดียวกันกับงานครั้งที่ 38 หากติดตั้งแล้วไม่ต้องทำซ้ำ)*ดูวิธีติดตั้งในงานครั้งที่ 38

ฟังก์ชั่นในไลบารี่ Keypad.h //playground.arduino.cc/Code/Keypad
-begin(
-waitForKey()
-getKey()
-getState()
-keyStateChanged()
-setHoldTime()
-setDebounceTime()
-addEventListener()

ฟังก์ชั่นที่ใช้งาน
-pinMode() //arduino.cc/en/Reference/PinMode
-digitalWrite() //arduino.cc/en/Reference/DigitalWrite
-delay() //arduino.cc/en/reference/delay

*หมายเหตุ จากการทดลองไลบรารี่ keypad เมื่อใช้ขา D13 จะทำให้ไม่สามารถใช้งานได้ ดังนั้นเวลาใช้งานขา D13 จึงห้ามใช้

โจทย์การทดลอง
-เขียนโปรแกรมรับค่าจากคีย์แพดแสดงผล LCD 16 character 2 line
-โปรแกรมรายละเอียดพิเศษรายกลุ่ม (แจ้งให้ทราบเมื่อถึงชั่วโมงเรียน)

วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้บอร์ด Arduino

วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้ไอซี ATmega328 (ที่มี Boot Loader Arduino)

บริเวณใช้งานบอร์ดทดลอง

โมดูลสำเร็จรูปเพิ่มเติม
Keypad
//www.arduinoall.com (คลิก)

LCD 16x2
//www.arduinoall.com/product/142/1602-lcd-blue-screen-16x2-lcd-with-backlight-of-the-lcd-screen

ตำแหน่งขาต่อของคีย์แพด

ตัวอย่างโปรแกรมรับค่าจากคีย์แพด

#include <Keypad.h>
const byte ROWS = 4;       //four rows
const byte COLS = 3;       //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {13,12,11,10};    //connect to the row pinouts of the keypad
byte colPins[COLS] = {A0,A1,A2};       //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
     Serial.begin(9600);
}
void loop()
{
     char key = keypad.getKey();
     if (key != NO_KEY)
     {
           Serial.println(key);
     }
}

ตัวอย่างโปรแกรมแสดงผลจอ LCD

#include <LiquidCrystal.h>
/* The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
*/
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);       // set up the LCD's connection pins
void setup()
{
  lcd.begin(16, 2);       // set up the LCD's number of columns and rows:
  lcd.print("hello, world!");
}
void loop() {}

« แก้ไขครั้งสุดท้าย: มิถุนายน 27, 2017, 09:52:50 PM โดย admin »

บันทึกการเข้า

Arduino with 4x4 Keypad membrane and 4 Channel Relay

   วันนี้จะว่ากันด้วยเรื่องของ 4x4 Keypad membrane นะครับ โดยรุ่นที่นิยมใช้กับ Arduino ก็จะเป็นแบบ 4 x 4  ซึ่งมีตัวเลข 0 - 9  และ ตัวอักษรอีกนิดหน่อย

  มาดูหลักการทำงานของ Keypad membrane กันนิดหน่อยนะครับ  4x4 Keypad membrane แบบ 4 x 4  ชนิดนี้ก็ประกอบไปด้วยปุ่ม 16 ปุ่ม ที่เรียงต่อกันเป็นเมตริกซ์แบบ 4 Row และ 4 Column  ถ้าใครเคยได้สัมผัสแล้วก็คงพอจะเดาออกว่าปุ่มแต่ละปุ่ม  เป็นการกดเพื่อให้หน้าสัมผัสที่เป็นชั้นสีแดงในรูปด้านล่าง ไปแตะกันทำให้เป็นการเชื่อมต่อกันทางไฟฟ้าไปอีกด้านหนึ่งของสวิตช์

   ทีนี้หลักการในการตรวจสอบว่าผู้ใช้กำลังกดปุ่มอะไรอยู่นั้นก็ใช้วิธีการ scan ไปทีละ Column ครับจบครบทุก Column แล้วนำมาตีความว่ามีการตอบสนองออกมาเป็นแบบใดบ้าง  เช่น ถ้ามีการกดเลข 1  อยู่  ในขณะที่เราจ่ายแรงดัน 5 โวลต์ไปที่ Column ที่ 1  จะมีเพียง Row แรกเท่านั้นที่จะอ่านค่า แรงดันได้ High นอกนั้นจะเป็น Low     หรือ ถ้ามีการกดปุ่ม # อยู่ ขณะที่ Scan ไปแต่ละ Column นั้นจะไม่เจอแรงดัน High ที Row ใดเลย จนกว่าจะ Scan ไปถึง Column ที่ 3 ซึ่งจะพบว่ามีการตอบสนองกลับมาจาก Row ที่ 4 นั้นเอง  ดังนั้นเมือพบว่าเป็นการ Scan Column ที่ 3 และมี Row 4 ตอบสนอง ก็คือปุ่ม '#' นั่นเอง

  อ่านแล้วก็รู้สึกว่าไม่ซับซ้อนมานักใช่มั้ยครับ  แต่มันมีมากกว่านั้นอีกตรงที่ว่าจังหวะการกดของคนแต่ละคน กดด้วยช่วงเวลาสั้นยาวไม่เท่ากัน  ทำให้ต้องมีการตรวจสอบโดยมีระยะเวลาเข้ามาเกี่ยวข้อง  ไม่อย่างนั้นจะสับสนระหว่างการกดแช่ หรือ การกดแบบซ้ำปุ่ม   นอกจากนั้นยังต้องมี debouncing ด้วยครับ เพื่อป้องกันการรับค่าผิดจากการ bounce ของสวิตช์  (ถ้าใครเคยเรียน Digital Design อาจจะเข้าใจได้ทันที ถ้าไม่รู้จักก็ไม่เป็นไรนะครับ)    แถมยังต้องมีการจดจำปุ่มที่กดไปแล้วอีกว่ากดอะไรไปบ้าง  กี่ครั้งแล้ว ก่อนที่จะมาประมวลผล ตรวจสอบค่าที่ใส่ เปรียบเทียบกับค่าที่ตั้งไว้เป็นรหัส  

  แต่ไม่ต้องกังวลครับ ว่าเริ่มที่จะยุ่งยาก เพราะในโลกนี้มีคนแก่งและใจดีเขียนโปรแกรมขึ้นมาให้ใช้กันฟรีๆ อีกแล้วครับ  Library ที่ว่าก็ไป  ที่นี่เลยครับ  ไม่ต้องเขียนเอง  และต่อด้วยการตรวจสอบรหัสอีกอันที่นี่ครับ ฟรีเช่นกัน

  โหลดมาแล้วก็เอาไปใส่ใน Folder Library ของเราเช่นเคยนะครับ ใครที่นึกไม่ออกก็กลับไปหาอ่านบทความเก่าของผมก็ได้ครับ  แล้วอย่าลืมปิดและเปิดโปรแกรมใหม่หลังจากใส่ไว้ใน Folder library นะครับ

ที่มาของภาพ //en.wikipedia.org/wiki/Membrane_keyboard#How_it_works

ลองตัวอย่างง่ายๆที่เขาให้มากับ Library กันก่อนครับ


  เริ่มต้นจากการต่อ Keypad membrane นี้เข้ากับ Digital Pin ตั้งแต่   D6-D13 โดยเริ่มจาก Pin บนสายแพด้านซ้ายไปขวาของ Keypad นะครับ  จากนั้นก็ลอง Sketch ใน Example ชื่อ "Password Keypad"  หรือดูตามด้านล่างนี้ครับ

/*
||  Simple Password Entry Using Matrix Keypad
||  4/5/2012 Updates Nathan Sobieck:
||
*/
//* is to validate password   
//# is to reset password attempt
/////////////////////////////////////////////////////////////////
#include <Password.h> ////www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> ////www.arduino.cc/playground/uploads/Code/Keypad.zip
Password password = Password( "1234" );
const byte ROWS = 4; // Four rows
const byte COLS = 4; //  columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
void loop(){
  keypad.getKey();
}
//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey){
 case '*': checkPassword(); break;
 case '#': password.reset(); break;
 default: password.append(eKey);
     }
  }
}
void checkPassword(){
  if (password.evaluate()){
    Serial.println("Success");
    //Add code to run if it works
  }else{
    Serial.println("Wrong");
    //add code to run if it did not work
  }
}

ในตัวอย่างนี้ก็ใช้ Password เป็น '1234' นะครับ แก้ไขกันได้ตามสะดวก แต่ผมสาธิตโดยใช้ตัวเดิมนะครับ  จะเห็นว่าตัว Sketch กำหนดให้เมื่อใส่ Password ครบให้กด * ด้วย ถ้ากดรหัสถูกก็จะแจ้งว่า Success    ถ้ากดไปแล้วผิด จะเริ่มต้นใหม่ (Reset) ให้ก็ '#' นะครับ


อีกซักตัวอย่างนึง คราวนี้เราจะเอามันมาเป็น Pass Code เพื่อใช้เข้ารหัสก่อนที่จะสามารถควบคุมการทำงานของ Relay แบบ 4 ช่องได้นะครับ  

ผมเอามาจาก //lathama.net/Arduino_and_Relays_and_a_Keypad  ถ้าใครอยากอ่านตัวอย่างนี้ของต้นฉบับ

เริ่มต้นก็ต่อวงจรตามนี้เลยครับ 

LEDsRed LED positive connected to Arduino Uno Analog A0Green LED positive connected to Arduino Uno Analog A1Ground legs connected to Arduino GroundRelaysVCC connected to Arduino 5vIN1 connected to Arduino D2IN2 connected to Arduino D3IN3 connected to Arduino D4IN4 connected to Arduino D5Ground connected to Arduino GroundKeypadConnected to Arduino D6-D13Power9V battery connected to Arduino Ground and VIN when not connected to computer USB



ตัวอย่างนี้ใช้ รหัสเริ่่มต้นเป็น '0000' นะครับ เวลาใส่ไม่ต้องใส่ * ตามท้าย ถ้าใส่รหัสถูกต้อง LED สีเขียวจะติด  ถ้าใส่ไม่ถูกจะเป็นสีแดง  ถ้าอยู่ระหว่างการใส่รหัส LED สีแดงจะกระพริบ  หลังจากใส่รหัสถูกแล้ว จะสามารถควบคุม Relay ได้ทั้ง 4 ตัวนะครับ  โดยการกดปุ่ม A B C D  กดแล้ว Relay ทำงานก็จะได้ยินเสียงป๊อกแป็กชัดเจนครับ :-) 

/* Locked Relays
 *
 * An Arduino Uno, Keypad, Relays and some LEDs for fun
 *
 * Using a password to enable the relays, then selective
 *    toggle the relays by key.
 *
 * Needed libraries
 * //arduino.cc/playground/uploads/Code/Keypad.zip
 * //arduino.cc/playground/uploads/Code/Password.zip
 */
#include <Keypad.h>
#include <Password.h>
int relay1 = 2;   
int relay2 = 3;
int relay3 = 4;
int relay4 = 5;
int locked = 1; 
int passinput = 0;
int lockedled = 14;
int unlockedled = 15;
long ledflashvar = 0;
long ledflashtime = 300;  
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};
byte rowPins[ROWS] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Password password = Password("0000");   // รหัสของการปลดล็อค
void setup(){
  //  กำหนดค่าเริ่มต้น และ PIN ต่างๆ
  Serial.begin(9600);
  pinMode(relay1, OUTPUT);
  digitalWrite(relay1, 255);
  pinMode(relay2, OUTPUT);
  digitalWrite(relay2, 255);
  pinMode(relay3, OUTPUT);
  digitalWrite(relay3, 255);
  pinMode(relay4, OUTPUT);
  digitalWrite(relay4, 255);
  pinMode(lockedled, OUTPUT);
  digitalWrite(lockedled, 255);
  pinMode(unlockedled, OUTPUT);
  digitalWrite(unlockedled, 0);
}
void loop(){
  char key = keypad.getKey();  // รับค่าจาก keypad
  
  
  // กรณีที่ Lock อยู่  LED สีแดงจะติด  และหากอยู่ระหว่างการใส่รหัส LED สีแดงจะกระพริบ
  if(locked){
    if(passinput){
      unsigned long ledcurrentvar = millis();
      if(ledcurrentvar - ledflashvar > ledflashtime) {
        ledflashvar = ledcurrentvar;
        digitalWrite(lockedled, !digitalRead(lockedled));
      }
    }
    
    // ถ้าไม่ได้อยู่ระหว่างการใส่รหัส
    else{
      digitalWrite(lockedled, 255);   // LED สีแดงจะติด
    }
    digitalWrite(unlockedled, 0);     // LED สีเขียวดับ
  }
  
  
  if (key != NO_KEY){
    Serial.println(key);   // แสดงค่าที่กดบน Serial monitor
    password.append(key);  // บันทึกค่ารหัสที่กดและเปรียบเทียบกับรหัสที่ถูกต้อง
    passinput = 1;         // อยู่ระหว่างการใส่รหัส
    
    // ถ้ากด '*' ให้เริ่มใส่รหัสใหม่
    if(key == '*'){  
      password.reset();     // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรก
      passinput = 0;        // ไม่อยู่ระหว่างการกดรหัส  
      locked = 1;
      digitalWrite(relay1, HIGH);   // ตั้งค่า Relay ให้อยู่ในสถานะ Hight
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
    }
    
    if(password.evaluate()) {       //  ถ้าใส่ Password ถูกต้องให้ปลดล็อค 
      locked = !locked; 
      password.reset();             // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรก
      passinput = 0;
    }
    
     //  ถ้าปลดล๊อคแล้วให้ไฟสีเขียวติด  สีแดงดับ  และสามารถควบคุมการเปิดปิดของ Relay ได้
    if(!locked) {                  
      passinput = 0;
      digitalWrite(lockedled, 0);
      digitalWrite(unlockedled, 255);
      
      switch (key) {                //  และเลือก Relay ที่ต้องการควบคุม
        case 'A':
          digitalWrite(relay1, !digitalRead(relay1));
          break;
        case 'B':
          digitalWrite(relay2, !digitalRead(relay2));
          break;
        case 'C':
          digitalWrite(relay3, !digitalRead(relay3));
          break;
        case 'D':
          digitalWrite(relay4, !digitalRead(relay4));
          break;
      }
      
      
      password.reset();              // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรก
    }
  }
}

 เรียบร้อยครับ กับการตั้งรหัสเพื่อควบคุมอุปกรณ์ไฟฟ้า  ด้วยต้นทุนไม่ถึง 1500 บาท  วันนี้ขอจบบทความเพียงเท่านี้นะครับ  หากต้องการถาม หรือ แนะนำติชม หรือ ซื้อสินค้า  ก็ติดต่อเข้ามาได้ที่ Website หรือ Facebook ของเรานะครับ

หาข้อมูลเพิ่มเติมได้ที่

//www.arduitronics.com/product/110/4x4-matrix-keypad

//playground.arduino.cc/Main/KeypadTutorial

//playground.arduino.cc/Code/Password

//lathama.net/Arduino_and_Relays_and_a_Keypad

โดย Mountain "A"

www.arduitronics.com

www.facebook.com/arduitronics

กระทู้ที่เกี่ยวข้อง

Toplist

โพสต์ล่าสุด

แท็ก

แปลภาษาไทย ไทยแปลอังกฤษ แปลภาษาอังกฤษเป็นไทย pantip โปรแกรม-แปล-ภาษา-อังกฤษ พร้อม-คำ-อ่าน อาจารย์ ตจต ศัพท์ทหาร ภาษาอังกฤษ pdf lmyour แปลภาษา ชขภใ ห่อหมกฮวกไปฝากป้าmv กรมพัฒนาฝีมือแรงงาน อบรมฟรี 2566 ขขขขบบบยข ่ส ศัพท์ทางทหาร military words หนังสือราชการ ตัวอย่าง หยน แปลบาลีเป็นไทย ไทยแปลอังกฤษ ประโยค การไฟฟ้านครหลวง การไฟฟ้าส่วนภูมิภาค ข้อสอบโอเน็ต ม.3 ออกเรื่องอะไรบ้าง พจนานุกรมศัพท์ทหาร เมอร์ซี่ อาร์สยาม ล่าสุด แปลภาษามลายู ยาวี Bahasa Thailand กรมพัฒนาฝีมือแรงงาน อบรมออนไลน์ การ์ดจอมือสอง ข้อสอบคณิตศาสตร์ พร้อมเฉลย คะแนน o-net โรงเรียน ค้นหา ประวัติ นามสกุล บทที่ 1 ที่มาและความสําคัญของปัญหา ร. ต จ แบบฝึกหัดเคมี ม.5 พร้อมเฉลย แปลภาษาอาหรับ-ไทย ใบรับรอง กรมพัฒนาฝีมือแรงงาน PEA Life login Terjemahan บบบย มือปราบผีพันธุ์ซาตาน ภาค2 สรุปการบริหารทรัพยากรมนุษย์ pdf สอบโอเน็ต ม.3 จําเป็นไหม เช็คยอดค่าไฟฟ้า แจ้งไฟฟ้าดับ แปลภาษา มาเลเซีย ไทย แผนที่ทวีปอเมริกาเหนือ ่้แปลภาษา Google Translate กระบวนการบริหารทรัพยากรมนุษย์ 8 ขั้นตอน ก่อนจะนิ่งก็ต้องกลิ้งมาก่อน เนื้อเพลง ข้อสอบโอเน็ตม.3 มีกี่ข้อ คะแนนโอเน็ต 65 ตม กรุงเทพ มีที่ไหนบ้าง