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을 입력해야 합니다. T 이런식으로 앞에 대문자 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 |