아두이노

🔌 아두이노 인터럽트 기반 LED 타이머 프로젝트

모빌리티키즈 2025. 5. 8. 15:44
728x90
반응형

아두이노의 인터럽트 기능을 활용하여 버튼 입력에 따라 LED를 순차적으로 점등하고 일정 시간이 지나면 초기화하는 타이머 시스템을 만들어 보겠습니다.

1️⃣ 프로젝트 개요

이 프로젝트에서는 스위치를 눌렀을 때 타이머가 시작되고,

  • 10초마다 하나씩 LED가 켜짐 (총 4개)
  • 40초가 지나면 모든 LED가 켜진 상태 유지
  • 50초 후 모든 LED OFF 및 시스템 초기화 이러한 방식으로 버튼을 눌러 타이머를 다시 시작할 수 있는 기능을 구현합니다.

2️⃣ 필요한 부품

  • 아두이노 보드 (Uno, Mega 등)
  • LED 4개
  • 저항 4개 (220Ω)
  • 푸시 버튼 (스위치)
  • 점퍼 와이어
  • 브레드보드

3️⃣ 회로도 및 연결

🖥 회로도 구성:

 
        [LED1]  --- (핀 8) --- [저항] --- (GND)
        [LED2]  --- (핀 9) --- [저항] --- (GND)
        [LED3]  --- (핀 10) --- [저항] --- (GND)
        [LED4]  --- (핀 11) --- [저항] --- (GND)
        [Button] --- (핀 2, 인터럽트 입력)

🔌 연결 방법:

  1. LED 연결
    • LED의 양극(+)을 아두이노 디지털 핀 8, 9, 10, 11번에 연결합니다.
    • LED의 음극(-)저항(220Ω)을 거쳐 GND(접지)에 연결합니다.
  2. 스위치 연결
    • 푸시 버튼의 한쪽을 디지털 핀 2에 연결합니다.
    • 다른 쪽을 GND(접지)에 연결하여 인터럽트 입력을 받을 수 있도록 합니다.

4️⃣ 소스 코드

📌 코드 설명:

  • 스위치가 눌리면 타이머 시작
  • 10초마다 하나씩 LED가 켜짐
  • 50초 후 모든 LED가 OFF & 초기화
cpp
int pinLED[4] = {8, 9, 10, 11};  // LED 핀 배열
volatile bool startTimer = false; // 인터럽트 발생 여부
unsigned long previousMillis = 0;
int ledIndex = 0; // 켜질 LED 인덱스

void setup() {
  Serial.begin(9600);
  
  for (int i = 0; i < 4; i++) {
    pinMode(pinLED[i], OUTPUT);
  }
  
  pinMode(2, INPUT_PULLUP);  // 인터럽트 버튼 연결 (내장 풀업)
  attachInterrupt(digitalPinToInterrupt(2), startSequence, FALLING); // 버튼 눌림 감지
}

void startSequence() {
  startTimer = true; // 타이머 시작
  previousMillis = millis(); // 현재 시간 저장
  ledIndex = 0; // LED 인덱스 초기화
}

void loop() {
  if (startTimer) {
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= 10000) { // 10초마다 실행
      previousMillis = currentMillis;

      if (ledIndex < 4) {
        digitalWrite(pinLED[ledIndex], HIGH);  // LED 하나씩 켜기
        ledIndex++;
      } else if (ledIndex == 4 && currentMillis - previousMillis >= 50000) { // 50초 후 초기화
        for (int i = 0; i < 4; i++) {
          digitalWrite(pinLED[i], LOW);  // 모든 LED 끄기
        }
        startTimer = false; // 타이머 종료
      }
    }
  }
}

5️⃣ 코드 설명

💡 인터럽트 설정 (attachInterrupt())

  • attachInterrupt(digitalPinToInterrupt(2), startSequence, FALLING);
    • 디지털 핀 2에서 버튼이 눌릴 때 (FALLING) 인터럽트 발생
    • 타이머가 시작되면서 LED 점등 순서 실행

타이머 (millis() 활용)

  • millis() 함수를 사용하여 일정 시간이 지나면 LED를 순차적으로 점등
  • 10초마다 LED 하나씩 켜짐 → 40초 동안 4개 모두 켜짐
  • 50초 후 모든 LED가 OFF되며 시스템이 초기화

🔄 인터럽트 기반 동작

  • 버튼을 눌러야 LED 점등이 시작됨
  • 시스템 초기화 후 다시 버튼을 눌러야 재작동

6️⃣ 실행 과정

🔹 타이머 시작 (버튼 눌림 감지)

 
[ 스위치 눌림 → 타이머 시작 ]

🔹 10초마다 하나씩 LED가 켜짐

 
10초 → LED1 ON  
20초 → LED2 ON  
30초 → LED3 ON  
40초 → LED4 ON  

🔹 50초 후 모든 LED가 OFF & 초기화

 
[ 50초 → 모든 LED OFF & 시스템 초기화 ]

🎯 마무리

이번 프로젝트에서는 아두이노의 인터럽트 기능을 활용한 LED 타이머 시스템을 구현해 보았습니다. 이 시스템을 확장하여 가변 저항을 추가해 점등 속도 조절, 모터 연동, 신호음 출력 같은 다양한 기능을 추가할 수도 있습니다!

📢 더 궁금한 점이 있다면 언제든지 알려주세요! 🚀😊

728x90
반응형