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

아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기

부품 목록

부품수량비고
아두이노 메가 25601
브레드보드 (일반)1
점퍼 와이어 (일반)11사용량은 방식에 따라 다름
LED (일반)3색상 무관, 3가지 색상 권장
스파크펀 푸시버튼 스위치 12mm1
저항 330옴4

앱 및 온라인 서비스

프로젝트 소개

이 프로젝트는 아두이노를 사용해 LED를 페이딩(점진적 밝기 변화)시키는 방법을 3단계로 보여줍니다.

1. LED 페이딩 (기본)

회로도

아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기

LED 3개를 핀 3, 6, 9에 연결합니다. 다른 PWM 핀을 써도 되지만 코드도 함께 수정해야 합니다.

코드

먼저 핀 번호를 상수로 정의합니다.

int ledRed = 9;
int ledYellow = 6;
int ledGreen = 3;

setup()에서 핀 모드를 OUTPUT으로 설정합니다.

void setup() {
  pinMode(ledRed, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  pinMode(ledGreen, OUTPUT);
}

loop()에서 analogWrite()와 delay()로 페이딩을 구현합니다. 변수 i를 0~255로 증가/감소시키며 PWM 듀티비를 조절합니다.

void loop() {
  // 빨간색 LED만 페이딩 예시
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledRed, i);
    delay(30);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledRed, i);
    delay(30);
  }
}

delay() 값을 일일이 바꾸기 번거로우면 상수로 빼서 관리하세요.

const int fade = 30;  // 기본 딜레이 시간(ms)

모든 delay(30)을 delay(fade)로 치환하면 나중에 한 곳에서만 수정하면 됩니다.

세 개 LED 순차 페이딩 전체 코드

int ledRed = 9;
int ledYellow = 6;
int ledGreen = 3;
const int fade = 10;

void setup() {
  pinMode(ledRed, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  pinMode(ledGreen, OUTPUT);
}

void loop() {
  // 빨강
  for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
  // 노랑
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  // 초록
  for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
  // 노랑 (다시)
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}

2. 푸시 버튼으로 LED 페이딩

회로도

아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기

기존 회로에 푸시 버튼을 추가합니다. 버튼은 핀 7에 연결하고 풀다운 저항(내부 풀업 사용 시 로직 반전 필요)을 고려해 INPUT 모드로 설정합니다.

코드 변경 사항

버튼 핀 정의 및 초기 상태 설정:

int button = 7;

void setup() {
  pinMode(ledRed, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(ledRed, LOW);
  digitalWrite(ledYellow, LOW);
  digitalWrite(ledGreen, HIGH);  // 시작 시 초록 켬
}

loop()에서는 버튼이 눌렸을 때(HIGH) 소프트웨어 디바운스(15ms) 후 fadeLights() 함수를 호출합니다. 버튼이 안 눌리면 기본 상태(초록만 켬)로 돌아갑니다.

void loop() {
  if (digitalRead(button) == HIGH) {
    delay(15);  // 디바운스
    if (digitalRead(button) == HIGH) {
      fadeLights();
    }
  } else {
    digitalWrite(ledRed, LOW);
    digitalWrite(ledYellow, LOW);
    digitalWrite(ledGreen, HIGH);
  }
}

fadeLights() 함수에는 기존 loop의 페이딩 시퀀스를 그대로 옮깁니다. 시작 상태가 초록이므로 초록부터 페이드 아웃으로 시작합니다.

void fadeLights() {
  for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}

작동 확인: 버튼 누르면 시퀀스 실행, 떼면 바로 기본 상태로 복귀해야 합니다. 시퀀스가 맞지 않으면 코드/배선 확인.

3. 버튼으로 페이딩 (딜레이 개선)

앞선 버전은 버튼을 떼어도 delay() 때문에 시퀀스가 끝까지 돌았습니다. 이번에는 페이딩 중에도 버튼 상태를 폴링하여 떼는 즉시 중단되게 개선합니다.

회로도

아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기

코드 변경

const int fade = 10; 상수는 더 이상 필요 없으므로 삭제합니다. setup()은 동일.

loop()에 else 블록을 추가해 버튼 떼면 즉시 기본 상태로:

void loop() {
  if (digitalRead(button) == HIGH) {
    delay(15);
    if (digitalRead(button) == HIGH) {
      fadeLights();
    }
  } else {
    digitalWrite(ledRed, LOW);
    digitalWrite(ledYellow, LOW);
    digitalWrite(ledGreen, HIGH);
  }
}

fadeLights() 내부 각 for 루프마다 버튼 체크 루프를 삽입합니다. delay() 대신 빈 루프(for y)를 돌며 버튼을 읽고, LOW면 return으로 함수 즉시 종료.

void fadeLights() {
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledGreen, i);
    for (int y = 0; y < 1000; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledYellow, i);
    for (int y = 0; y < 400; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledYellow, i);
    for (int y = 0; y < 400; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledRed, i);
    for (int y = 0; y < 1000; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledRed, i);
    for (int y = 0; y < 1000; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledYellow, i);
    for (int y = 0; y < 400; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledYellow, i);
    for (int y = 0; y < 400; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledGreen, i);
    for (int y = 0; y < 1000; y++) {
      if (digitalRead(button) == LOW) return;
    }
  }
}

각 내부 루프 횟수(1000, 400)는 대략적인 타이밍 조절용입니다. 루프당 약 10µs 소요되어 원하는 페이딩 속도를 냅니다. 버튼을 떼면 즉시 return으로 빠져나가 기본 LED 상태로 돌아갑니다.

전체 코드 모음

1. 기본 페이딩

int ledRed = 9; int ledYellow = 6; int ledGreen = 3; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); }
void loop() {
  for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}

2. 버튼으로 페이딩

int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
  pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
  if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
  else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
  for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
  for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}

3. 버튼으로 페이딩 (딜레이 개선)

int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
  pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
  if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
  else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
  for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; } }
  for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; } }
}

회로도

아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기 아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기

제조공정

  1. 아두이노 나노와 MPU-6050으로 실시간 자이로스코프 게임 만들기
  2. 파이썬 연동 아두이노 RFID 출석 관리 시스템 구축하기
  3. DHT11 온습도 센서 + LED 표시등 + 피에조 부저 프로젝트
  4. 아두이노로 초음파 부양 장치 만들기: 단계별 가이드
  5. Unopad: 아두이노 우노로 만드는 에이블턴 라이브용 MIDI 컨트롤러
  6. 아두이노 자동 식물 급수 시스템 – 떠날 때도 안심하는 스마트 가드닝
  7. 아두이노로 간단한 장애물 센서 만들기 - IR LED & 포토다이오드 튜토리얼
  8. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  9. 아두이노로 지구 질량 측정하기: 단계별 DIY 가이드
  10. 아두이노 우노로 25kHz 4핀 PWM 팬 제어하기 - 제작, 코드 및 테스트