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

TM1637 4자리 디지털 시계: 시간/알람 설정 기능 탑재 (아두이노 나노)

부품 및 소모품

아두이노 나노 R3 1개
TM1637 4자리 7세그먼트 디스플레이 1개
DS1302 RTC 모듈 1개
LED (파란색, 릴리패드 타입 5개) 1세트
부저 1개

프로젝트 소개

RTC 모듈로 현재 시각을 유지하고, 3개의 버튼으로 시간 설정과 알람 설정이 가능한 디지털 시계 프로토타입입니다. 향후 시계 프로젝트의 베이스 코드로 활용하기 위해 공개합니다. 개선 아이디어 환영합니다.

기능

핀 배정

코드

// Mario's Ideas - TM1637 Digital Clock with Setup and Alarm
#include 
#include 
#include 

virtuabotixRTC myRTC(A1, A2, A3); // CLK, DAT, RST
TM1637Display clock(4, 5); // CLK, DIO

int minutes, hours;
int Alarm_minutes = 5, Alarm_hours = 18;
uint8_t Blank[] = {0x0};
int POSITION = 0;
int digits[4];
int interval = 0;

#define AlarmBtn 9
#define Buzzer 13
#define Led 8

boolean Alarm_set = false;
boolean Alarm_in_progress = false;
boolean Setup_on = false;

void setup() {
  attachInterrupt(digitalPinToInterrupt(2), Press_A_Button, RISING);
  attachInterrupt(digitalPinToInterrupt(3), Press_B_Button, RISING);
  pinMode(AlarmBtn, INPUT);
  pinMode(Buzzer, OUTPUT);
  pinMode(Led, OUTPUT);
  digitalWrite(Buzzer, LOW);
  clock.setBrightness(0x0f);
  Serial.begin(9600);
}

void Press_A_Button() {
  if (interval > 3) {
    if (!Setup_on) {
      Setup_on = true;
      if (Alarm_set) {
        digits[0] = Alarm_hours / 10;
        digits[1] = Alarm_hours % 10;
        digits[2] = Alarm_minutes / 10;
        digits[3] = Alarm_minutes % 10;
      } else {
        digits[0] = myRTC.hours / 10;
        digits[1] = myRTC.hours % 10;
        digits[2] = myRTC.minutes / 10;
        digits[3] = myRTC.minutes % 10;
      }
    } else {
      POSITION++;
      if (POSITION == 4) {
        if (Alarm_set) {
          Alarm_minutes = digits[3] + digits[2] * 10;
          Alarm_hours = digits[1] + digits[0] * 10;
        } else {
          myRTC.setDS1302Time(0, digits[3] + digits[2] * 10, digits[1] + digits[0] * 10,
                              myRTC.dayofweek, myRTC.dayofmonth, myRTC.month, myRTC.year);
        }
        POSITION = 0;
        Setup_on = false;
      }
    }
    interval = 0;
  }
}

void Press_B_Button() {
  if (interval > 3 && Setup_on) {
    digits[POSITION]++;
    if (POSITION == 0 && digits[POSITION] == 3) digits[POSITION] = 0;
    if (POSITION != 0 && digits[POSITION] == 10) digits[POSITION] = 0;
    interval = 0;
  }
}

void loop() {
  // 알람 토글 버튼 처리 (디바운싱 포함)
  if (digitalRead(AlarmBtn) == HIGH && !Alarm_set) {
    if (interval > 30) { digitalWrite(Led, HIGH); Alarm_set = true; delay(300); }
  } else if (digitalRead(AlarmBtn) == HIGH && Alarm_set) {
    if (interval > 30) { Alarm_set = false; Alarm_in_progress = false; digitalWrite(Led, LOW); delay(300); }
  }

  myRTC.updateTime();

  if (Setup_on) {
    // 설정 모드: 4자리 표시 후 커서 위치 깜빡임
    for (int i = 0; i < 4; i++) clock.showNumberDec(digits[i], false, 1, i);
    delay(200);
    clock.setSegments(Blank, 1, POSITION);
    delay(200);
  } else {
    // 일반 모드: 알람 확인 및 시간 표시
    if (myRTC.minutes == Alarm_minutes && myRTC.hours == Alarm_hours && Alarm_set && !Setup_on) {
      Alarm_in_progress = true;
    }
    if (Alarm_in_progress) {
      digitalWrite(Buzzer, HIGH); delay(1000);
      digitalWrite(Buzzer, LOW); delay(1000);
    }
    if (myRTC.minutes != minutes) {
      int dispVal = (myRTC.hours / 10) * 1000 + (myRTC.hours % 10) * 100 +
                    (myRTC.minutes / 10) * 10 + (myRTC.minutes % 10);
      clock.showNumberDecEx(dispVal, 0x80 >> 1, true); // 콜론 깜빡임
      minutes = myRTC.minutes;
      hours = myRTC.hours;
    }
  }
  if (interval < 200) interval++;
}

회로도

프로젝트 페이지의 회로도 이미지 참고 (아두이노 나노, TM1637, DS1302, 버튼, 부저, LED 연결).

제조공정

  1. 아날로그 vs 디지털 센서: 유형, 응용 및 실용 예시
  2. Adafruit T-코블러 플러스로 헤드리스 라즈베리 파이 2 물 감지 알람 만들기
  3. 라즈베리 파이와 파이썬으로 로봇 만들기: 완전 가이드
  4. Fiix와 IDC가 보여주는 디지털 트랜스포메이션의 제조 신뢰성 강화 효과
  5. 음향 방출 모니터링으로 대형 다운타임 예방: 식품 제조사의 시간과 비용 절감 사례
  6. 디지털 유지보수 소프트웨어로 비용 절감과 수익 증대: 8가지 검증된 방법
  7. MAX6675 IC로 아두이노 포텐타 H7에 열전대 센서 연동하기
  8. 디지털 트랜스포메이션 가속화: 시스코 & IBM의 엣지-투-클라우드 IoT 플랫폼
  9. DS1302 RTC와 아두이노 우노로 만드는 신뢰할 수 있는 알람 시계
  10. 현대 기계에서 베어링의 기능과 혁신 이해하기