LCD의 개요
위의 LCD(16x2)는 특이하게 아두이노 쉴드처럼 남땝처리가 되어있는데, 핀 구성이 기존의 LCD의 회로방식과는 다르게 되어있다. 이 방식은 I2C통신방식이다. SPI통신은 핀 연결만 10번을 진행하게 되는데, 기존 SPI통신과는 다르게 I2C LCD는 회로가 간결하게 구성되어있는게 특징이다.
LCD 라이브러리 설치
이 LCD를 이용하려면 특정 라이브러리를 추가해 주어야한다.
LCD와 여러모듈을 이용하기 위해서는 "liquidcrystal I2C"라는 라이브러리가 필요하다, 그래서 특정 LCD에 맞는 라이브러리를 설치해 줄 필요가 있다.
아두이노를 실행하고 스케치 탭 - 라이브러리 포함하기 - 라이브러리 관리 를 들어간다.
라이브러리 관리를 들어가게되면 라이브러리 매니저라는 창이 뜨게된다.
검색창에 liquidcrystal I2C를 입력한다.
라이브러리 추가를 끝내고 설치가 완료되면 버전 옆에 INSTALLED 라는 글씨가 뜨게된다.
설정이 다 끝나면 다시 아두이노 창으로 돌아와서 예제 - LiquidCrystal I2C - HelloWorld 를 들어간다.
예제실습 - LCD 작동확인
이제 모든준비가 끝났다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
void setup()
{
lcd.init(); // LCD초기 설정
lcd.backlight(); // LCD초기 설정
lcd.setCursor(0,0); //텍스트가 LCD에 나타날 위치
lcd.print("Hellow, world!");
lcd.setCursor(3,1);
lcd.print("How are you?");
}
추가하면 이런식으로 Wire.h와 LiquidCrystal_I2C.h 라는 라이브러리가 추가된것을 확인할 수 있다.
위 코드는 조금 변경시켰는데, 3번째 줄을 (0X27, 16, 2) 로 수정을 했고, 아래 예제의 텍스트를 조금 수정했다.
16x2 lcd는 위사진과 같이 총 두줄로 구성이 되어있고, setCursor는 이 LCD에 텍스트가 나오게 되는 좌표라고 생각하면 편하다. 예를들어서 setCursor(3,1)이라고 하면 두번째 행, 3번째열에 위치하게된다.
Sensor | Arduino UNO |
GND(검정색) | GND |
VCC(빨간색) | 5V |
SDA(노란색) | A4 |
SCL(초록색) | A5 |
회로구성은 위와같다. 오른쪽 사진에서 표시된 핀들이 정확하고, 회로를 편집하는 과정에서 위 회로의 순서와는 조금 차이가 있다는점을 주의해야한다. 포트 구성은 위의 표와 같다.
코드를 입력하고 컴파일 까지 모두 다 끝내게 되면 위 사진과 같이 텍스트가 뜨는것을 확인할 수 있다.
예제실습 - LCD에 움직이는 텍스트 넣기
아까 기본예제를 이용해서 이번에는 움직이는 텍스트를 만들어 낼 수도있다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hellow, world!");
}
void loop()
{
for (int position = 0; position < 16; position++) {
lcd.scrollDisplayLeft();
delay(150);
}
for (int position = 0; position < 35; position++) {
lcd.scrollDisplayLeft();
delay(150);
}
}
위의 예제를 살짝 변형시켰는데, 차이점이 있다면 void loop안의 내용추가이다.
여기서 for문을 이용해서 정수가 늘어날때마다 텍스트가 한번씩 움직이는 scrollDisplay 함수를 이용해보았다.
좌로 1열씩 움직일때는 scrollDisplayLeft(), 우로 1열씩 움직일때는 scrollDisplayRight()를 쓰면된다.
위의 예제를 컴파일 하게되면 위와같이 움직이는 LCD를 만들어 낼 수있다.
이제 다음 여러가지 예제를 통해서 LCD를 응용해볼 수 있다.
가변저항(Potentiometer)을 이용해서 LED의 색상을 LCD에 표현해보기
Sensor | Arduino UNO |
GND(공통 - 검정색(회색)) | GND |
VCC(가변저항 - 빨간색) | Vin |
SDA(LCD - 노란색) | A4 |
SCL(LCD - 초록색) | A5 |
VCC(가변저항 - 갈색) | 5V |
A0(가변저항 - 갈색) | A0 |
LED(blue) | D2 |
LED(green) | D3 |
LED(red) | D4 |
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int val=0;
void setup()
{
lcd.init();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
lcd.backlight();
}
void loop()
{
val = analogRead(A0);
if (val <= 250) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);;
lcd.setCursor(5,0);
lcd.print("Color");
lcd.setCursor(5,1);
lcd.print("<B>");
}
else if(val > 250 && val <= 500){
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
lcd.setCursor(5,0);
lcd.print("Color");
lcd.setCursor(5,1);
lcd.print("<G>");
}
else{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
lcd.setCursor(5,0);
lcd.print("Color");
lcd.setCursor(5,1);
lcd.print("<R>");
}
}
회로구성은 위와같다. 가변저항값에 따라서 전구의 색이 변하는 조건문을 이용해서 LCD에 나타낸다.
위와같이 가변저항기를 돌리게되면 LCD의 텍스트가 바뀌는것을 확인할 수 있다.
온도센서(LM35)를 이용해서 현재온도를 LCD에 표현해보기
Sensor | Arduino UNO |
GND(공통 - 검정색) | GND |
VCC(LCD - 빨간색) | Vin |
SDA(LCD - 노란색) | A4 |
SCL(LCD - 초록색) | A5 |
VCC(온도센서 - 빨간색) | 5V |
A0(온도센서 - 주황색) | A0 |
회로구성은 위와같다, 주의해야 할점이 있는데 온도센서는 과부하가 걸리게 되면 온도가 급격하게 올라가기 때문에 오른쪽 사진과 같이 극성을 잘 확인해줄 필요가있다. 그 기준점을 잡는방법은 온도센서에 넙적한부분이 있는데 그부분을 앞으로 방향을 잡았을때 왼쪽이 5V 오른쪽이 GND, 가운데가 Output이 된다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
float temp; // 실수형 타입의 변수 설정
LiquidCrystal_I2C lcd(0x27,16,2);
void setup()
{
Serial.begin(9600);
}
void loop()
{
lcd.init();
int val = analogRead(A0); // 온도센서의 output에서 들어온 신호를 받아줄 변수지정
temp = val*0.48828125; // 화씨->섭씨로 변환한 값을 변수로 지정
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Temperature");
lcd.setCursor(6,1);
lcd.print(temp, 1);
lcd.setCursor(12,1);
lcd.print("C");
delay(1000);
}
위의 사진처럼 손을 갖다 대면 온도가 올라가는게 LCD에 표시가 된다.
온습도센서(DHT11)를 이용해서 온도,습도,불쾌지수를 LCD에 표현해보기
실생활에서 우리가 온도센서(LM35)를 사용하기도 하지만, 더 다양한 기능이 들어있는 온습도 센서(DHT11)를 더 선호하는 편이다. 이 온습도 센서를 이용하면 습도를 측정해서 습도에 따라 작동하는 제습기를 만들 수 있고, 창문에 래크,피니언,서브모터를 이용해서 비내릴대 창문을 열고 닫는기능을 설정할 수 있다.
DHT11 온습도센서는 총 4개의 핀으로 구성되어있다. 이런 타입의 센서가 있는반면에 모듈형으로 되어있는 온습도센서가 있는데, 모듈형은 3개의 핀으로 구성되어있다. 이번시간에는 4개의핀으로 구성된 기본형 온습도센서를 사용해볼것이다. 핀이 4개지만 사용하는 핀은3가지다. 아래 표에 맞게 회로를 연결시켜주도록 한다.
Sensor | Arduino UNO |
GND(공통 - 검정색) | GND |
VCC(LCD - 빨간색) | Vin |
SDA(LCD - 노란색) | A4 |
SCL(LCD - 초록색) | A5 |
VCC(온습도센서1번핀 - 빨간색) | 5V |
DATA(온습도센서 2번핀 - 주황색) | D2 |
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SimpleDHT.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// for DHT11,
// VCC: 5V or 3V
// GND: GND
// DATA: 2
int pinDHT11 = 2;
SimpleDHT11 dht11;
void setup()
{
Serial.begin(9600);
}
void loop()
{
lcd.init();
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err=");
lcd.setCursor(0,0);
lcd.print(err);
delay(1000);
return;
}
int tem = (int)temperature;
int hum = (int)humidity;
int index = 1.8*tem - 0.55*(1-hum / 100)*(1.8*tem - 26) + 32;
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("TEM : ");
lcd.print((int)temperature);
lcd.print("`C, ");
lcd.print((int)humidity);
lcd.print("H");
lcd.setCursor(0,1);
lcd.print("DI : ");
lcd.print(index);
}
코드는 위와같다. 온습도센서를 사용하기위해서는 simpleDHT라는 라이브러리를 설치해야된다. 필자는 simpleDHT라이브러리 안에있는 예제를 활용해보았다. 온습도센서 라이브러리에 관한 설명은 아래링크를 통해 확인가능하다.
그리고 위 코드에는 온도값을 나타낼 정수형변수 tem을 설정해주었고, 습도값을 나타내는 hum변수를 설정해 두었다. 이 변수는 불쾌지수를 구할때 중요한 변수이므로 초기에 정의를 잘 해둘필요가있다.
불쾌지수는 index라는 변수를 통해서 값을 읽어들일것이다. 위 코드대로 진행을 시키게되면 LCD첫줄엔는 온도값과 습도값이 나올것이고, 두번째줄에는 불쾌지수가 나올것이다.
컴파일을 모두 진행시키면 정상적으로 온도,습도,불쾌지수 값이 출력이 되는것을 확인 할 수 있다.
DS1302 RTC모듈을 이용해서 LCD 전자시계 만들기
이번에는 DS1302 RTC모듈을 이용해서 전자시계를 만들어보는 시간을 가져볼것이다.
RTC모듈은 실시간으로 시간을 출력하는 장치이다. RealTimeClock을 줄여서 흔히 RTC라고 부르는데, 이 장치는 각종 전자기기의 시간이나 타이머기능이 있는 모든제품에 사용된다.
Sensor | Arduino UNO |
GND(공통 - 검정색) | GND |
VCC(LCD - 빨간색) | Vin |
SDA(LCD - 노란색) | A4 |
SCL(LCD - 초록색) | A5 |
VCC(RTC - 빨간색) | 5V |
RST(RTC - 노란색) | D8 |
DAT(RTC - 노란색) | D7 |
CLK(RTC - 노란색) | D6 |
#include <virtuabotixRTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
virtuabotixRTC myRTC(6, 7, 8);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
myRTC.setDS1302Time(00, 48, 8, 7, 25, 7, 2020);
}
void loop() {
myRTC.updateTime();
lcd.setCursor(1,0);
lcd.print(myRTC.year);
lcd.print("/");
lcd.print(myRTC.month);
lcd.print("/");
lcd.print(myRTC.dayofmonth);
lcd.print("/");
switch (myRTC.dayofweek) {
case 1:
lcd.print("Sun");
break;
case 2:
Serial.print("MON");
break;
case 3:
lcd.print("TUE");
break;
case 4:
lcd.print("WED");
break;
case 5:
lcd.print("THU");
break;
case 6:
lcd.print("FRI");
break;
case 7:
lcd.print("SAT");
break;
}
lcd.setCursor(5,1);
lcd.print(myRTC.hours);
lcd.print(":");
lcd.print(myRTC.minutes);
lcd.print(":");
lcd.print(myRTC.seconds);
delay(1000);
lcd.clear();
}
RTC모듈을 사용하기위해서, virtuabotixRTC라이브러리를 사용해보았다. 이 라이브러리는 구글링을통해서 다운이 가능하며 필자가 올려놓은글에 설명과 자료가 나와있으니 아래 링크를 통해서 라이브러리를 다운 받아주도록하자.
컴파일을 진행시키면 첫번째줄에 년,월,날짜,요일이 출력되는것을 확인 할 수 있고, 두번째줄에는 시간이 표시되는것을 확인 할 수 있다.
초음파 센서(HC-SR04)를 이용해서 거리값을 LCD에 표현해보기
Sensor | Arduino UNO |
GND(공통 - 검정색) | GND |
VCC(LCD - 빨간색) | Vin |
SDA(LCD - 노란색) | A4 |
SCL(LCD - 초록색) | A5 |
VCC(초음파센서 - 빨간색) | 5V |
Trig(초음파센서 - 보라색) | D12 |
Echo(초음파센서 - 회색) | D11 |
#include <NewPing.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
lcd.setCursor(4,0);
lcd.print("Distance");
lcd.setCursor(5,1);
lcd.print(sonar.ping_cm());
lcd.setCursor(8,1);
lcd.print("cm");
delay(300);
lcd.clear();
}
초음파 센서는 아까 LCD라이브러리 추가했을때와 비슷하게 이것또한 라이브러리를 추가해 주어야된다.
라이브러리 관리창에 NewPing을 입력해서 설치해주도록한다. 그리고 NewPingExamle예제를 실행시키면 위의 코드와 같이 Newping.h 라이브러리가 포함되는것을 확인할 수있다. 다음에는 LiquidCrystal_I2C를 추가해주고 위와같은 코드를 작성하면 된다.
컴파일을 모두 진행하면 위와같이 손을 초음파센서에 갖다대면 값이 줄어들면서 변하는것을 확인할 수있다.
초음파에 대한 설명은 아래 링크를 참조하도록 한다.
'Programming > Arduino' 카테고리의 다른 글
[Arduino] 아두이노 온습도센서(DHT11) 여러가지 예제를 통해 알아보자 (0) | 2020.07.21 |
---|---|
[Arduino] 아두이노 초음파 센서(HC-SR04) 3가지 예제를 통해 거리를 감지해보자 (1) | 2020.07.19 |
[Arduino] 아두이노 조이스틱을 이용해서 쉽게 LED를 다루어 보자 (0) | 2020.07.10 |
[Arduino] 아두이노 광센서(CDS)를 활용해서 LED 제어하기 (0) | 2020.07.09 |
[Arduino] 아두이노 가변저항(Potentiometer) 쉽게 응용하기 (0) | 2020.07.08 |