【 아두이노기초】#21 LCD쉴드이용하기III(keyPAD-키패드2) LCD 액정 디스플레이를 이용하기 위해서는 다소 복잡한 선 연결이 필요했다. (앞 강좌 참조: http://rasino.tistory.com/132 or http://rasino.tistory.com/133 참조 ) 하지만 아두이노 우노 보드 위에 삽입되는 LCD 쉴드를 이용하면 간편히 연결되어 LCD 디스플레이 하기가 훨씬 간편해지는 장점이 있다. 이 외에 I2C모듈을 내장한 LCD의 경우 보다 적은 핀 연결이 가능하고 통신도 수월해지는 장점이 있다. 이번 시간에는 LCD shield (쉴드)의 키패드 (Keypad)를 다루어 보도록 하자 ▶ LCD 키패드 쉴드( 1602) 와 키패드 실물 이미지 : ▶ 부대품 목록 : 아두이노 보드 ▶ 부품 목록 : LCD키패드 쉴드( 1602 ) ▶ 실습 절차 : 1. 실습목표 - LCD1번 줄에 ‘Push the buttons’ 를 출력한다 - LCD2번 줄에 ‘각 버튼을 누를 때 마다 버튼 이름이 출력 되도록 한다. - 커서 (9,1) 위치에 숫자를 표시하고 UP버튼은 1씩 증가, Down버튼은 1씩 감소 시킨다 - LEFT, RIGHT 버튼으로 현재의 커서 위치를 좌우로 이동 시킬 수 있게 함 2. 실습절차 - LCD 쉴드의키패드는A0 (아날로그 포트)에연결되어 있고 각 버튼 마다 출력 전압 값이 다르게 설계되어 있다. - 아날로그 포트(A0)는 10비트(2^10=1023)의 데이터 값으로 입·출력 되는데 각 버튼 마다 다른 값이 입력되는 것이다 - 아래 각 버튼 별 ADC값 표를 참고하고 ‘switch~case’구문을 이용하여 버튼이 눌러지면 해당 버튼 이름을 표시하라 - 각 버튼의 ADC 값은 Serial 통신(창) 화면을 통해 아래와 같은지 확인해보고,‘switch~case’구문에 사용될 적정 범위 값을 임의로 정하라. (RST 버튼은 보드의 Reset 버튼과 같은 기능-설정 되어 있음) ※ 버튼 이름 ▶ 버튼 별 전압 값과 변환 입력되는 ADC값 표 ▶ LCD 함수 표 ( LiquidCrystal.h 파일 포함된 ) ▶ 프로그램 (코드& 설명) : #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD 쉴드 제어를 위한 핀 설정 intlcd_key = 0; intadc_key_in = 0; int counter = 0; // 숫자 증감을 위한 변수 int cur = 0; // cursor 위치값 변수 #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 intread_LCD_buttons() { adc_key_in=analogRead(0); // 키패드와 연결된 AO핀의 아날로그값 // 읽어온 아날로그의 값에 따라 눌려진 버튼을 판단함 if (adc_key_in > 1000 ) return btnNONE; // 모니터링 값 : 1023 if (adc_key_in < 20) return btnRIGHT; // 모니터링 값 : 0 if (adc_key_in < 150) return btnUP; // 모니터링 값 : 100 if (adc_key_in < 300) return btnDOWN; // 모니터링 값 : 258 if (adc_key_in < 500) return btnLEFT; // 모니터링 값 : 411 if (adc_key_in < 700) return btnSELECT; // 모니터링 값 : 641 return btnNONE; } // 기타의 경우 btnNONE을 리턴함 void setup() { lcd.begin(16, 2); // LCD 초기화 lcd.setCursor(0,0); // LCD 첫 출에 출력 lcd.print("Push the buttons"); // LCD 출력 메세지 } void loop() { lcd.cursor(); // LCD에 커서를 표시 lcd.setCursor(9,1); // (9,1) 위치로 커서를 옮김 lcd.print(counter); // (9,1) 위치에 숫자를 표시 lcd.setCursor(0,1); // 2번째 줄 1번째 칸에커서 위치시킴 lcd.print(counter); lcd_key = read_LCD_buttons(); // 눌려진 버튼이름 출력 하는 함수 호출 switch (lcd_key) { // 버튼 확인을 위한 스위치 구문 case btnRIGHT: { // 오른쪽 버튼 lcd.print("RIGHT "); lcd.setCursor(cur++,1); // 버튼이 눌러질때 마다 커서를 우로1칸이동 delay(500); break; } case btnLEFT: { // 왼쪽 버튼 lcd.print("LEFT "); lcd.setCursor(cur--,1); // 버튼이 눌러지는 동안 빠른 루틴 회전에 delay(500); // 의한 입력방지를 위해 delay 삽입 break; } case btnUP: { // 위쪽 버튼 lcd.print("UP "); lcd.setCursor(9,1); lcd.print(counter++); // 버튼 누를 때 마다 숫자 값을 +1 씩 증가 delay(500); break; } case btnDOWN: { // 아래쪽 버튼 lcd.print("DOWN "); lcd.setCursor(9,1); lcd.print(counter--); // 버튼 누를 때 마다 숫자 값을 -1 씩 감소 delay(500); break; } case btnSELECT: { // 선택 버튼 lcd.print("SELECT"); break; } case btnNONE: { // 아무것도 누르지 않음 lcd.print("NONE "); break; } } } ▶ 실행 영상 : ▶ 아두이노 코드 다운로드 : LCDshield_Keypad_control2.ino |