จากบทความที่แล้วเราสามารถติดต่อกับ
LCD shield และแสดงข้อความออกที่หน้าจอได้แล้ว
ในบทความต่อเนื่องชิ้นนี้เราจะมาเขียนโค้ดเพื่อให้ LCD Keys pad shield ทำงานได้เหมือนอย่างเดโมของ Arduino ที่แสดงใน link ของ shield ในบทความที่ผ่านมา ซึ่งนั่นรวมถึงการอ่านค่าจาก keys
ผ่านทาง ADC โมดูล และการอัพเดทเวลาทุกๆ 1 วินาทีแล้วแสดงผล
ซึ่งเดี๋ยวเราจะมาดูกันทีละส่วนครับ
จาก schematic ของ LCD Keys pad shield เราจะเห็นว่ามีสวิตซ์กด(keys) อยู่ทั้งหมด 6 สวิตซ์ โดย 5 ใน 6 สวิตซ์ต่อเข้ากับวงจรแบ่งแรงดันและแรงดันเอ้าต์พุตต่อเข้ากับ
analog input(A0) เพราะจำนวน
I/O ของ Arduino มีจำกัดหากต่อแต่ละสวิตซ์เข้า I/O จะต้องใช้ถึง 5 I/O แต่หากใช้ตัวต้านทานต่อเป็นวงจรแบ่งแรงดันร่วมกับ
ADC ก็จะลดจำนวน I/O
ลงได้มาก ส่วนอีกสวิตซ์จะเป็น RESET
ครับ
สำหรับ Pinguino นั้นมี library สำหรับอ่านค่าจาก ADC โมดูลที่เหมือนกับของ Arduino เป๊ะแถมความละเอียดยังเป็น 10 บิตเท่ากันอีกด้วย
นั่นหมายความว่าเราสามารถ copy โค้ดเดโมของ Arduino มาใช้ใน Pinguino ได้เลย ง่ายดีไหมละครับ
โดยโค้ดในส่วนการอ่านค่าสวิตซ์จะเป็นดังนี้ครับ
1: int adc_key_in = 0;
2: #define btnRIGHT 0
3: #define btnUP 1
4: #define btnDOWN 2
5: #define btnLEFT 3
6: #define btnSELECT 4
7: #define btnNONE 5
8: int read_LCD_buttons()
9: {
10: adc_key_in = analogRead(A0); // read the value from the sensor
11: if (adc_key_in < 50) return btnRIGHT;
12: if (adc_key_in < 195) return btnUP;
13: if (adc_key_in < 380) return btnDOWN;
14: if (adc_key_in < 555) return btnLEFT;
15: if (adc_key_in < 790) return btnSELECT;
16: return btnNONE; // when all others fail, return this...
17: }
เริ่มต้นจากการประกาศตัวแปรชื่อ
adc_key_in ไว้สำหรับรับค่าจากการอ่านผลลัพธ์ของการแปลง
A/D โดยในฟังก์ชัน read_LCD_buttons()
จะมีการเรียกใช้ analogRead(A0) ซึ่งจะส่งค่าผลลัพธ์ของการแปลง A/D ของช่อง A0 มาเก็บไว้ในตัวแปรที่กล่าวข้างต้น จากนั้นจึงเปรียบเทียบค่า
แล้วส่งผลลัพธ์ที่ถูกต้องกลับไปให้ฟังก์ชัน main ต่อไป โดยผลลัพธ์ที่จะส่งกลับไปก็คือตัวเลขที่ถูก
define เอาไว้ก่อนแล้วเพื่อให้ง่ายในการเขียน
หรืออ่านโค้ด ส่วนค่าตัวเลขที่นำมาเปรียบเทียบกับค่าที่อ่านจาก ADC นั้นเคยอ่านเจอว่าเจ้าของได้คำนวณ และวัดแรงดันตกคร่อมจริงเพื่อทดสอบ
จากนั้นก็มีบวกค่าความคลาดเคลื่อนเข้าไปอีกค่าละประมาณ 50 จึงได้เป็นตัวเลขเหล่านี้ออกมา
เมื่อมีฟังก์ชันอ่านค่าจากสวิตซ์แล้ว
เราก็มาเขียนโค้ดในส่วนของ main(หรือ loop())กัน ซึ่งก็จะเป็นเพียงการเรียกใช้ฟังก์ชัน read_LCD_buttons() แล้วเขียนข้อความออกไปที่จอ LCD ให้ตรงกับสวิตซ์ที่กด(
หรือตรงกับค่าที่ได้รับกลับมาหลังจากเรียกใช้ฟังก์ชัน read_LCD_buttons())เท่านั้นเอง โดยโค้ดในส่วนนี้จะเป็นดังนี้นะครับ
เมื่อเราเข้าใจทุกส่วนแล้วเราก็เอามารวมกันก็จะได้เป็นโค้ดเดโมที่ทำงานกับ LCD Keys pad shield ได้เหมือนกับ Arduino ทุกอย่างเลยครับ โค้ดตัวเต็มจะอยู่ข้างล่างนี้นะครับ แล้วลองดูวิดีโอผลลัพธ์การทำงานได้เลยครับ
1: lcd_key = read_LCD_buttons(); // read the buttons
2: switch (lcd_key) // depending on which button was pushed, we perform an action
3: {
4: case btnRIGHT:
5: {
6: lcd.printf("RIGHT ");
7: break;
8: }
9: case btnLEFT:
10: {
11: lcd.printf("LEFT ");
12: break;
13: }
14: case btnUP:
15: {
16: lcd.printf("UP ");
17: break;
18: }
19: case btnDOWN:
20: {
21: lcd.printf("DOWN ");
22: break;
23: }
24: case btnSELECT:
25: {
26: lcd.printf("SELECT");
27: break;
28: }
29: case btnNONE:
30: {
31: lcd.printf("NONE ");
32: break;
33: }
34: }
อันสุดท้าย ในตัวอย่างของ Arduino จะเห็นว่ามีตัวเลขที่เพิ่มค่าทุกๆวินาทีแสดงอยู่ด้วย
ซึ่งในโค้ดเดโมจะมีการเรียกใช้ฟังก์ชัน millis() ซึ่งจะเป็นฟังก์ชันที่คืนค่าที่เพิ่มขึ้นทุกๆ 1
วินาที( millisecond ) กลับมาให้
เมื่อเราหารค่าทีได้คืนกลับมาด้วย 1000 เราก็จะได้ตัวเลขที่จะแสดงผลทุกๆ 1 วินาที
ซึ่งโค้ดก็จะเป็นดังตัวอย่างข้างล่างนี้
1: lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
2: lcd.printf("%u", millis()/1000); // display seconds elapsed since power-up
เมื่อเราเข้าใจทุกส่วนแล้วเราก็เอามารวมกันก็จะได้เป็นโค้ดเดโมที่ทำงานกับ LCD Keys pad shield ได้เหมือนกับ Arduino ทุกอย่างเลยครับ โค้ดตัวเต็มจะอยู่ข้างล่างนี้นะครับ แล้วลองดูวิดีโอผลลัพธ์การทำงานได้เลยครับ
1: /*-----------------------------------------------------
2: Author: --<Ekkachai Muangrodpai>
3: www.picgetstart.blogspot.com
4: Date: 2016-07-09
5: Board: Pinguino 8 by Jimmy + LCD Keypads Shield V.1
6: Description:
7: -Display a message on LCD Keypads Shield, and also read a keys through analog AN0.
8: -At the same time, display the second time too.
9: * LCD RS pin to digital pin 5
10: * LCD E pin to digital pin 4
11: * LCD D4 pin to digital pin 24
12: * LCD D5 pin to digital pin 18
13: * LCD D6 pin to digital pin 17
14: * LCD D7 pin to digital pin 16
15: * LCD R/W pin to ground
16: note:
17: - don't use lcd.print() and lcd.printf() in the same program.
18: -----------------------------------------------------*/
19: #define BACK_LIGHT 2 //LCD back light control by pin2
20: // define some values used by the panel and buttons
21: int lcd_key = 0;
22: int adc_key_in = 0;
23: #define btnRIGHT 0
24: #define btnUP 1
25: #define btnDOWN 2
26: #define btnLEFT 3
27: #define btnSELECT 4
28: #define btnNONE 5
29: // read the buttons
30: int read_LCD_buttons()
31: {
32: adc_key_in = analogRead(A0); // read the value from the sensor
33: if (adc_key_in < 50) return btnRIGHT;
34: if (adc_key_in < 195) return btnUP;
35: if (adc_key_in < 380) return btnDOWN;
36: if (adc_key_in < 555) return btnLEFT;
37: if (adc_key_in < 790) return btnSELECT;
38: return btnNONE; // when all others fail, return this...
39: }
40: void setup( void) {
41: // put your setup code here, to run once:
42: pinMode(BACK_LIGHT, OUTPUT);
43: digitalWrite(BACK_LIGHT, HIGH);
44: // initialize the library with the numbers of the interface pins
45: lcd.pins(5, 4, 24, 18, 17, 16, 0, 0, 0, 0); // RS, E, D4 ~ D8
46: // set up the LCD's number of columns and rows:
47: lcd.begin(16, 2);
48: // Print a message to the LCD.
49: lcd.clear();
50: lcd.setCursor(0,0);
51: lcd.printf("Push the buttons"); // print a simple message
52: }
53: void loop( void ) {
54: lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
55: lcd.printf("%u", millis()/1000); // display seconds elapsed since power-up
56: lcd.setCursor(0,1); // move to the begining of the second line
57: lcd_key = read_LCD_buttons(); // read the buttons
58: switch (lcd_key) // depending on which button was pushed, we perform an action
59: {
60: case btnRIGHT:
61: {
62: lcd.printf("RIGHT ");
63: break;
64: }
65: case btnLEFT:
66: {
67: lcd.printf("LEFT ");
68: break;
69: }
70: case btnUP:
71: {
72: lcd.printf("UP ");
73: break;
74: }
75: case btnDOWN:
76: {
77: lcd.printf("DOWN ");
78: break;
79: }
80: case btnSELECT:
81: {
82: lcd.printf("SELECT");
83: break;
84: }
85: case btnNONE:
86: {
87: lcd.printf("NONE ");
88: break;
89: }
90: }
91: }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น