Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Аналоговые примеры chevron_right Analog In, Out Serial: управление яркостью светодиода через потенциометр

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);
}

Как проверить результат

  1. Загрузите скетч и откройте Serial Monitor (Ctrl+Shift+M). Убедитесь, что скорость порта совпадает с той, что задана в setup().
  2. Медленно вращайте ручку потенциометра: sensorValue должен меняться от 0 до 1023, а outputValue — от 0 до 255.
  3. Одновременно наблюдайте, как плавно меняется яркость светодиода.

Типичные ошибки

  • Светодиод не меняет яркость, а просто мигает — скорее всего, пин не поддерживает 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