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

아두이노로 만드는 레트로 누미트론 클락: 심플하고 신뢰성 높으며 에너지 효율적

부품 및 소모품

Arduino Nano R3×1
Maxim Integrated DS3231M – ±5ppm, I²C 실시간 클락×1
TPIC6C595 시프트 레지스터 (고전류 드라이버)×4
IV9 누미트론 튜브 (4자리 디스플레이)×4
범용 LED (초 표시용)×2
커패시터 100nF (디커플링)×4
1N4007 – 고전압, 대전류 다이오드×2
슬라이드 스위치 (전원 / 디스플레이 밝기)×1
저항 1kΩ (전류 제한)×1

필요한 도구 및 장비

납땜 인두 (범용)
납땜 와이어, 무연

앱 및 온라인 서비스

Arduino IDE (통합 개발 환경)

프로젝트 소개

이 가이드는 아두이노 나노, DS3231 실시간 모듈, TPIC6C595 시프트 레지스터로 구동되는 스타일리시한 누미트론 튜브 클락 제작을 안내합니다. 결과물은 저발열, 고신뢰성 디스플레이로 시간, 날짜, 연도, 주변 온도를 30초마다 표시합니다.

원래 개념은 이 GitHub 저장소에서 나왔습니다. 첫 제작 시 여러 문제를 겪었습니다: 총 전류 소모가 74HC595 시프트 레지스터의 70mA 정격을 초과해 과열되었고, 프로그램이 블로킹 딜레이를 사용해 RTC를 분당 1회만 읽었습니다.

고전류 TPIC6C595 드라이버로 교체하고 펌웨어를 논블로킹 millis() 타이밍으로 리팩토링해, 이제 클락이 실시간으로 업데이트되고 누미트론 튜브가 차갑게 유지되며, 디스플레이를 희미하게 점등하는 절전 모드도 제공합니다.

주요 특징:

회로 조립과 코드 업로드 후 장식용 인클로저에 장착하면 어떤 워크샵이나 진열대에서도 대화의 화제가 될 것입니다.

코드

아두이노 코드

#include <RTClib.h> // DS3231용 온도 포함 RTC
RTC_DS3231 rtc; // DS3231 인스턴스화
#include <Wire.h> // I2C 배선
#include <TimeLib.h> // 시간 함수
#include <Time.h> // 시간 라이브러리
#include <DS1307RTC.h> // 추가 RTC 지원
#include <SPI.h>

#define led 7
const int latchPin = 13; // TPIC6C595 래치 핀
const int clockPin = 10; // 클락 핀
const int dataPin = 11;  // 데이터 핀

unsigned long previousMillis = 0;       // 마지막 디스플레이 업데이트
unsigned long previousMillisDiode = 0;  // 마지막 LED 토글
const long interval = 30000;            // 디스플레이 새로고침 간격 (30초)
const long intervalDiode = 500;         // LED 깜빡임 간격

// 숫자/기호 패턴 (TPIC6C595용)
const int nums[12] = {
  0b10111110, // 0
  0b00000110, // 1
  0b01111010, // 2
  0b01101110, // 3
  0b11000110, // 4
  0b11101100, // 5
  0b11111100, // 6
  0b00001110, // 7
  0b11111110, // 8
  0b11101110, // 9
  0b11001010, // °C 표시기
  0b10111000  // °C 소수점
};

// 파싱된 시간 및 온도 저장 변수
int hour1, hour2, minute1, minute2, day1, day2, month1, month2, year1, year2, year3, year4, temp1, temp2;
int hourDecimal, minuteDecimal, dayDecimal, monthDecimal, year70, tempDecimal;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
  SPI.begin();
  digitalWrite(clockPin, LOW); // 클락 로우로 시작
}

void loop() {
  tmElements_t tm; // DS1307RTC 라이브러리 구조체
  RTC.read(tm);    // 현재 시간 및 온도 읽기

  // 자릿수 파싱
  hourDecimal = tm.Hour / 10;
  hour1 = hourDecimal;
  hour2 = tm.Hour - 10 * hourDecimal;
  
  minuteDecimal = tm.Minute / 10;
  minute1 = minuteDecimal;
  minute2 = tm.Minute - 10 * minuteDecimal;
  
  dayDecimal = tm.Day / 10;
  day1 = dayDecimal;
  day2 = tm.Day - 10 * dayDecimal;
  
  monthDecimal = tm.Month / 10;
  month1 = monthDecimal;
  month2 = tm.Month - 10 * monthDecimal;
  
  year70 = tm.Year - 30;
  year1 = 2; year2 = 0;
  year3 = year70 / 10;
  year4 = year70 - 10 * year3;
  
  tempDecimal = rtc.getTemperature() / 10;
  temp1 = tempDecimal;
  temp2 = rtc.getTemperature() - 10 * tempDecimal;

  // 초 LED 토글
  if (millis() - previousMillisDiode >= intervalDiode) {
    previousMillisDiode = millis();
    digitalWrite(led, !digitalRead(led));
  }

  // 30초마다 디스플레이 새로고침 (날짜/연도/온도 순환 표시)
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();
    
    // 디스플레이 클리어 (숨쉬기 효과)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // 날짜 표시 (월/일)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[month2]);
    SPI.transfer(nums[month1]);
    SPI.transfer(nums[day2]);
    SPI.transfer(nums[day1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // 다시 클리어
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // 연도 표시 (YY)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[year4]);
    SPI.transfer(nums[year3]);
    SPI.transfer(nums[year2]);
    SPI.transfer(nums[year1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // 다시 클리어
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
    
    // 온도 표시 (°C)
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b10111000); // 소수점
    SPI.transfer(0b11001010); // °C 심볼
    SPI.transfer(nums[temp2]);
    SPI.transfer(nums[temp1]);
    digitalWrite(clockPin, HIGH);
    delay(1500);
    
    // 최종 클리어
    digitalWrite(clockPin, LOW);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    SPI.transfer(0b00000000);
    digitalWrite(clockPin, HIGH);
    delay(500);
  } else {
    // 일반 시간 표시 (HH:MM)
    digitalWrite(clockPin, LOW);
    SPI.transfer(nums[minute2]);
    SPI.transfer(nums[minute1]);
    SPI.transfer(nums[hour2]);
    SPI.transfer(nums[hour1]);
    digitalWrite(clockPin, HIGH);
  }
}

회로도

아두이노로 만드는 레트로 누미트론 클락: 심플하고 신뢰성 높으며 에너지 효율적

제조공정

  1. 아두이노 나노와 MPU-6050으로 실시간 자이로스코프 게임 만들기
  2. 아두이노 실시간 시계로 이슬람 기도 시간 알림 장치 만들기
  3. 아두이노로 만드는 대형 LED 마스터 시계 (알람 기능 포함, 12m 거리에서도 식별 가능)
  4. 아두이노 듀(Due) + 3.2″ TFT로 만드는 실시간 시계 & 온도 모니터
  5. 아두이노와 노키아 5110 LCD로 만드는 DIY 전압계 - 단계별 가이드
  6. MobBob: 아두이노 로봇 직접 만들기, 안드로이드 스마트폰으로 매끄럽게 제어
  7. 아두이노 나노와 로터리 인코더로 만드는 정밀 측정 바퀴
  8. 아두이노, Yaler, IFTTT로 웹 연동 IoT 게이지 만들기
  9. 아두이노 8×8 LED 매트릭스 플립 시계 – DIY 실시간 시계 프로젝트
  10. DS1302 RTC와 아두이노 우노로 만드는 신뢰할 수 있는 알람 시계