산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

이 아두이노 튜토리얼에서는 MAX7219 드라이버와 아두이노 보드를 사용해 8×8 LED 매트릭스를 제어하는 방법을 배웁니다. 아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.

개요

총 세 가지 예제를 다룹니다: 첫 번째로 MAX7219의 기본 작동 원리를 설명하고, 두 번째로 8×8 LED 매트릭스에서 스크롤 텍스트 구현 방법을, 세 번째로 블루투스와 직접 제작한 안드로이드 앱으로 제어하는 방법을 알아봅니다.

MAX7219

MAX7219 드라이버를 자세히 살펴보겠습니다. 이 IC는 아두이노와 단 3개의 와이어만으로 통신하면서 64개의 개별 LED를 구동할 수 있으며, 여러 드라이버와 매트릭스를 데이지 체인 방식으로 연결해도 여전히 동일한 3개 와이어만 사용합니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

64개 LED는 IC의 16개 출력 핀으로 구동됩니다. 어떻게 가능한지 궁금하실 텐데, 동시에 켜지는 LED의 최대 개수는 실제로 8개입니다. LED는 8×8 행렬의 행과 열로 배열되어 있습니다. MAX7219는 각 열을 매우 짧은 시간 동안 활성화하면서 동시에 각 행도 구동합니다. 열과 행을 빠르게 전환함으로써 사람의 눈에는 연속적인 빛으로 보입니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

일반적인 8×8 LED 매트릭스 핀이 내부적으로 어떻게 배열되어 있는지 확인하세요. 직접 매트릭스를 제작할 경우 이 점을 고려해야 합니다.

일반적인 MAX7219 브레이크아웃 보드에는 5V와 IC 18번 핀 사이에 저항이 있습니다. 이 저항은 LED 밝기나 전류 흐름을 설정하는 용도입니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

IC 데이터시트의 다음 표는 LED의 순방향 전압 강하에 따라 사용해야 할 저항 값을 보여줍니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

회로도


8×8 LED 매트릭스 모듈을 아두이노 보드에 연결해 보겠습니다. 회로도는 다음과 같습니다:

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

모듈의 VCC와 GND는 아두이노의 5V와 GND 핀에, DIN, CLK, CS 핀은 아두이노의 아무 디지털 핀에 연결하면 됩니다. 모듈을 여러 개 연결하려면 이전 브레이크아웃 보드의 출력 핀을 새 모듈의 입력 핀에 연결하면 됩니다. 이 핀들은 모두 동일하지만, 이전 보드의 DOUT 핀이 새 보드의 DIN 핀에 연결된다는 점만 다릅니다.

필요한 부품은 아래 링크에서 구할 수 있습니다:

  • 8×8 LED MAX7219 도트 매트릭스 모듈…..
  • HC-05 블루투스 모듈 ………………………
  • 아두이노 보드 ……………………………………..
  • 브레드보드와 점퍼 와이어 …………………

기본 MAX7219 아두이노 코드

모듈 연결이 완료되면 첫 번째 예제의 아두이노 코드를 살펴봅니다. GitHub에서 다운로드할 수 있는 MaxMatrix 라이브러리를 사용합니다.

/* 8x8 LED 매트릭스 MAX7219 예제 01 by Dejan Nedelkovski, www.HowToMechatronics.com
 * 기반 라이브러리: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */
#include <MaxMatrix.h>
int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 1;
MaxMatrix m(DIN, CS, CLK, maxInUse);
char A[] = {4, 8, B01111110, B00010001, B00010001, B01111110};
char B[] = {4, 8, B01111111, B01001001, B01001001, B00110110};
char smile01[] = {8, 8, B00111100, B01000010, B10010101, B10100001, B10100001, B10010101, B01000010, B00111100};
char smile02[] = {8, 8, B00111100, B01000010, B10010101, B10010001, B10010001, B10010101, B01000010, B00111100};
char smile03[] = {8, 8, B00111100, B01000010, B10100101, B10010001, B10010001, B10100101, B01000010, B00111100};
void setup() {
  m.init();
  m.setIntensity(8);
}
void loop() {
  m.setDot(6, 2, true);
  delay(1000);
  m.setDot(6, 3, true);
  delay(1000);
  m.clear();
  for (int i = 0; i < 8; i++) {
    m.setDot(i, i, true);
    delay(300);
  }
  m.clear();
  m.writeSprite(2, 0, A);
  delay(1000);
  m.writeSprite(2, 0, B);
  delay(1000);
  m.writeSprite(0, 0, smile01);
  delay(1000);
  m.writeSprite(0, 0, smile02);
  delay(1000);
  m.writeSprite(0, 0, smile03);
  delay(1000);
  for (int i = 0; i < 8; i++) {
    m.shiftLeft(false, false);
    delay(300);
  }
  m.clear();
}코드 언어: Arduino (arduino)

설명: 먼저 MaxMatrix.h 라이브러리를 포함하고, 모듈 연결 핀을 정의하며, 사용 모듈 수를 설정하고 MaxMatrix 객체를 생성합니다.

문자 표시를 위해 문자나 바이트 배열로 문자를 정의합니다. 비트 패턴으로 문자가 형성되며(0과 1), 라이브러리 예제에서는 나중에 shiftLeft 함수로 텍스트 스크롤을 쉽게 구현하기 위해 90도 회전된 형태로 정의합니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

setup에서는 모듈 초기화와 LED 밝기 설정을 합니다. loop에서 setDot() 함수로 X, Y(행/열) 위치의 개별 LED를 켜고, clear()로 디스플레이를 지웁니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

미리 정의한 문자는 writeSprite() 함수로 표시하며, 첫 두 인자는 문자의 왼쪽 상단 모서리 X, Y 위치입니다. 마지막에 shiftLeft() 함수로 문자를 왼쪽으로 이동/스크롤합니다.

8×8 LED 매트릭스 스크롤 아두이노 코드


스크롤 텍스트 예제를 보고 무엇이 다른지 확인해 보겠습니다. 코드 아래에 설명이 있습니다.

/* 8x8 LED 매트릭스 MAX7219 스크롤 텍스트 예제
 * 기반 라이브러리: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ 백슬래시
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // ^
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // s
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // t
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // u
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // v
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // w
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // x
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // y
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 2;
MaxMatrix m(DIN, CS, CLK, maxInUse);
byte buffer[10];
char text[] = "HowToMechatronics.com "; // 스크롤 텍스트
void setup() {
  m.init();
  m.setIntensity(15);
}
void loop() {
  printStringWithShift(text, 100); // (텍스트, 스크롤 속도)
}
void printCharWithShift(char c, int shift_speed) {
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7 * c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);
  for (int i = 0; i < buffer[0] + 1; i++) {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}
void printStringWithShift(char* s, int shift_speed) {
  while (*s != 0) {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}코드 언어: Arduino (arduino)

설명: 여기서 PROGMEM용 추가 라이브러리를 포함하는데, 이는 변수 수정자로 정적 데이터를 SRAM 대신 플래시 메모리에 저장하는 데 사용됩니다. 이번 경우처럼 문자 정의 등 정적 변수 데이터베이스가 클 때는 2KB SRAM 대신 32KB 플래시 메모리에 저장하는 것이 효율적입니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

문자 배열로 스크롤 텍스트를 정의하고, loop에서 printStringWithShift 사용자 정의 함수로 텍스트를 LED 매트릭스에 스크롤 출력합니다. 두 번째 인자는 밀리초 단위 스크롤 속도입니다. 이 함수는 먼저 텍스트 문자열에서 문자를 추출한 뒤 스크롤 문자를 LED 매트릭스에 표시합니다.

블루투스로 8×8 LED 매트릭스 제어하는 안드로이드 앱


MAX7219 작동 원리를 배웠으니, 실용적인 아두이노 프로젝트로 커스텀 안드로이드 앱을 만들어 블루투스 통신으로 LED 매트릭스를 제어해 보겠습니다. 진행하기 전에 HC-05 블루투스 모듈 사용법과 MIT 앱 인벤터로 커스텀 안드로이드 앱 만드는 방법에 대한 자세한 튜토리얼을 먼저 확인하시길 권장합니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

아래는 아두이노 코드이며, 이전 예제와 달라진 점을 살펴보겠습니다.

/* 8x8 LED 매트릭스 MAX7219 스크롤 텍스트 안드로이드 블루투스 제어 by Dejan Nedelkovski, www.HowToMechatronics.com
 * 기반 라이브러리: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */
#include <MaxMatrix.h>
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B01001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B01001001, B01110110, B00000000, // R
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ 백슬래시
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // ^
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010100, B01000100, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int dIn = 7;
int clk = 6;
int cs = 5;
int maxInUse = 2;
MaxMatrix m(dIn, cs, clk, maxInUse);
SoftwareSerial Bluetooth(8, 7); // 블루투스
byte buffer[10];
char incomebyte;
int scrollSpeed = 100;
char text[100] = "HowToMechatronics.com "; // 초기 텍스트
int brightness = 15;
int count = 0;
char indicator;
void setup() {
  m.init();
  m.setIntensity(brightness);
  Bluetooth.begin(38400); // 블루투스 모듈 기본 통신 속도
}
void loop() {
  printStringWithShift(text, scrollSpeed);
  if (Bluetooth.available()) {
    indicator = Bluetooth.read();
    // 안드로이드 앱에서 "Send" 버튼 누르면 이전 텍스트 지우기
    if (indicator == '1') {
      for (int i = 0; i < 100; i++) {
        text[i] = 0;
        m.clear();
      }
      // 폰에서 오는 전체 데이터/문자열 읽어 text[] 배열에 저장
      while (Bluetooth.available()) {
        incomebyte = Bluetooth.read();
        text[count] = incomebyte;
        count++;
      }
      count = 0;
    }
    // 스크롤 속도 조절
    else if (indicator == '2') {
      String sS = Bluetooth.readString();
      scrollSpeed = 150 - sS.toInt(); // 밀리초, 낮은 값이 더 빠른 스크롤
    }
    // 밝기 조절
    else if (indicator == '3') {
      String sB = Bluetooth.readString();
      brightness = sB.toInt();
      m.setIntensity(brightness);
    }
  }
}
void printCharWithShift(char c, int shift_speed) {
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7 * c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);
  for (int i = 0; i < buffer[0] + 1; i++) {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}
void printStringWithShift(char* s, int shift_speed) {
  while (*s != 0) {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}
void printString(char* s) {
  int col = 0;
  while (*s != 0) {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7 * c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
}코드 언어: Arduino (arduino)

설명: 먼저 블루투스 통신을 위한 SoftwareSerial.h 라이브러리를 포함하고 프로그램에 필요한 변수들을 정의합니다. setup에서 블루투스를 기본 보드레이트 38400bps로 초기화합니다. 초기 텍스트 메시지를 "HowToMechatronics.com"으로, 스크롤 속도를 100ms 지연으로 설정했습니다.

loop에서 Bluetooth.available()로 시리얼 포트에 수신 데이터가 있는지 확인하고, 있으면 Bluetooth.read()로 한 바이트씩 읽습니다. 첫 수신 바이트는 항상 "indicator" 변수에 저장되며, 이에 따라 텍스트 메시지, 스크롤 속도, LED 매트릭스 밝기 중 무엇을 변경할지 결정합니다.

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

안드로이드 앱 코드 블록을 보면 "Send" 버튼 클릭 시 먼저 표시 바이트인 "1"을 보내 텍스트 메시지 변경을 알립니다. 아두이노 측에서는 문자 배열 전체를 지우고 LED 매트릭스 디스플레이도 지웁니다. 그런 다음 while 루프로 시리얼 포트의 나머지 데이터(안드로이드 앱 텍스트 상자에 입력한 메시지)를 읽습니다.

표시 변수가 "2"이면 스크롤 속도 슬라이더 위치가 변경된 것이므로 Bluetooth.readString()으로 새 값을 읽어 스크롤 속도를 조절합니다. 밝기 조절도 같은 방식입니다.

안드로이드 앱 다운로드:

MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

AndrodApp for Arduino 8x8 LED Matrix Control

1 file(s) 1.48 MB Download MAX7219로 8×8 LED 매트릭스 마스터하기: 스크롤 텍스트 & 안드로이드 블루투스 제어

AndrodApp for Arduino 8×8 LED Matrix Control .aia 파일

1 file(s) 34.06 KB Download

이 튜토리얼은 여기까지입니다. 질문은 댓글란을 이용해 주세요.


제조공정

  1. 스마트 저금통 만들기: 아두이노 나노로 동전 인식기 제어하기
  2. 아두이노 나노와 MAX7219로 만드는 24x16 LED 퐁 게임 콘솔
  3. 아두이노 블루투스로 LED 제어하기 - HC-05 & MIT App Inventor 입문 가이드
  4. 윈도우 10 코타나와 블루투스로 아두이노 LED 제어하기 (UWP 앱)
  5. 아두이노 우노로 8×8 LED 매트릭스 마스터하기: 단계별 가이드
  6. 아두이노 우노와 블루투스로 RC카 원격 제어하기: 단계별 가이드
  7. 전용 안드로이드 앱으로 아두이노 로봇팔 제어하기
  8. 블루투스 8x8 LED 매트릭스 스크롤링 텍스트 - 아두이노 프로젝트
  9. 아두이노 메가와 MAX72XX LED 매트릭스로 만드는 클래식 아스테로이드 게임
  10. 블루투스로 다중 서보 모터 제어: Arduino & 안드로이드 앱