본문 바로가기

피지컬컴퓨팅/아두이노

아두이노와 LCD 사용 한 번에 끝내기(온습도,토양수분, 소리감지,초음파센서 응용방법)

반응형

LCD는 Liquid Crystal Display의 약자로 액정 디스플레이 또는 액정 표시장치입니다. 뒷면에 백라이트(backlight)가 있어 빛을 내며 앞면에 있는 액정에  문자나 숫자 등을 표시합니다. 여기에서는 가로로 16개의 문자를 출력할 수 있고 세로로 2줄을 표현할 수 있는 LCD라는 의미의 1602 LCD를 사용하여 실습합니다. 이 LCD는 I2C방식으로 통신을 하여 핀4개로 간편하게 연결할 수 있는 것이 장점입니다.

 

아두이노와 LCD 연결 회로도

아두이노와 LCD 연결
아두이노와 LCD 연결

LCD 라이브러리 설치

아두이노를 실행한후 툴->라이브러리 관리 메뉴를 실행한다.

LCD 라이브러리 설치
아두이노에 LCD 라이브러리 설치

검색란에 LiquidCrystal I2C를 검색하고 라이브러리를 설치합니다.

 

LCD I2C 주소확인 방법

LCD를 연결 할 때 I2C주소를 확인해야하는데 보통 0x27 또는 0x 3F입니다. LCD를 연결하여 I2C 주소를 알아내기 위한 소스코드입니다.

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);             
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

LCD I2C주소확인
LCD I2C주소확인

LCD I2C 주소가 0x27인 것을 알 수 있습니다.

 

LCD에 문자 표시하기

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); //I2C 주소를 미리 확인 할 것 0x27 또는 0x3F

void setup()
{
  lcd.init();  // LCD초기 설정             
  lcd.backlight(); // LCD초기 설정  
  lcd.setCursor(0,0); //텍스트가 LCD에 나타날 위치
  lcd.print("Good Morning"); 
  lcd.setCursor(2,1);
  lcd.print("How are you?"); 
}

void loop(){
}

LCD에 문자표시
LCD에 문자표시

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("HAPPY BIRTHDAY TO YOU");
}
 
void loop()
{
  for (int i = 0; i < 16; i++) {
    lcd.scrollDisplayLeft();
    delay(150);
  }
}

LCD와 아날로그 값 센서 연결하기 - 온습도, 소리감지, 수분감지센서

LCD에 온습도센서 DHT11 값 측정하여 표시하기

아두이노 온습도센서 lcd 연결
아두이노 온습도센서 lcd 연결

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int dht_pin = A0;
DHT dht11(dht_pin, DHT11);

void setup() {
  lcd.init();  // LCD초기 설정             
  lcd.backlight(); // LCD초기 설정  
  lcd.setCursor(0,0); //텍스트가 LCD에 나타날 위치
  Serial.begin(9600);
  dht11.begin();
}

void loop() {
  float humi = dht11.readHumidity();
  float temp = dht11.readTemperature();
  float hic = dht11.computeHeatIndex(temp, humi, false);

  if (isnan(humi) || isnan(temp)) {
    Serial.println("Failed to read from DHT11 sensor!");
    lcd.clear();
    return;
  }
  displayLCD(humi, hic);
  delay(1000);
}

void displayLCD(float h, float t) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Humi : ");
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0, 1);
  lcd.print("Temp : ");
  lcd.print(t);
  lcd.print(" C");
}

LCD에 온도습도센서 측정값 표시
LCD에 온도습도센서 측정값 표시

LCD에 소리감지센서 측정 값 표시하기

아두이노 소리감지센서 LCD 연결

 

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int sensorPin = A0;

void setup() {
  lcd.init();  // LCD초기 설정             
  lcd.backlight(); // LCD초기 설정  
 //텍스트가 LCD에 나타날 위치
  Serial.begin(9600); //시리얼 통신을 시작합니다.
  pinMode(sensorPin, INPUT);     // declare sensor as input
}

void loop() {
  int value = analogRead(sensorPin); // 센서로부터 센서값을 읽어 들입니다. 
  Serial.println(value);//센서값을 시리얼 모니터로 출력하여 현재 센서값을 보여줍니다.
  delay(100);

  if (value < 50) {          //소리감지 센서 측정 값에 따라 출력
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Silence");
  } else {
   lcd.clear();
   lcd.setCursor(5,1);
   lcd.print("Too loud");
  }
  delay(20);
  }

LCD에 소리감지센서 값 표시
LCD에 소리감지센서 값 표시

LCD에 수분센서 측정 값 표시하기

아두이노 토양수분센서 LCD 연결
아두이노 토양수분센서 LCD 연결

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int sensorPin = A0;

void setup() {
  lcd.init();  // LCD초기 설정             
  lcd.backlight(); // LCD초기 설정  
 //텍스트가 LCD에 나타날 위치
  Serial.begin(9600); //시리얼 통신을 시작합니다.
  pinMode(sensorPin, INPUT);     // declare sensor as input
}

void loop() {
  int value = analogRead(sensorPin); // 센서로부터 센서값을 읽어 들입니다. 
  Serial.println(value);//센서값을 시리얼 모니터로 출력하여 현재 센서값을 보여줍니다.
  delay(100);

  if (value > 400) {            // check if the input is HIGH
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Water Please");
  } 
  else {
   lcd.clear();
   lcd.setCursor(5,1);
   lcd.print("Enough");
  }
  delay(20);
  }
토양수분센서 값 LCD표시
토양수분센서 값 LCD표시

 

LCD와 초음파 센서연결하기

아두이노 초음파센서 LCD 연결
아두이노 초음파센서 LCD 연결

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16,2);

int distance; 
int triggerPin = 5;
int echoPin = 6;

void setup( )  {
  Serial.begin(9600);
  pinMode(triggerPin, OUTPUT);  // 트리거 핀 출력 설정
  pinMode(echoPin, INPUT);      // 에코 핀 입력 설정
  lcd.init();
  lcd.backlight(); // LCD초기 설정  
}

void loop( ) {
  // 트리거 핀으로 10 us의 펄스를 발생
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  //에코 핀 입력으로부터 거리를 cm 단위로 계산
  distance = pulseIn(echoPin, HIGH) / 58;
  distance = distance>100? 100:distance;

  lcd.setCursor(0,0);
  lcd.print("Distance");
  lcd.setCursor(0,1);
  lcd.print(distance);
  lcd.print("cm   ");

  Serial.println(String(distance)+"cm");
  delay(50);
 }

초음파거리측정 LCD에 표시
초음파거리측정 LCD에 표시

반응형