아두이노 포텐셔미터 제어 LED 바 그래프: 초보자를 위한 아날로그 입력 실습
프로젝트 개요
아두이노 입문자를 위한 가장 직관적인 아날로그 입력-디지털 출력 예제입니다. 10개의 LED를 바 그래프 형태로 배열하고, 포텐셔미터(가변저항)를 돌려 아날로그 값(0~1023)을 읽어 LED 개수를 비례 제어합니다. map() 함수와 배열, 반복문의 기초를 익히기에 최적의 프로젝트입니다.
부품 목록
| 부품 |
수량 |
사양 |
| Arduino UNO |
1 |
메인 보드 |
| LED |
10 |
5mm, 색상 자유 (적색 추천) |
| 저항 |
10 |
220Ω (LED 전류 제한용) |
| 포텐셔미터 |
1 |
10kΩ 회전형 |
| 점퍼 와이어 |
13 |
브레드보드용 |
| 브레드보드 |
1 |
선택 사항 |
회로 구성
LED 바 그래프 (공통 캐소드)
- LED 애노드(+): 220Ω 저항 → 디지털 핀 2~11
- LED 캐소드(-): 공통 GND
포텐셔미터
- 왼쪽 단자 → 5V
- 가운데 단자(와이퍼) → 아날로그 핀 A0
- 오른쪽 단자 → GND
완전 소스 코드
const int analogPin = A0; // 포텐셔미터 연결 핀
const int ledCount = 10; // LED 개수
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // LED 핀 배열
void setup() {
// 모든 LED 핀을 출력 모드로 설정
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
}
void loop() {
// 1. 포텐셔미터 아날로그 값 읽기 (0~1023)
int sensorReading = analogRead(analogPin);
// 2. 0~1023 범위를 0~10(LED 개수) 범위로 매핑
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
// 3. LED 배열 순회하며 제어
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH); // 켜기
} else {
digitalWrite(ledPins[thisLed], LOW); // 끄기
}
}
}
코드 핵심 포인트 해설
1. 배열 활용
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};로 핀 번호를 배열에 저장하면 반복문으로 일괄 처리 가능합니다.
2. map() 함수
map(value, fromLow, fromHigh, toLow, toHigh)는 입력 범위를 출력 범위로 선형 변환합니다. 여기서는 10비트 ADC(1024단계)를 11단계(0~10개 LED)로 압축합니다.
3. 경계 조건 처리
thisLed < ledLevel 조건으로 ledLevel 미만 인덱스는 ON, 이상은 OFF 처리합니다. ledLevel=0이면 모두 OFF, 10이면 모두 ON.
학습 포인트
- 아날로그 입력(
analogRead)과 디지털 출력(digitalWrite) 기초
- 배열 선언과 반복문(
for) 활용
map() 함수를 이용한 스케일링
- 조건문(
if-else)으로 다중 출력 제어
- 브레드보드 배선 실습
응용 확장 아이디어
- 사운드 레벨 미터: 마이크 모듈(KY-038)로 소리 크기 시각화
- 온도 표시계: LM35/TMP36 센서로 온도 구간별 LED 점등
- 배터리 잔량 표시: 전압 분배 회로로 배터리 전압 측정 후 바 그래프 표시
- PWM 디밍:
analogWrite()로 LED 밝기 그라데이션 효과
- 양방향 바 그래프: 중앙 기준 좌우 확장 (중립 위치를 중심으로 ±표시)
자주 하는 실수와 해결
| 증상 |
원인 |
해결 |
| LED가 모두 켜지지 않음 |
핀 번호 불일치 / 배선 오류 |
배열 핀 번호와 실제 배선 확인 |
| 포텐셔미터 돌려도 변화 없음 |
A0 핀 미연결 / GND/5V 역결선 |
와이퍼(가운데) 단자 확인
| LED 밝기 약함 |
저항값 과대 / 전압 강하 |
220Ω 적정, 5V 공급 확인 |
| 끝단 LED만 점등 |
map() 범위 설정 오류 |
toHigh를 ledCount(10)로 설정 확인 |