Adafruit 7 segment display I2C backpack 두번째 글입니다. 여기서는 구동 소스코드에 대해 알아보겠습니다. Adafruit 사는 먼저 글에서도 말씀드렸듯이, 자신들이 판매하는 제품에 대한 튜토리얼을 대부분 제공하고 또 필요한 라이브러리를 제작해 제공합니다. 이 백팩도 전용 라이브러리와 예제가 제공되어 손쉽게 적용할 수 있었습니다. 여기서는 제가 필요한 함수 위주로 소스코드를 소개하겠습니다.
우선, 테스트를 위해 아래와 같이 회로를 구성했습니다. 사용한 보드는 DFRobot 사의 Bluno NANO 입니다. Arduino NANO와 호환되고 BLE 칩을 포함시켜서 아이폰 등과 블루투스 통신이 가능합니다.
위와 같이 구성하고 우선 기본 제공되는 예제를 불러왔습니다.
아무런 수정없이 바로 업로드 해서 실행해 보았습니다. 이상없이 잘 작동했고 아래 동영상에서 확인 가능합니다.
예제 코드에서 몇 가지만 보겠습니다.
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
필요한 헤더파일입니다.
Wire.h 는 I2C 프로토콜을 위해서 필요합니다.
Adafruit_LEDBackpack.h 는 LEd 모듈을 위한 클래스 및 함수들을 위해 필요합니다. Adafruit 사는 이 백팩 말고도 LED 매트릭스와 LED 바를 위한 I2C 백팩을 판매하는데, 모두 이 헤더파일을 공통으로 사용합니다.
Adafruit_GFX.h 는 백팩 뿐만아니라 OLED 등 Adafruit 에서 판매하는 여러가지 디스플레이 장치에 대한 그래픽 함수를 제공합니다.
Adafruit_7segment matrix = Adafruit_7segment();
matrix라는 이름으로 클래스 인스턴스를 생성하고 할당하는 구문입니다.
void setup() {
matrix.begin(0x70);
}
기본 I2C 주소는 0x70 입니다. 클래스 생성, 할당하고 시작만 알리면 사용할 준비는 끝입니다. 참 편하네요!!
matrix.print(1234);
matrix.writeDisplay();
matrix.print(12.34);
matrix.writeDisplay();
예제 코드에서 헤더파일, 인스턴스 생성, 인스턴스 시작만 빼고 나머지는 삭제한 후, 직접 테스트 소스코드를 작성했습니다. print() 함수는 일반적인 아두이노 print() 함수와 동일하게 사용하시면 됩니다. 주의하실 것은, 이 라이브러리에서 제공하는 출력함수들은 출력값을 버퍼에만 저장합니다. 그래서 실제로는 아무런 변화가 없고, 버퍼에 있는 내용을 실제로 디스플레이에 출력하도록 writeDisplay() 함수를 호출해야 합니다.
"1234"를 출력한 모습입니다.
"12.34"를 출력한 모습입니다.
다음은 카운트 예제입니다.
for ( int counter = 0; counter < 9999; counter++ ) {
matrix.print(counter);
matrix.writeDisplay();
delay(20);
}
0부터 9998까지 1씩 증가하며 카운트하는 예제입니다., delay() 함수를 이용해서 출력속도를 제어합니다.
void loop() {
matrix.clear();
matrix.writeDisplay();
delay(2000);
for ( int counter = 100; counter < 1001; counter +=100 ) {
matrix.print(counter);
matrix.writeDisplay();
delay(300);
}
}
clear() 함수는 화면을 지우는 함수이며 마찬가지로 writeDisplay() 함수를 호출해야 적용됩니다. 100 부터 1000까지 100 단위로 출력하며 매번 루프를 시작할때마다 화면을 지우고 2초간 기다립니다.
matrix.writeDigitNum(0, 1);
matrix.writeDigitNum(1, 2);
matrix.writeDigitNum(3, 3);
matrix.writeDigitNum(4, 4);
writeDigitNum() 함수는 네자리를 각각 출력할 때 사용합니다. 두 개의 인수중 첫번째는 출력될 자리를 의미합니다. 첫번째 숫자부터 각각 0, 1, 3, 4 순으로 구별하는데, 숫자 "2"가 없으니 주의하세요. "2"는 가운데 콜론이 차지합니다. 두번째 인수는 출력될 값입니다. 따라서 위 코드는 숫자 "1234" 가 출력됩니다.
matrix.writeDigitNum(0, 1, true);
matrix.writeDigitNum(1, 2, true);
matrix.writeDigitNum(3, 3, true);
matrix.writeDigitNum(4, 4, true);
writeDigitNum() 함수에 3번째 인수를 주게 되면 소수점(Decimal)을 제어할 수 있습니다. Boolean 값으로 true 면 출력, false 면 출력하지 않습니다. 따라서 이 코드는 "1.2.3.4."을 출력하게 됩니다.
matrix.drawColon(true);
가운데 콜론을 출력하는 함수입니다. true 값이면 콜론이 출력됩니다.
아래 소스는 위에서 설명한 몇가지를 포함하는 예제입니다.
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Adafruit_7segment matrix = Adafruit_7segment();
void setup() {
matrix.begin(0x70);
matrix.clear();
matrix.writeDisplay();
delay(2000);
matrix.writeDigitNum(0, 1);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(1, 2);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(3, 3);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(4, 4);
matrix.writeDisplay();
delay(1000);
matrix.clear();
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(0, 1, true);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(1, 2, true);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(3, 3, true);
matrix.writeDisplay();
delay(1000);
matrix.writeDigitNum(4, 4, true);
matrix.writeDisplay();
delay(1000);
matrix.clear();
matrix.writeDisplay();
delay(1000);
matrix.drawColon(true);
matrix.writeDisplay();
}
void loop() {
}
matrix.blinkRate(1);
Blink 함수입니다. 깜박임 효과를 위해 1에서 3까지의 인수를 줍니다. 1을 빠르게, 3은 느리게, 2는 중간입니다.
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Adafruit_7segment matrix = Adafruit_7segment();
void setup() {
matrix.begin(0x70);
matrix.clear();
matrix.writeDisplay();
delay(2000);
matrix.blinkRate(1);
matrix.print(1234);
matrix.writeDisplay();
delay(3500);
matrix.blinkRate(2);
matrix.writeDigitNum(0, 1, true);
matrix.writeDigitNum(1, 2, true);
matrix.writeDigitNum(3, 3, true);
matrix.writeDigitNum(4, 4, true);
matrix.writeDisplay();
delay(3500);
matrix.blinkRate(3);
matrix.writeDigitNum(0, 1, true);
matrix.writeDigitNum(1, 2, true);
matrix.writeDigitNum(3, 3, true);
matrix.writeDigitNum(4, 4, true);
matrix.drawColon(true);
matrix.writeDisplay();
}
void loop() {
}
전체 소스와 구동 영상입니다. 동영상은 주로 아이폰으로 촬영하는데, 자동노출로 인해 깜박일 때마다 화면이 출렁이네요!^^;;;