본문 바로가기
아두이노

8×32 MAX7219 도트 매트릭스 LED 디스플레이(아두이노 포함)

by 모빌리티키즈 2023. 4. 14.
728x90
반응형

MAX7219 LED 도트 매트릭스 디스플레이와 아두이노 인터페이싱

개요

이 가이드에서는 Arduino와 함께 8×32 MAX7219 도트 매트릭스 LED 디스플레이를 사용하는 방법을 배웁니다. MAX8 LED 드라이버가 내장된 32×7129 LED 매트릭스 모듈은 Arduino 보드 및 기타 마이크로컨트롤러와 호환된다. 8×32 LED 매트릭스에는 256개의 LED(발광 다이오드)가 있으며 매트릭스 형태로 8행과 32열로 배열되어 있습니다. 따라서 8×32 도트 매트릭스 LED로 명명됩니다.

Parola 및 MAX72xx 라이브러리를 사용하여 숫자, 알파벳, 스크롤 텍스트, 기호, 이모티콘 등과 같은 다양한 롤링 LED 패턴을 생성할 수 있습니다. 이 외에도 이 디스플레이에 DHT11/DHT22와 같은 일부 센서 데이터를 표시할 수도 있습니다. 이 게시물에서 몇 가지 예를 살펴 보겠습니다.


재료 명세서

이 모듈을 사용하려면 Amazon에서 다음 구성 요소를 구입할 수 있습니다.

구성 요소양구매 링크
1 아두이노 우노 보드 1 아마존 | 알리익스프레스
2 8x32 MAX7219 도트 매트릭스 LED 디스플레이 1 아마존 | 알리익스프레스
3 DHT22 센서 1 아마존 | 알리익스프레스
4 점퍼 와이어 1 아마존 | 알리익스프레스
5 전원 공급 장치 1 아마존 | 알리익스프레스

도트 매트릭스 LED 디스플레이

LED 매트릭스는 단색, 이중 색상, 다중 색상 또는 RGB LED 매트릭스와 같은 다양한 스타일로 제공됩니다. 또한 5 x 7, 8 x 8, 16 x 16, 8 x 32, 32 x 32 등과 같은 다양한 치수로 제공됩니다.

이 8×32 LED 매트릭스 디스플레이는 내부적으로 연결된 4개의 단일 모듈로 구성된 클러스터입니다. 모든 모듈이 동일한 Maxim MAX7219 칩을 탑재하고 동일한 전력 및 데이터 연결을 제공하기 때문에 이러한 모듈을 분리할 수도 있습니다.


핀 구성

8×8 LED 매트릭스에는 8 개의 양극 단자와 8 개의 음극 단자가 있습니다. 8 개의 음극 단자는 8 열이고 8 개의 양극 단자는 8 행입니다.

4개의 8X8 LED 매트릭스는 MAX7219 핀을 통해 서로 연결된다.

이 디스플레이는 많은 전류를 소비하므로 Arduino 보드의 5V 공급 장치 대신 외부 전원 공급 장치에서 모듈을 실행해야합니다. Arduino 보드의 5V 및 GND 핀에 연결된 3V, 5A 정격의 외부 전원 어댑터를 사용해야합니다.

MAX7219 모듈은 많은 데이터 전송이 필요하므로 마이크로컨트롤러의 하드웨어 SPI 핀에 연결해야 한다. UNO/Nano와 같은 Arduino 보드의 경우 이러한 핀은 디지털 13(SCK), 12(MISO), 11(MOSI) 및 10(SS)입니다.

8×32 LED 도트 매트릭스 디스플레이의 CLK, CS, DIN 핀을 아두이노 디지털 핀 13, 10, 11에 연결합니다.

이 가이드에서는 FC-16 MAX7219 모듈을 사용합니다. 여러 디스플레이를 데이지 체인 방식으로 연결하여 더 큰 디스플레이를 만들려면 첫 번째 디스플레이의 DOUT을 다음 디스플레이의 DIN에 연결합니다. VCC, GND, CLK 및 CS는 모두 디스플레이 간에 공유됩니다.

라이브러리 설치

MAX7219 모듈을 제어하는 것은 복잡한 작업이며 많은 코드 라인이 필요하다. 다행히 MD_Parola 라이브러리를 사용하여 이러한 복잡성을 제거하여 디스플레이를 제어하는 간단한 명령을 실행할 수 있습니다.

라이브러리를 설치하려면 스케치 > 라이브러리 포함 > 라이브러리 관리로 이동합니다. 검색에서 옵션은 'max72xx'를 찾아 설치를 클릭합니다.

이 MD_MAX72XX 라이브러리는 하위 수준 기능을 처리하는 하드웨어별 라이브러리입니다. 스크롤 및 스프라이트 텍스트 효과와 같은 다양한 텍스트 애니메이션을 만들기 위해 MD_Parola 라이브러리와 페어링해야 합니다. 이 라이브러리도 설치하십시오.


텍스트/숫자 표시 위한 소스 코드/프로그램

다음 코드를 복사하여 아두이노 IDE에 붙여넣습니다.

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW

이 줄에서 하드웨어 유형을 선택합니다. 우리의 경우 하드웨어 유형은 FC16_HW입니다.

myDisplay.displayScroll("How To Electronics", PA_CENTER, PA_SCROLL_LEFT, 200);

이 줄에 LED 디스플레이에 표시할 텍스트와 숫자를 입력합니다.

 

이제 코드를 아두이노 보드에 업로드할 수 있습니다.

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
 
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
 
#define MAX_DEVICES 4
#define CS_PIN 10
 
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
 
void setup() {
 
  myDisplay.begin();
  myDisplay.setIntensity(4);
  myDisplay.displayClear();
  myDisplay.displayScroll("How To Electronics", PA_CENTER, PA_SCROLL_LEFT, 200);
}
 
void loop() {
  if (myDisplay.displayAnimate()) {
    myDisplay.displayReset();
  }
}

출력 테스트

스크롤 텍스트 "How To Electronics"를 표시하고 싶습니다. 텍스트는 다음과 같이 스크롤됩니다.

이 외에도 이와 같은 텍스트 나 숫자를 표시 할 수 있습니다.

DHT22 습도 온도 센서 값 표시

이제 DHT22 온도 및 습도 센서를 Arduino와 인터페이스하고 8×32 도트 매트릭스 LED 디스플레이에 센서 값을 표시하겠습니다.

DHT22 센서 VCC, GND 및 출력 핀을 Arduino의 5V, GND 및 D7에 연결하십시오.

소스 코드/프로그램

이 코드에는 컴파일을 위해 Font7Seg.h라는 헤더 파일이 필요합니다. 이 파일을 다운로드하여 기본 스케치 폴더에 복사합니다.

이제이 코드를 Arduino 메인 스케치에 복사하여 Arduino에 업로드 할 수 있습니다.

/*
 * Use of MAX72XX, DS1307 and DTH22 components to 
 * print some information on the display.
 *
 * for more examples:
 * https://github.com/MajicDesigns/MD_Parola/tree/main/examples
 * https://github.com/MajicDesigns/MD_MAX72XX/tree/main/examples
 */
 
// Header file includes
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <DHT.h>
#include <SPI.h>
#include <Wire.h>
#include "Font7Seg.h"
 
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4  // Define the number of displays connected
#define CLK_PIN 13     // CLK or SCK
#define DATA_PIN 11    // DATA or MOSI
#define CS_PIN 10      // CS or SS
#define SPEED_TIME 75  // Speed of the transition
#define PAUSE_TIME 0
#define MAX_MESG 20
 
 
// These are for the temperature
#define DHTPIN 6
#define DHTTYPE DHT22
#define TIMEDHT 1000
 
 
 
char szTime[9];  // mm:ss\0
char szMesg[MAX_MESG + 1] = "";
 
float humidity, celsius, fahrenheit;
 
uint8_t degC[] = { 6, 3, 3, 56, 68, 68, 68 };  // Deg C
uint8_t degF[] = { 6, 3, 3, 124, 20, 20, 4 };  // Deg F
 
uint8_t clear = 0x00;
 
uint32_t timerDHT = TIMEDHT;
 
DHT dht(DHTPIN, DHTTYPE);
 
// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
 
 
 
uint8_t decToBcd(uint8_t value) {
  return ((value / 10 * 16) + (value % 10));
}
 
uint8_t bcdToDec(uint8_t value) {
  return ((value / 16 * 10) + (value % 16));
}
 
void getTemperature() {
  // Wait for a time between measurements
  if ((millis() - timerDHT) > TIMEDHT) {
    // Update the timer
    timerDHT = millis();
 
 
    humidity = dht.readHumidity();
    celsius = dht.readTemperature();
    fahrenheit = dht.readTemperature(true);
    if (isnan(humidity) || isnan(celsius) || isnan(fahrenheit)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
  }
}
 
void setup(void) {
  Wire.begin();
 
  P.begin(2);
  P.setInvert(false);
 
  P.setZone(0, MAX_DEVICES - 4, MAX_DEVICES - 1);
  P.setZone(1, MAX_DEVICES - 4, MAX_DEVICES - 1);
 
  
  P.displayZoneText(0, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
 
  P.addChar('$', degC);
  P.addChar('&', degF);
 
  dht.begin();
}
 
void loop(void) {
  static uint32_t lastTime = 0;  // Memory (ms)
  static uint8_t display = 0;    // Current display mode
  static bool flasher = false;   // Seconds passing flasher
 
 
  getTemperature();
 
  P.displayAnimate();
 
  if (P.getZoneStatus(0)) {
    switch (display) {
      case 0:  // Temperature deg Celsius
        P.setPause(0, 1000);
        P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_UP);
        display++;
        dtostrf(celsius, 3, 1, szMesg);
        strcat(szMesg, "$");
 
        break;
      case 1:  // Temperature deg Fahrenheit
        P.setTextEffect(0, PA_SCROLL_UP, PA_SCROLL_DOWN);
        display++;
        dtostrf(fahrenheit, 3, 1, szMesg);
        strcat(szMesg, "&");
 
        break;
      case 2:  // Humidity
        P.setTextEffect(0, PA_SCROLL_DOWN, PA_SCROLL_LEFT);
        display++;
        dtostrf(humidity, 3, 0, szMesg);
        strcat(szMesg, "%UR");
 
 
        break;
    }
 
    P.displayReset(0);  // Rest zone zero
  }
}

출력 테스트

Arduino와 함께 8×32 도트 매트릭스 LED 디스플레이는 온도 습도 데이터를 표시합니다.

이것이 Arduino 보드가 있는 8×32 MAX7219 도트 매트릭스 LED 디스플레이를 사용하여 스크롤 텍스트와 숫자를 표시하는 방법입니다.

 

728x90
반응형