코드 검색

레슨 20/31: LCD1602에 전압 표시하기

레슨 20/31: LCD1602에 전압 표시하기

이 프로젝트는 Arduino와 I2C 인터페이스를 갖춘 LCD1602 디스플레이를 사용하여 디지털 전압계를 구축하는 방법을 보여줍니다. 가변저항기에서 아날로그 전압을 읽어 화면에 표시함으로써, 아날로그-디지털 변환, I2C 통신, LCD 제어의 필수 기술을 배우게 됩니다. 

LCD_sunFounder

이 프로젝트는 많은 실용적인 응용 분야로 나아가는 훌륭한 발판입니다. 다음은 이를 바탕으로 구축할 수 있는 몇 가지 아이디어입니다:

  • 프로젝트용 휴대용 배터리 전압 모니터 구축.
  • 시각적 전압 판독 기능이 있는 간단한 전원 공급 장치 만들기.
  • 태양광 패널 또는 기타 가변 전압 소스의 출력 모니터링.
  • 광의존 저항기(LDR)와 같은 모든 아날로그 센서의 값을 읽을 수 있는 숫자로 표시.

이 가이드가 끝나면 구성 요소를 연결하고, 필요한 라이브러리를 구성하고, 자체 전압 디스플레이를 만드는 코드를 작성하는 방법을 명확히 이해하게 될 것입니다.

potentiometer

하드웨어 구성 요소

이 프로젝트를 구축하려면 다음 구성 요소가 필요합니다. 이 과정은 이러한 모든 부품이 포함된 SunFounder 3-in-1 Arduino 키트를 기반으로 합니다.

  • Arduino 보드 (예: Uno)
  • I2C 모듈이 있는 LCD1602 디스플레이
  • 가변저항기 (10kΩ 권장)
  • 점퍼 와이어
  • 브레드보드

LCD1602 및 I2C 모듈 이해하기

LCD1602은 16열 2행의 널리 사용되는 영숫자 디스플레이입니다. 표준 병렬 LCD는 제어에 많은 디지털 핀이 필요합니다. 그러나 이 디스플레이에는 뒷면에 전용 I2C 모듈이 부착되어 있습니다(비디오 01:30). 이 모듈은 배선을 획기적으로 단순화하여 VCC, GND, SDA, SCL의 4개 와이어만으로 연결을 줄입니다. 이는 I2C 모듈이 브리지 역할을 하여 간단한 I2C 직렬 신호를 LCD에 필요한 병렬 신호로 변환하기 때문에 가능합니다.

이 프로젝트는 Arduino가 단 두 개의 와이어로 여러 장치와 통신할 수 있게 해주는 통신 프로토콜인 I2C 인터페이스를 사용합니다. 이는 다양한 유형의 센서와 디스플레이를 연결하는 데 필수적인 기술입니다.

배선 가이드

LCD1602_pot_wiring

LCD와 가변저항기를 Arduino에 연결하는 것은 간단합니다. I2C 모듈에는 전원과 두 개의 통신 라인이 필요합니다. 가변저항기는 가변 전압 분배기 역할을 하여 와이퍼 핀의 전압을 조정할 수 있게 합니다.

다음은 상세한 배선 설정입니다:

  • LCD I2C 모듈을 Arduino에 연결:
    • GND를 Arduino GND에 연결 (비디오 05:38).
    • VCC를 Arduino 5V에 연결 (비디오 05:47).
    • SDA를 Arduino A4에 연결 (비디오 05:47).
    • SCL을 Arduino A5에 연결 (비디오 05:57).
  • 가변저항기를 Arduino에 연결:
    • 왼쪽 핀을 Arduino 5V에 연결 (비디오 33:39).
    • 가운데 핀 (와이퍼)을 Arduino A0에 연결 (비디오 33:43).
    • 오른쪽 핀을 Arduino GND에 연결 (비디오 33:43).

필요한 라이브러리 설치

이 프로젝트는 I2C를 통해 LCD를 제어하기 위해 외부 라이브러리가 필요합니다. 비디오에서 사용된 라이브러리는 "Arduino Liquid Crystal I2C" 라이브러리입니다. Robojax 리소스 페이지 또는 GitHub에서 제공된 링크에서 다운로드할 수 있습니다 (비디오 06:16).

설치하려면 라이브러리를 ZIP 파일로 다운로드하세요. 그런 다음 Arduino IDE에서 Sketch > Include Library > Add .ZIP Library...로 이동하여 다운로드한 파일을 선택하세요 (비디오 06:41).

LCD의 I2C 주소 찾기

메인 코드를 업로드하기 전에 특정 LCD 모듈의 I2C 주소를 확인하는 것이 중요합니다. 이 주소는 제조업체에 따라 다를 수 있습니다. 비디오는 I2C 스캐너를 사용하여 이를 찾는 방법을 보여줍니다 (비디오 08:11).

이 스캐너는 File > Examples > Wire > i2c_scanner에서 찾을 수 있습니다. LCD를 연결한 상태에서 이 코드를 Arduino에 업로드하고 시리얼 모니터를 엽니다. 주소가 표시되며, 일반적으로 0x27 또는 0x3F입니다. 메인 코드에서 이 주소를 사용해야 합니다.

코드 설명

이 프로젝트의 코드는 아날로그 값을 읽고 표시용으로 형식을 지정하는 데 중점을 둡니다. 주요 사용자 구성 가능 부분을 살펴보겠습니다.

1. 라이브러리 포함 및 LCD 객체

이 섹션은 필요한 라이브러리를 포함하고 LCD용 객체를 생성합니다. 가장 중요한 부분은 I2C 주소로, 이전 단계에서 찾은 주소와 일치하도록 변경해야 합니다.

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

// 16 또는 20자 및 2 또는 4줄 디스플레이의 경우 LCD 주소를 0x27로 설정
LiquidCrystal_I2C lcd(0x27, 16, 2);
  • #include <Wire.h>: 이 라이브러리는 Arduino에 내장되어 있으며 I2C 통신에 필요합니다.
  • #include <LiquidCrystal_I2C.h>: 방금 설치한 라이브러리를 포함하며, LCD를 제어하는 함수를 제공합니다.
  • LiquidCrystal_I2C lcd(0x27, 16, 2);: 이 줄은 lcd라는 객체를 생성합니다. 첫 번째 매개변수인 0x27은 앞서 찾은 I2C 주소입니다. 두 번째와 세 번째 매개변수는 LCD의 크기를 정의합니다: 16열과 2행입니다. 주소가 다르다면 0x27을 해당 주소로 변경해야 합니다.

2. 설정 및 루프 함수

setup() 함수는 LCD를 초기화하고 백라이트를 켭니다. loop() 함수는 전압을 읽고 표시하는 핵심 로직을 포함합니다.

void setup()
{
  lcd.begin();
  lcd.backlight();
}

void loop()
{
  int potValue = analogRead(A0);
  float voltage = potValue * (5.0 / 1023.0);
  // ... (LCD 표시 코드)
  delay(1000);
}
  • lcd.begin(): LCD 인터페이스를 초기화하고 사용할 준비를 합니다.
  • lcd.backlight(): 디스플레이의 백라이트를 켜서 텍스트를 보이게 합니다.
  • int potValue = analogRead(A0);: 가변저항의 와이퍼에 연결된 A0 핀에서 원시 아날로그 값을 읽습니다. 이 값은 0에서 1023 사이의 정수로, 0V에서 5V의 전압을 나타냅니다.
  • float voltage = potValue * (5.0 / 1023.0);: 이는 중요한 변환 단계입니다. 원시 ADC 값을 실제 전압 값으로 변환합니다. 공식은 원시 값에 기준 전압(5.0V)과 최대 ADC 값(1023)의 비율을 곱합니다. ADC가 전압을 직접 읽지 않고 비례하는 숫자를 읽기 때문에 이 과정이 필요합니다.

3. 전압 표시

코드는 화면을 지운 다음 두 번째 줄의 특정 위치에 전압 값을 출력합니다.

  lcd.clear();
  lcd.print("LCD1602 Tutorial");
  lcd.setCursor (0,1); // 두 번째 줄의 시작으로 이동
  lcd.print("Voltage:");
  lcd.setCursor (9,1); // 두 번째 줄의 9번째 문자로 설정
  lcd.print(voltage); 
  lcd.setCursor (13,1); // 두 번째 줄의 14번째 문자로 설정
  lcd.print("V"); 
  • lcd.clear(): 화면에서 이전 텍스트를 모두 지웁니다.
  • lcd.print("LCD1602 Tutorial"): 첫 번째 줄에 제목을 출력합니다.
  • lcd.setCursor (0,1): 커서를 두 번째 줄의 시작으로 설정합니다. 첫 번째 매개변수는 열(0-15)이고, 두 번째는 행(0은 첫 번째 줄, 1은 두 번째 줄)입니다.
  • lcd.print(voltage): 계산된 전압 값을 출력합니다. float 변수는 기본적으로 소수점 두 자리까지 출력됩니다.
  • lcd.setCursor (13,1): 숫자 바로 뒤에 "V" 문자를 배치하기 위해 두 번째 줄의 13번째 열로 커서를 이동합니다.

실시간 프로젝트 시연

코드를 업로드하면 LCD 첫 번째 줄에 "LCD1602 Tutorial"이 표시됩니다. 두 번째 줄에는 "Voltage:"와 현재 전압 값이 표시됩니다. 가변저항의 손잡이를 돌리면 표시된 전압이 약 0.00V에서 5.00V까지 실시간으로 변하는 것을 볼 수 있습니다(비디오 35:25 참조).

이 프로젝트는 원시 아날로그 신호를 명확하고 사람이 읽을 수 있는 값으로 변환하는 방법의 완벽한 예입니다. 여기서 배운 기술은 향후 사용할 다른 아날로그 센서에도 직접 적용할 수 있습니다.

비디오는 LCD에 텍스트 표시, 스크롤, 사용자 정의 문자 만들기 등 다른 관련 주제도 다룹니다.

이 비디오의 관련 프로젝트

챕터

  • [00:00] LCD1602 소개 및 프로젝트 개요
  • [01:30] LCD1602 하드웨어 및 I2C 모듈 설명
  • [04:06] 점퍼로 I2C 주소 설정
  • [05:28] LCD1602 배선도
  • [07:31] 기본 텍스트 표시를 위한 코드 설명
  • [11:10] 깜빡이는 커서 예제 시연
  • [13:46] 사용자 정의 문자 만들기 및 사용
  • [18:51] 직렬 표시 예제 사용
  • [23:16] LCD에서 텍스트 스크롤
  • [26:13] DHT11의 온도 및 습도 표시
  • [33:00] 가변저항에서 전압 읽기 및 표시
  • [35:56] 초음파 센서에서 거리 표시

이미지

potentiometer
potentiometer
LCD1602_pot_wiring
LCD1602_pot_wiring
LCD_sunFounder
LCD_sunFounder
912-Lesson 20/31: Displaying voltage on LCD1602
언어: C++
/*
Lesson 20/31: Displaying voltage on LCD1602
Get this code and watch video Download and resource page https://robojax.com/RJT603
YouTube video https://www.youtube.com/watch?v=NXAswOc_2zg
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 or 20 chars and 2 or 4 lines display
LiquidCrystal_I2C lcd(0x27, 16, 2);

int count =700;
void setup()
{
  // Robojax code for LCD with I2C
	// initialize the LCD, 
	lcd.begin();
 
	// Turn on the blacklight and print a message.
	lcd.backlight();
  // Robojax code for LCD with I2C


}

void loop()
{
  int potValue = analogRead(A0);
  float voltage = potValue * (5.0 / 1023.0);
  //start of loop Robojax code for LCD with I2C
  lcd.clear();
  lcd.print("LCD1602 Tutorial");
  lcd.setCursor (0,1); // go to start of 2nd line
  lcd.print("Voltage:");

  lcd.setCursor (9,1); // set to line 2 char 9
  lcd.print(voltage); 

  lcd.setCursor (13,1); // set to line 2 char 14
  lcd.print("V"); 

  //lcd.setCursor (3,3); // set to line 4 character 4
  //lcd.print("Text in line 4"); 
        
  delay(1000);
  count++;
 //end of loopcode Robojax code for LCD with I2C
}

자원 및 참고자료

파일📁

아두이노 라이브러리 (zip)

사용자 매뉴얼