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

아두이노 우노로 베를린 시계 만들기 – DIY LED 매트릭스 시계

부품 및 소모품

부품 수량 비고
아두이노 우노 1
Maxim Integrated MAX7219 1 LED 매트릭스 브레이크아웃에 사용되는 IC 단품
RTC (실시간 시계) 모듈 1
5mm 황색 LED 13
5mm 적색 LED 11
저항 10k옴 1

프로젝트 소개

우선…

이 프로젝트는 Instructables 웹사이트에 작성한 튜토리얼을 복사/붙여넣기한 것입니다. 아직 한 사이트에서 다른 사이트로 어떻게 이전하는지 파악 중이라, 매끄럽지 않을 수 있습니다. 하지만 '평범하지 않은 시계' 만들기를 시작해 봅시다.

소개: 베를린 시계

베를린 시계(BerlinUhr 또는 Mengenlehreuhr)는 세계 최초의 디지털 시계일 것입니다.

1975년부터 베를린에 설치되어 있습니다.

자세한 정보: 위키피디아 – Mengenlehreuhr

어떻게 생겼고, 시간을 어떻게 읽을까요?

간단히 말해, 4행의 램프로 구성됩니다. 최상단 행은 5시간 단위, 그 다음 행은 1~4시간(단일 시간)을 표시합니다. 세 번째 행은 5분 단위, 최하단 행은 1분 단위를 표시합니다.

사진(실제로는 램프 하나가 고장 난 상태)에서 시간은: 2×5시간 + 3시간 + 6×5분 + 2분 = 13:32입니다. 유럽인들은 24시간제에 익숙하니 이 시계도 24시간제를 따릅니다.

맨 위 가장 큰 램프는 초마다 깜빡입니다.

이 시계를 아두이노로 만들어보면 재미있을 것 같았습니다.

1단계: 전자 회로 구성

이 프로젝트에 필요한 것들:

MAX7219는 8자리 7세그먼트 디스플레이 드라이버입니다. LED 매트릭스에도 널리 쓰이는 칩으로 잘 알려져 있습니다.

편의를 위해 'LedControl' 아두이노 라이브러리를 사용했습니다. 아직 없다면 여기서 다운로드하세요.

2단계: 회로 연결

MAX7219 데이터시트는 여기에서 볼 수 있습니다. 데이터시트를 자세히 다루진 않겠지만, 꽤 흥미로운 칩이니 참고하세요.

아두이노 연결로 넘어가겠습니다.

회로도에서 볼 수 있듯 매우 단순한 구성입니다. RTC(DS1307 브레이크아웃)와 통신용으로 SDA, SCL 사용. MAX7219용으로 4개 출력 추가: DataIn, Clock, ChipSelect, 그리고 초 표시 LED용 OUT 13.

아두이노 우노로 베를린 시계 만들기 – DIY LED 매트릭스 시계

주요 작업은 아두이노에서 수행됩니다: RTC에서 시간을 읽고, 베를린 시계 형식으로 변환한 뒤, 데이터를 7219로 전송합니다.

코드를 보면 네덜란드어(제 모국어)를 변수명으로 사용했습니다. 예: 'vijfuren'은 '5시간'을 세는 변수, 'vijfminuten'과 'vijfminuten1'은 '5분' 출력을 위한 변수입니다.

스케치에서 연도, 월, 일, 요일도 읽지만, 이 스케치에서는 사용하지 않습니다. 나중에 달력 기능을 추가할 수 있습니다.

프리칭(Fritzing) 레이아웃에서는 IC 배선을 생략했습니다. 출력이 많아서 복잡해지기 때문입니다.

핀 배열 정리:

아두이노 우노로 베를린 시계 만들기 – DIY LED 매트릭스 시계

7219의 입력 핀은 여기까지입니다.

출력 핀들을 보면:

7219는 8개의 7세그 디스플레이를 구동할 수 있습니다.

이 출력들 중 DIG 0~4를 LED '행' 구동용으로 사용합니다. '5분' 행에 LED 11개가 있으므로 DIG 1과 DIG 2로 분담 구동.

나머지 출력: 일반 7세그 디스플레이의 세그먼트 A~G와 DP.

이 경우(LedControl 라이브러리) 이진 워드(바이트 형태, 예: B01010100)를 전송합니다.

여기서 실수를 하나 했습니다. 논리적으로 SEG A가 MSB(최상위 비트), B가 그다음, … DP가 LSB(최하위 비트)일 거라 생각했습니다. 틀렸습니다. 어떤 이유에서인지 IC 설계자는 DP를 MSB로 만들었습니다. 그 논리는 이해하기 어렵네요…

이미 LED를 납땜한 상태라 코드를 수정해야 했습니다.

3단계: LED 배선

아래 회로도에서 LED들이 어떻게 연결되는지 볼 수 있습니다. 처음 3개만 그렸고, 나머지도 동일합니다.

아두이노 우노로 베를린 시계 만들기 – DIY LED 매트릭스 시계

초 표시 LED는 핀 13에 직결.

아래 사진은 '작동 모습'입니다. 17:47을 표시 중.

아두이노 우노로 베를린 시계 만들기 – DIY LED 매트릭스 시계

최하단 행은 브레드보드에 있어 잘 안 보이지만, 실제로 잘 작동합니다 (진짜로요!).

마지막 단계가 남았습니다…

4단계: 마지막 단계 – 코드

#include 
#include 
const int DS1307 = 0x68;  // A5 = SCL, A4 = SDA
const char* days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 0;
byte lastMinute = 0;
byte lastSecond = 0;
int Led = 13;
byte nul = B0000000;
byte een = B01000000;
byte twee = B01100000;
byte drie = B01110000;
byte vier = B01111000;
byte vijf = B01111100;
byte zes = B01111110;
byte zeven = B01111111;
byte acht = B11111111;
byte negen = B01000000;
byte tien = B01100000;
byte elf = B01110000;
int a = 0;
int b = 0;
int c = 0;
int vijfMinTwee = 0;
int uitgang = LOW;
/* 핀 12 = DataIn
   핀 11 = CLK
   핀 10 = LOAD */
LedControl lc = LedControl(12, 11, 10, 1);
unsigned long delaytime = 100;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode(Led, OUTPUT);
  lc.shutdown(0, false);
  /* 밝기를 중간 값으로 설정 */
  lc.setIntensity(0, 8);
  /* 디스플레이 클리어 */
  lc.clearDisplay(0);
}

void loop() {
  readTime();
  digitalWrite(Led, uitgang);
  if (second != lastSecond) {
    if (uitgang == LOW) uitgang = HIGH;
    else uitgang = LOW;
    digitalWrite(Led, uitgang);
    lastSecond = second;
  }
  if (minute != lastMinute) {
    printTime();
    lastMinute = minute;
  }
}

byte bcdToDec(byte val) {
  return ((val / 16 * 10) + (val % 16));
}

void printTime() {
  char buffer[3];
  long minuten = minute;
  long uren = hour;
  int vijfmin = minuten / 5;
  int eenminuut = minuten - (vijfmin * 5);
  int vijfuren = uren / 5;
  int eenuren = uren - (vijfuren * 5);
  a = vijfmin;
  digitaal();
  vijfmin = b;
  vijfMinTwee = c;
  a = eenminuut;
  digitaal();
  eenminuut = b;
  a = vijfuren;
  digitaal();
  vijfuren = b;
  a = eenuren;
  digitaal();
  eenuren = b;
  lc.setRow(0, 4, vijfuren);
  lc.setRow(0, 3, eenuren);
  lc.setRow(0, 1, vijfmin);
  lc.setRow(0, 2, vijfMinTwee);
  lc.setRow(0, 0, eenminuut);
}

void readTime() {
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7);
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read());
  weekday = bcdToDec(Wire.read());
  monthday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}

void digitaal() {
  switch (a) {
    case 0: b = nul; c = nul; break;
    case 1: b = een; c = nul; break;
    case 2: b = twee; c = nul; break;
    case 3: b = drie; c = nul; break;
    case 4: b = vier; c = nul; break;
    case 5: b = vijf; c = nul; break;
    case 6: b = zes; c = nul; break;
    case 7: b = zeven; c = nul; break;
    case 8: b = acht; c = nul; break;
    case 9: b = acht; c = negen; break;
    case 10: b = acht; c = tien; break;
    case 11: b = acht; c = elf; break;
  }
}

꽤 직관적이라고 생각합니다.

이 스케치의 또 다른 장점: 네덜란드어로 0부터 11까지 세는 법을 배울 수 있습니다… ;-)

즐거운 제작 되세요!

Marc

소스 코드

GitHub

https://github.com/wayoda/LedControl

제조공정

  1. RC 및 RL 회로 시상수 계산 마스터하기
  2. 쿠쿠 시계: 역사, 장인 정신, 현대적 진화
  3. 모래시계: 역사, 장인정신, 현대적 매력
  4. 시간 측정의 진화: 해시계부터 정밀 쿼츠 시계까지
  5. Python time.sleep() 완전 정복: 모범 사례, 멀티스레딩, 실전 예제
  6. 알피봇(Rpibot): 임베디드 시스템 학습용 저비용 확장형 모바일 로봇
  7. 아두이노 POV 클락: 퍼시스턴스 오브 비전 LED 디스플레이 제작
  8. Verilog 클럭 생성기: 설계 및 구현 가이드
  9. 파이썬 날짜와 시간 마스터하기: 실전 가이드
  10. 인피니티 미러 시계: 끝없는 우아함과 정확한 시간의 만남