이 번에 ESP32 Dev Board와 RGB LED Dot Matrix를 이용한 시계를 만들어 보자.

준비물은 인터넷 직구로 구매하며 30%~50% 저렴하게 구매 할 수 있다.

단점은 배송이 1~2주 정도 걸린다는 점이다.

나 같은 경우 점퍼선와 브래드보드 제외하고 3만원 정도 들었다.

RGB LED Dot Matrix(HUB75, HUB85E) 스캔주기 1/16 이하

모듈갯수(32x16) 8개 이하 ESP32로 제어 가능하다.

그 이상은 분산처리 또는 전용 제어보드를 사용헤야한다.

 

앞으로도 같은 부품으로 코드만 바꾸어서 테스트를 진행할 예정이다.

 

주) RGB LED Dot Matrix 전원은 별도로 공급해야한다.

※ 준비물은 아래와 같다.

ESP32 Dev Board

RGB LED Dot Matrix 64 x 32

점퍼케이블(F-F) x 16

※ 핀 연결


 

HUB75 ESP32
R1 GPIO 25
G1 GPIO 26
B1 GPIO 27
R2 GPIO 14
G2 GPIO 12
B2 GPIO 13
A GPIO 23
B GPIO 19
C GPIO 5
D GPIO 17
CLK GPIO 16
LAT GPIO 4
OE GPIO 15

 소스

#include <time.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>

/* ================= HUB75 CONFIG ================= */
#define PANEL_RES_X 64
#define PANEL_RES_Y 32
#define PANEL_CHAIN 1

HUB75_I2S_CFG mxconfig(
  PANEL_RES_X,
  PANEL_RES_Y,
  PANEL_CHAIN
);

MatrixPanel_I2S_DMA *dma_display;

/* ================= GLOBAL ================= */

bool clockMode = true;
bool colonVisible = true;
unsigned long lastTick = 0;

uint16_t DAY_TIME_COLOR;
uint16_t DAY_DATE_COLOR;
uint16_t DAY_DAY_COLOR;

uint16_t NIGHT_TIME_COLOR;
uint16_t NIGHT_DATE_COLOR;
uint16_t NIGHT_DAY_COLOR;
// Color
uint16_t COLOR_TIME;
uint16_t COLOR_DATE;
uint16_t COLOR_DAY;

void drawBigClock() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;

  char timeBuf[6];
  if (colonVisible)
    strftime(timeBuf, sizeof(timeBuf), "%H:%M", &timeinfo);
  else
    strftime(timeBuf, sizeof(timeBuf), "%H %M", &timeinfo);

  char dateBuf[16];
  strftime(dateBuf, sizeof(dateBuf), "%Y-%m-%d", &timeinfo);

  static const char* weekStr[] =
    {"SUN","MON","TUE","WED","THU","FRI","SAT"};

  dma_display->clearScreen();
  dma_display->setTextSize(2);
  dma_display->setTextColor(COLOR_TIME);
  dma_display->setCursor(2, 1);
  dma_display->print(timeBuf);

  dma_display->setTextSize(1);
  dma_display->setTextColor(COLOR_DATE);
  dma_display->setCursor(2, 16);
  dma_display->print(dateBuf);

  dma_display->setTextColor(COLOR_DAY);
  dma_display->setCursor(2, 25);
  dma_display->print(weekStr[timeinfo.tm_wday]);
}

/* ================= WIFI ================= */
void initWiFi() {

  WiFi.mode(WIFI_STA);
  
  WiFi.begin("SSID", "SSID_PASS");

    for (int i = 0; i < 20; i++) {
      if (WiFi.status() == WL_CONNECTED) break;
      delay(500);
    }

    if (WiFi.status() == WL_CONNECTED) {
      configTime(9 * 3600, 0, "pool.ntp.org", "time.nist.gov");
      staIPStr = WiFi.localIP().toString();
      ipShowStart = millis();
    }
  }
}

bool isDayTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return true;

  int h = timeinfo.tm_hour;
  return (h >= 7 && h < 19);
}

void updateThemeByTime() {
  if (isDayTime()) {
    COLOR_TIME = DAY_TIME_COLOR;
    COLOR_DATE = DAY_DATE_COLOR;
    COLOR_DAY  = DAY_DAY_COLOR;
  } else {
    COLOR_TIME = NIGHT_TIME_COLOR;
    COLOR_DATE = NIGHT_DATE_COLOR;
    COLOR_DAY  = NIGHT_DAY_COLOR;
  }
}
/* ================= SETUP ================= */
void setup() {
  Serial.begin(115200);

  //COLOR_TIME = dma_display->color565(255,255,255); // 시계
  //COLOR_DATE = dma_display->color565(0,200,255);   // 날짜
  //COLOR_DAY  = dma_display->color565(255,180,0);   // 요일
  /* DAY */
  DAY_TIME_COLOR   = dma_display->color565(255,255,255);
  DAY_DATE_COLOR   = dma_display->color565(0,200,255);
  DAY_DAY_COLOR    = dma_display->color565(255,180,0);

  /* NIGHT (눈부심 최소화) */
  NIGHT_TIME_COLOR = dma_display->color565(0,255,0);
  NIGHT_DATE_COLOR = dma_display->color565(0,140,1);
  NIGHT_DAY_COLOR  = dma_display->color565(1,180,0);

  COLOR_TIME = dma_display->color565(0,255,0);
  COLOR_DATE = dma_display->color565(0,120,0);
  COLOR_DAY  = dma_display->color565(0,180,0);
  COLOR_IP   = dma_display->color565(0,255,0);     // IP

  dma_display = new MatrixPanel_I2S_DMA(mxconfig);
  dma_display->begin();
  dma_display->setBrightness8(128);

  initWiFi();
}

/* ================= LOOP ================= */
void loop() {
  if (millis() - lastTick >= 1000) {
    lastTick = millis();
    colonVisible = !colonVisible;
    updateThemeByTime();
    drawBigClock();
  }
}

 실행화면

728x90

+ Recent posts