아두이노 for 문을 이용한 LED 제어하기 , 풀다운 스위치로 LED 제어하기(교재 예시 그림 오류 있음, 수정)
예제 출처: 한번에 이해되는 아두이노
LED 3개를 하나씩 시간차를 두고 깜박이게 하기 ( 켜짐과 꺼짐, 딜레이에 반복문을 주어 코드 응용하였습니다. )
아두이노에서 나오는 전압은 5V, LED가 버틸 수 있는 전압은 보통 2V 정도로 저항을 쓰는 이유는
LED 의 고장을 막기 위함입니다.
여기선 220Ω을 사용하였습니다.
이유 : 220Ω 저항을 넣으면 전류가 약 13~15mA 정도로 적당히 흐르게 돼서 LED가 안전
💡 옴의 법칙(Ohm’s Law)
전류(I) = 전압(V) ÷ 저항(R)
옴에 법칩에서 전압은 저항이 받을 전압을 넣으면 됩니다. 아두이노 5V - LED 2V = 3V 로 저항이 받을 전압은 3V 가 되는거죠.
그래서 3 / 220 을 해서 전류를 구할 수 있습니다.
아두이노가 출력 할 수 있는 최대 전류는 40mA 이니까 13.6mA 는 비교적 안전선입니다.
int myLed[] = {2,4,6};
int myDelay[] = {500, 1000, 1500};
void setup() {
for (int i = 0; i < 3; i++){
pinMode(myLed[i],OUTPUT);
}
}
void loop() {
for (int i = 0; i < 3; i++){
digitalWrite(myLed[i], HIGH);
delay(myDelay[i]);
digitalWrite(myLed[i],LOW);
delay(myDelay[i]);
}
}
다음은 풀업, 풀다운 개념으로 스위치를 눌렀을 때 불이 켜지는 회로를 만들어 보겠습니다.
스위치를 눌렀을 때 불이 켜지게 하려면 풀다운 스케치를 작성하여야 합니다.
(풀다운, 풀업 개념이 궁금하시면 댓글 달아주세요. 따로 포스팅 해볼게요.)
교재에선 하늘색 회로 그림이 빠져 있으나 사진처럼 GND 에 연결 해주셔야 합니다.
여기서 왜 버튼에는 10kΩ을 사용하고 LED 에는 220Ω 을 사용했나면
LED의 220Ω 저항 → 전류 제한용
LED는 너무 큰 전류가 흐르면 타버릴 수 있습니다.
위에서 설명 했듯이 아두이노는 5V 전압을 공급합니다.
LED는 보통 2V 정도만 필요합니다.
남은 전압(약 3V)이 저항(220Ω)에 걸려서 전류를 적절히 조절하게 됩니다.
결과적으로 LED가 안전하게 빛날 수 있는 것 입니다.
즉, 220Ω 저항은 LED를 보호하기 위한 목적.
버튼의 10kΩ 저항 → 풀다운(혹은 풀업) 저항
버튼은 전류를 제한하는 게 아니라, 신호를 안정화하는 역할을 합니다.
아두이노는 입력 핀의 상태가 LOW인지 HIGH인지 감지해야 합니다.
하지만, 버튼을 안 누를 때(회로가 열려 있을 때)는 입력 핀의 상태가 애매하게 떠버릴 수 있습니다.
이걸 플로팅 상태(floating state)라고 합니다.
그래서 버튼이 눌리지 않았을 때 확실하게 LOW(0V)가 되도록
10kΩ 저항을 GND(0V)에 연결하는 이유입니다. (풀다운 저항)
다시 말해 10kΩ 저항은 필요 없는 전류를 빼주면서 신호를 확실하게 만들어 주는 역할.
풀다운 저항(10kΩ)의 역할
버튼을 안 눌렀을 때:
전류가 10kΩ 저항을 통해 GND로 연결됨 → 4번 핀은 LOW (0V)
버튼을 눌렀을 때:
버튼을 누르면 5V가 직접 연결됨 → 4번 핀은 HIGH (5V)
즉, 10kΩ 저항이 없으면 버튼을 안 눌렀을 때 핀 상태가 불안정해져서 오작동할 수 있습니다.
✔️정리
220Ω | 전류 제한 | LED 보호 |
10kΩ | 신호 안정화 | 버튼(풀다운/풀업 저항) |
LED는 적절한 전류가 흐르게 조절하는 게 목적입니다.
버튼은 안정적인 신호 입력을 보장하는 게 목적입니다.
int buttonPin = 4; // 푸시버튼이 연결된 번호
int ledPin = 13; // LED가 사용하는 핀 번호
int buttonState = 0; // 입력 핀의 상태를 저장
void setup() {
pinMode(ledPin, OUTPUT); // LED는 출력으로 설정
pinMode(buttonPin, INPUT); // 푸시 버튼으로 입력 설정
}
void loop(){ // 입력 값을 읽고 저장
buttonState = digitalRead(buttonPin);
// 버튼이 눌렸는지 확인, 버튼이 눌렸으면 입력 핀의 상태는 HIGH가 됨
if(buttonState == HIGH) {
digitalWrite(ledPin, HIGH); // LED 켬
}
else {
digitalWrite(ledPin, LOW); // LED 끔
}
}
처음에 교재 예시대로 했다가 LED 가 마냥 계속 켜져있길래
코드를 잘못 쓴 줄 알았는데 전선 하나가 연결이 안되어 있었습니다.
교재 사진에도 빠져있더라구요.
출발점과 도착지가 있어야 하는데 GND( 그라운드 ) 바로 도착지 역할을 합니다.
출발점 : 아두이노의 디지털 핀 (예: 2,4,6,13 등)
도착점: GND(그라운드, 접지)
버튼을 눌렀을 때:
버튼을 떼었을 때:
아래 코드는 시리얼 모니터에 버튼이 눌리지 않을 때 0 출력, 버튼이 눌렸을 때 1을 출력 ( 풀다운일 경우, 풀업은 반대로 출력) 하는
코드를 넣어봤습니다. (시리얼 통신)
int buttonPin = 4;
int ledPin = 13;
int buttonState = 0;
int val = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop(){
val=digitalRead(buttonPin);
buttonState = digitalRead(buttonPin);
if(buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
Serial.println(val);
}
처음 아두이노를 공부할 때 저는 기계치인대다가 재미 없어보였는데
전류의 흐름을 조금 이해하고 나니 흥미가 생겼어요. ( 열정은 아니고 )
열정이 되기까지 꾸준히 공부 해봐야겠지만 어떻게 될진 모르겠네요 ^^
( 저는 열정은 지식과 꾸준함이 있을 때 생기는 거라고 생각합니다. )
감사합니다.❤️