본문 바로가기

Arduino

32×8 Matrix LED 시계

7 digit display보다 좀 더 정교한 32×8 LED Matrix 를 사용해서 시계를 만들어 봅니다. 디스플레이용 라이브러리는 MD_Parola를 이용합니다.

https://majicdesigns.github.io/MD_Parola/

https://github.com/MajicDesigns/MD_Parola

RTC를 처음 사용하는거면 Unix epoch time을 입력해야 합니다.  T1537178899   이런식으로 앞에 대문자 T가 들어가 있는 상태로 시리얼포트에 입력하면 RTC시간이 조정됩니다.

https://www.epochconverter.com/

RTC는 배터리를 빼기 전까지는 시간을 기억하니깐 처음 사용할 때만 시간 셋팅이 필요합니다.

시간과 날짜가 교대로 나옵니다. WAIT_TIME을 고치면 나오는 시간 조정이 됩니다.포텐셔미터로 LED 밝기 조정을 합니다. 수치는 0-15입니다.

Parola에 다양한 애니메이션 효과 있기 때문에 좀 더 화려한 효과를 원하시면 그 효과를 적용시키면 됩니다. 보통 스크롤 기능을 많이 사용합니다.

여기에 온도, 요일 표시까지 되는 업그레이드 버전을 추가로 만들어서 다시 올려야 겠네요. 그리고 on/off 스위치도 만들어서 밤에는 꺼지게 할수 있게 하는게 좋을듯 하네요.

32×8 모듈 그림이 없어서 8×8 모듈 하나로 된거 올립니다.

이것도 나중에 PCB로 제작해서 실생활에서 사용가능한 버전 만들어 보겠습니다.

#include 
#include 
#include 
#include 
 
// RTC
#define CLK 2
#define DIO 3
 
#define GMT 9
 
//32x8LED matrix
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10
 
// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
 
const uint16_t WAIT_TIME = 2000;
unsigned long lastTime = 0;
int displayState;
String pTime, pDate;
 
void setup()
{
  P.begin();
  P.setIntensity(0);
  P.setTextAlignment(PA_CENTER);
    
  Serial.begin(9600);
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");
}
 
void loop()
{
  int sensorValue = analogRead(A2);
  sensorValue = map(sensorValue, 0, 1023, 0, 15);
  P.setIntensity(sensorValue);
 
  if ((millis() - lastTime) > WAIT_TIME) {
    pTime=String(hour())+":"+printDigits(minute());
    pDate=String(month())+"-"+String(day());
    displayState = !displayState;
    lastTime = millis();
  }
 
  displayState == 0 ? P.print(pTime) : P.print(pDate);
  delay(100);
  
  if (Serial.available()) {
    time_t t = processSyncMessage();
    if (t != 0) {
      RTC.set(t);   // set the RTC and the system time to the received value
      setTime(t);
      Serial.println(t);
    }
  }
}
 
 
String printDigits(int digits)
{
 return digits < 10 ? "0"+ String(digits) : String(digits);  
}
 
/*  code to process time sync messages from the serial port   */
#define TIME_HEADER  "T"   // Header tag for serial time sync message
 
unsigned long processSyncMessage() {
  unsigned long pctime = 0L;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013
 
  if (Serial.find(TIME_HEADER)) {
    pctime = Serial.parseInt();
    return pctime + GMT * 3600;
    if ( pctime < DEFAULT_TIME) { // check the value is a valid time (greater than Jan 1 2013)
      pctime = 0L; // return 0 to indicate that the time is not valid
    }
  }
  return pctime;
}

'Arduino' 카테고리의 다른 글

74HC595 쉬프트 레지스터 사용하기  (0) 2019.01.08
IR Remote Test  (0) 2019.01.08
VS1053 MP3 Shield  (0) 2019.01.07
아두이노 RTC 시계 PCB 제작 후기  (0) 2019.01.07
미세먼지 측정기 Nova PM sensor SDS011  (0) 2019.01.07