Arduino 电位器控制 LED 条形图:入门经典实验
项目简介
这是一个 Arduino 入门级经典实验:10 个 LED 组成条形图,通过旋转电位器控制亮灯数量。实验涵盖模拟输入读取、map() 映射函数、数组遍历与数字输出控制等核心概念,代码不足 30 行,极适合初学者理解“模拟量转离散量”的思想。
元器件清单
- Arduino UNO ×1
- 5mm LED (任意颜色) ×10
- 220 Ω 电阻 ×10:限流
- 10 kΩ 旋转电位器 ×1
- 面包板、跳线 若干
接线图解
LED 条形图 (共阴极)
D2 → LED1 阳极 (串联 220Ω) D3 → LED2 阳极 ... D11 → LED10 阳极 所有 LED 阴极 → GND
电位器
左脚 → 5V 中间 → A0 右脚 → GND
完整代码 (含注释)
const uint8_t ANALOG_PIN = A0; // 电位器中间脚
const uint8_t LED_COUNT = 10; // LED 总数
const uint8_t LED_PINS[LED_COUNT] = {2,3,4,5,6,7,8,9,10,11}; // 对应引脚
void setup() {
for (uint8_t i = 0; i < LED_COUNT; i++) {
pinMode(LED_PINS[i], OUTPUT);
}
}
void loop() {
int sensorValue = analogRead(ANALOG_PIN); // 0~1023
int ledLevel = map(sensorValue, 0, 1023, 0, LED_COUNT); // 映射为 0~10
for (uint8_t i = 0; i < LED_COUNT; i++) {
digitalWrite(LED_PINS[i], (i < ledLevel) ? HIGH : LOW);
}
// 可选:串口绘图器观察波形
// Serial.println(ledLevel);
}
代码核心解析
map(value, fromLow, fromHigh, toLow, toHigh)- 线性映射函数,将 10-bit ADC (0–1023) 映射为 LED 等级 (0–10)。注意:
map()使用整数运算,不四舍五入。 - 数组遍历控制
for (i=0; i配合 i < ledLevel判断,实现“低位亮、高位灭”的条形图效果。- 扩展:平滑过渡
- 若需“呼吸”效果,可对
ledLevel做一阶滤波:ledLevel = 0.7*ledLevel + 0.3*newLevel。