Analog In, Out Serial: управление яркостью светодиода через потенциометр
Читаем аналоговый сигнал с потенциометра, преобразуем его функцией map() и управляем яркостью светодиода через PWM, выводя данные в Serial Monitor.
В этом уроке разберём классическую задачу: считать аналоговый сигнал с потенциометра, преобразовать его в нужный диапазон и использовать результат для плавного управления яркостью светодиода через ШИМ (PWM). Заодно будем выводить оба значения — исходное и преобразованное — в Serial Monitor, чтобы видеть, что происходит в реальном времени.
Необходимые компоненты
- Потенциометр
- Красный светодиод
- Резистор 220 Ом
Схема подключения

Потенциометр подключён к аналоговому входу A0, светодиод с резистором — к цифровому выводу 9 платы Arduino UNO.
Один крайний вывод потенциометра соедините с 5V, средний (движок) — с аналоговым пином A0, а второй крайний — с GND. Светодиод подключите через резистор 220 Ом к цифровому пину 9: длинная ножка (анод) идёт к резистору, короткая (катод) — к GND.
Важно: пин
9поддерживает PWM — это обязательное условие дляanalogWrite(). На платах Arduino UNO такие пины обозначены символом~.
Принципиальная схема

Принципиальная схема: потенциометр (Потенциометр) подключён к аналоговому входу A0, светодиод (Светодиод) через резистор 220 Ом (Резистор 220 Ом) — к выводу ~9 платы Arduino UNO.
Код и как он работает
В скетче объявляются два пина: аналоговый A0 для потенциометра и цифровой 9 для светодиода. Также заводятся две переменные — sensorValue и outputValue. В функции setup() запускается только последовательная связь — больше там ничего не нужно.
В основном цикле переменной sensorValue присваивается «сырое» значение с потенциометра. Здесь возникает принципиальный момент: analogRead() возвращает числа от 0 до 1023 (analogRead), а analogWrite() принимает значения только от 0 до 255 (analogWrite). Значит, данные нужно «сжать» в четыре раза, прежде чем отправить их на светодиод.
Для этого используется функция map():
outputValue = map(sensorValue, 0, 1023, 0, 255);
Переменной outputValue присваивается результат масштабирования. Функция map() принимает пять аргументов: само значение, нижнюю и верхнюю границы входного диапазона, нижнюю и верхнюю границы выходного диапазона. В нашем случае диапазон 0–1023 пересчитывается в 0–255.
Полученное значение передаётся на пин analogOutPin, управляя яркостью светодиода. Чем дальше повёрнут потенциометр — тем ярче светит светодиод. Наконец, оба значения (исходное и масштабированное) отправляются в Serial Monitor, где можно наблюдать их в виде непрерывного потока.
/*
Аналоговый вход, аналоговый выход, вывод в Serial
Считывает значение с аналогового входа, преобразует его в диапазон от 0 до 255
и использует результат для задания скважности PWM на выходном пине.
Также выводит результаты в Serial Monitor.
Схема:
- потенциометр подключён к аналоговому пину 0.
Средний вывод потенциометра идёт на аналоговый пин.
Крайние выводы потенциометра подключены к +5V и GND
- LED подключён от цифрового пина 9 к GND
создан 29 дек. 2008
изменён 9 апр. 2012
автор Tom Igoe
Этот пример кода находится в общественном достоянии.
https://www.arduino.cc/en/Tutorial/AnalogInOutSerial
*/
// Эти константы не изменяются. Они задают имена используемым пинам:
const int analogInPin = A0; // Аналоговый входной пин, к которому подключён потенциометр
const int analogOutPin = 9; // Аналоговый выходной пин, к которому подключён LED
int sensorValue = 0; // значение, считанное с потенциометра
int outputValue = 0; // значение, выводимое на PWM (аналоговый выход)
void setup() {
// инициализация Serial на скорости 9600 bps:
Serial.begin(9600);
}
void loop() {
// считать значение аналогового входа:
sensorValue = analogRead(analogInPin);
// преобразовать в диапазон аналогового выхода:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// установить значение аналогового выхода:
analogWrite(analogOutPin, outputValue);
// вывести результаты в Serial Monitor:
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
// подождать 2 миллисекунды перед следующим циклом, чтобы аналого-цифровой
// преобразователь успел стабилизироваться после последнего считывания:
delay(2);
}
Как проверить результат
- Загрузите скетч и откройте Serial Monitor (Ctrl+Shift+M). Убедитесь, что скорость порта совпадает с той, что задана в
setup(). - Медленно вращайте ручку потенциометра:
sensorValueдолжен меняться от 0 до 1023, аoutputValue— от 0 до 255. - Одновременно наблюдайте, как плавно меняется яркость светодиода.
Типичные ошибки
- Светодиод не меняет яркость, а просто мигает — скорее всего, пин не поддерживает PWM. Проверьте, есть ли значок
~рядом с номером пина на плате. - В Serial Monitor нули или одно фиксированное число — проверьте подключение потенциометра: средний вывод (движок) должен идти именно на
A0, а не наGNDили5V. - Светодиод не светится вообще — возможно, перепутана полярность. Анод (длинная ножка) должен быть со стороны резистора, катод (короткая) — к
GND. - Значения в мониторе скачут хаотично — попробуйте добавить небольшую задержку
delay(10)в конце цикла или использовать усреднение нескольких показанийanalogRead().
Где пригодится
Эта схема — основа для множества реальных проектов: регуляторы освещения, управление скоростью мотора, настройка громкости, плавное изменение цвета RGB-светодиода. Понимание связки analogRead() → map() → analogWrite() открывает путь к большинству аналоговых задач на Arduino.
Дополнительные материалы
Больше базовых примеров можно найти в разделе built-in examples.
Подробное описание всех функций — в language reference, справочнике языка Arduino.
Последнее обновление: 28.07.2015, SM