Работаем с множеством светодиодов
Мигать одним светодиодом не слишком интересно. В этом уроке мы рассмотрим работу с множеством светодиодов. Если проявить фантазию, то можно создавать интересные эффекты.
Сам принцип работы со светодиодами не меняется, мы также задаём номера выводом и подаём нужные сигналы. Но проблема заключается в том, что придётся писать однотипный код для каждого светодиода. И когда светодиодов наберётся большое количество и вы решите поменять логику, то придётся искать и менять код у каждого светодиода. Это не очень удобно. Поэтому для облегчения рутинной работы используют циклы, массивы, коллекции.
05.Control: ForLoopIteration
Для знакомства с циклом for в Arduino IDE есть пример File | Examples | 05.Control | ForLoopIteration.
Для эксперимента нам понадобятся шесть светодиодов. Соответственно, к ним нужно добавить шесть резисторов. Соединяем их как на рисунке. Задействуем цифровые выводы 2, 3, 4, 5, 6, 7.

Цель скетча — поочерёдно зажигать и гасить светодиоды в одном направлении, а затем в другом.
int timer = 100; // интервал между миганиями светодиодов void setup() < // проходимся в цикле по каждому светодиоду от 2 до 7 и влючаем нужный режим for (int thisPin = 2; thisPin < 8; thisPin++) < pinMode(thisPin, OUTPUT); >> void loop() < // опять проходимся в цикле по каждому светодиоду for (int thisPin = 2; thisPin < 8; thisPin++) < // включаем digitalWrite(thisPin, HIGH); delay(timer); // выключаем digitalWrite(thisPin, LOW); >// ещё раз проходимся в цикле, но в обратном порядке от 7 до 2 for (int thisPin = 7; thisPin >= 2; thisPin--) < // включаем digitalWrite(thisPin, HIGH); delay(timer); // выключаем digitalWrite(thisPin, LOW); >>
Доказательство, что код работает.
05.Control: Arrays
Обращаться к каждому светодиоду можно не только по очереди в цикле, но и через массив. Использование массивов даёт больше гибкости. Посмотрим на примере File | Examples | 5.Control | Arrays. Схема остаётся прежней из предыдущего примера.
Массив объявляется с помощью квадратных скобок, а затем к переменной массива обращаются, указывая в квадратных скобках индекс массива, который начинается с 0. Таким образом, чтобы обратиться к первому элементу массива, следует писать ledPins[0] и т.д. Комментарии к скетчу смотрите в предыдущем примере.
int timer = 100; int ledPins[] = < 2, 7, 4, 6, 5, 3 >; // массив в случайном порядке int pinCount = 6; // количество светодиодов (размер массива) void setup() < for (int thisPin = 0; thisPin < pinCount; thisPin++) < pinMode(ledPins[thisPin], OUTPUT); >> void loop() < for (int thisPin = 0; thisPin < pinCount; thisPin++) < digitalWrite(ledPins[thisPin], HIGH); delay(timer); digitalWrite(ledPins[thisPin], LOW); >// loop from the highest pin to the lowest: for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) < digitalWrite(ledPins[thisPin], HIGH); delay(timer); digitalWrite(ledPins[thisPin], LOW); >>
Если вы замените строку int ledPins[] = ; на int ledPins[] = ;, то получите точно такое же поведение светодиодов из предыдущего примера с циклом for, когда светодиоды загораются и гаснут по очереди. Но использование массива позволяет поменять начальное положение светодиодов, не меняя остальной код. И вы можете только в одном месте менять начальные позиции для запуска волны. Например, зададим массив через одного: .
Бегущие огни
Ещё один вариант бегущих по порядку огней. На этот раз уместим код в один цикл for, добавив переменную, следящую за направлением движения.
const int ARRAY_SIZE = 6; int ledPin[] = ; int ledDelay = 500; int direction = 1; int currentLed = 0; unsigned long changeTime; void setup() < for (int i = 0; i < ARRAY_SIZE; i++) < pinMode(ledPin[i], OUTPUT); >changeTime = millis(); > void loop() < if ((millis() - changeTime) >ledDelay) < changeLed(); changeTime = millis(); >> void changeLed() < // выключаем все светодиоды for (int i = 0; i < ARRAY_SIZE; i++) < digitalWrite(ledPin[i], LOW); >// включаем текущий LED digitalWrite(ledPin[currentLed], HIGH); // увеличиваем значение currentLed += direction; // меняем направление, если достигли конца if (currentLed == ARRAY_SIZE - 1) < direction = -1; >if (currentLed == 0) < direction = 1; >>
Три примера показывают, что реализовать проект можно разными способами. Не существуют универсальных решений, каждый решает свою задачу индивидуально, опираясь на свой опыт и практику.
07.Display: barGraph (Световая шкала и потенциометр)
Рассмотрим пример с использованием светодиодной шкалы и потенциометра — Examples | 07.Display | barGraph. Если световой шкалы нет, то замените на 10 обычных светодиодов.
Изменяя вручную напряжение при помощи потенциометра, мы будем выводить информацию на световую шкалу.
Добавим на схему потенциометр. Средняя ножка ведёт на аналоговый вывод A0, а остальные две на 5 V и GND.

// константы const int analogPin = A0; // порт для потенциометра const int ledCount = 10; // число светодиодов на светодиодной шкале int ledPins[] = < 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 >; // массив портов, к которым привязаны светодиоды void setup() < // проходим через все элементы массива и устанавливаем режим для вывода for (int thisLed = 0; thisLed < ledCount; thisLed++) < pinMode(ledPins[thisLed], OUTPUT); >> void loop() < // считываем сигнал с потенциометра int sensorReading = analogRead(analogPin); // трансформируем результат в диапазон от 0 до 10 (по числу светодиодов) int ledLevel = map(sensorReading, 0, 1023, 0, ledCount); // проходим через массив светодиодов for (int thisLed = 0; thisLed < ledCount; thisLed++) < // если индекс элемента массива меньше чем ledLevel, // включаем порт для данного элемента: if (thisLed < ledLevel) < digitalWrite(ledPins[thisLed], HIGH); >// Выключаем все порты, которые выше чем ledLevel: else < digitalWrite(ledPins[thisLed], LOW); >> >
Данный пример интересен функцией map(), предназначенной для пропорционального перевода значений одного диапазона в значения другого диапазона. Мы знаем, что потенциометр может выводить результаты от 0 до 1023, а у нас всего десять светодиодов. Функция нам и поможет в преобразовании.
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
Все значения будут равномерно распределены от 0 до 10 (приблизительно 102 единицы потенциометра на одну единицу). Представим себе, что у нас потенциометр показывает значение 110 единиц, что соответствует значению 1 после применения функции. Первый светодиод в массиве имеет значение 0, т.е. меньше 1. Первый светодиод загорится, а остальные погаснут (если горели до этого). Поворачивая ручку потенциометра, мы увеличиваем значения и соответственно увеличиваем число включённых светодиодов. Поворачивая ручку потенциометра в обратную сторону, мы уменьшаем число включённых светодиодов. Чтобы следить за результатами, добавьте в код наблюдение за последовательным портом Serial
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount); Serial.println(sensorReading); delay(1); .
Модуль 2-цветного светодиода KY-011
Модуль выглядит как один светодиод, но на самом деле состоит из двух светодиодов разных цветов (красный и зелёный). и имеет три вывода. Применяется для индикации режима работы прибора, показа фаз протекания контролируемого процесса и позволяет экономить площадь передней панели прибора. Красно-зелёный светодиод имеет четыре состояния: красное свечение, зелёное, оранжевое и выключен. Оранжевое свечение будет при одновременном включении красного и зелёного полупроводников. Пример реализации: зелёный свет – прибор готов к работе, красный – ожидание, оранжевый — промежуточный.

Контакт S предназначен для соединения с общим проводом схемы, отрицательный полюс питания, средний контакт – красный источник света. При работе с модулем следует использовать резисторы (напр, 330Ω).
На практике при одновременном включении не выводится чистый оранжевый цвет, нужно немного поиграться с разными значениями напряжения.
Скетч, в котором используем все доступные значения.
int redPin = 9; // pin for red led int greenPin = 10; // pin for green led int val; void setup() < pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); >void loop()
Модуль 2-цветного светодиода KY-029
Модуль KY-029 с общим катодом похож на модуль KY-011, только вместо светодиода на 5 мм используется двухцветный светодиод на 3 мм (зелёный и красный).

У модуля три вывода: — (GND) — общий катод светодиодов, средний контакт — анод (+) красного светодиода, «S» — анод (+) зелёного светодиода.
KY-029 | Arduino ---------------- - | GND N/A | D S | D
Скетч используйте от модуля KY-011.
Семицветный светодиодный модуль KY-034
Модуль состоит из печатной платы, трёх выводов, сопротивления 10кОм (код SMD-резистора 103) и семицветного светодиода.

Семицветный мигающий светодиод имеет всего два контакта (плюс и минус). Достаточно добавить источник питания и светодиодный модуль будет мигать всеми цветами радуги в разных комбинациях. Происходит эта магия за счёт миниатюрной микросхемы, которая встроена в светодиод.
Программирования не требуется. Просто подключаем вывод — к GND и S к 5V. При желании можете подключить не к питанию, а к цифровому пину Arduino и управлять включением и выключением светодиода (например, скетч Blink).
Входит в состав набора Набор из 37 датчиков
Включение светодиода кнопкой Ардуино

Включение светодиода с помощью кнопки Arduino может быть выполнено несколькими способами: можно управлять светодиодом с помощью одной или двух кнопок. Также можно модулировать интенсивность яркость светодиода от кнопки. Рассмотрим все возможности подключения тактовой кнопки и светодиода к плате Ардуино на примерах программ со схемами, можно также использовать сенсорные кнопки в представленных примерах.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- тактовые кнопки
- светодиоды
- резисторы
- макетная плата
- коннекторы
- Как подключить тактовую кнопку к Ардуино
- Функция pinMode в Ардуино, INPUT_PULLUP
- Игра со светодиодами и кнопками на Ардуино
К микроконтроллеру Ардуино тактовые кнопки подключаются двумя способами: с подтягивающим резистором (пин платы запрограммирован в режиме работы INPUT) и без резистора (пин находится в режиме работы INPUT_PULLUP). Эти способы рассмотрены были ранее в обзоре — Как подключить кнопку к Ардуино. В этой статье мы будем использовать управление светодиодом от тактовой кнопки без подтягивающего резистора.
Подключение светодиода и кнопки к Ардуино

Управлять светодиодом от Ардуино можно с помощью одной или двух кнопок. Для включения светодиода с помощью кнопки Arduino соберите схему, как показано на рисунке. Обратите внимание, что сенсорная кнопка в схеме на макетной плате подключена к микроконтроллеру без подтягивающего резистора, так как пин 2 платы Arduino подключен к +5 Вольт через встроенный резистор в режиме работы порта INPUT_PULLUP.
Скетч включение и выключение светодиода от кнопки
#define LED 10 #define BUT 2 boolean buttonWasUp = true; boolean ledEnabled = false; void setup() < pinMode(LED, OUTPUT); pinMode(BUT, INPUT_PULLUP); >void loop() < boolean buttonIsUp = digitalRead(BUT); if (buttonWasUp && !buttonIsUp) < delay(10); buttonIsUp = digitalRead(BUT); if (!buttonIsUp) < ledEnabled = !ledEnabled; digitalWrite(LED, ledEnabled); >> buttonWasUp = buttonIsUp; >
Подключение светодиода и двух кнопок Ардуино

Программа для управления светодиодом с помощью двух кнопок. Обратите внимание, что при использовании конфигурации порта платы в режиме INPUT_PULLUP цифровой вход поднимается до +5 Вольт. По этой причине значение входящего сигнала будет инвертировано. Когда тактовая кнопка, подключенная к GND, отпущена — сигнал на входе Ардуино высокий «1». При нажатии кнопки, на входе сигнал станет низким «0».
Скетч для управления светодиодом от двух кнопок
#define LED 10 #define BT1 2 #define BT2 4 boolean button1WasUp = true; boolean button2WasUp = true; void setup() < pinMode(LED, OUTPUT); pinMode(BT1, INPUT_PULLUP); pinMode(BT2, INPUT_PULLUP); >void loop() < boolean button1IsUp = digitalRead(BT1); boolean button2IsUp = digitalRead(BT2); if (button1WasUp && !button1IsUp) < delay(10); button1IsUp = digitalRead(BT1); if (!button1IsUp) < digitalWrite(LED, LOW); >> if (button2WasUp && !button2IsUp) < delay(10); button2IsUp = digitalRead(BT2); if (!button2IsUp) < digitalWrite(LED, HIGH); >> button1WasUp = button1IsUp; button2WasUp = button2IsUp; >
Регулировка яркости светодиода от кнопок

В следующем примере вам также понадобятся две кнопки и один светодиод, как показано на схеме выше. Но вместо простого включения и выключения светодиода мы будем увеличивать и уменьшать яркость светодиода с помощью сигнала широтно-импульсной модуляции микроконтроллера. Соберите схему и загрузите программу в плату Ардуино, чтобы понять, как управлять светодиодом от тактовой кнопки с микроконтроллером.
Скетч управление яркостью светодиода от кнопок
#define PLUS_BUTTON 2 #define MINUS_BUTTON 4 #define LED 10 int brightness = 100; boolean plusUp = true; boolean minusUp = true; void setup() < pinMode(LED, OUTPUT); pinMode(PLUS_BUTTON, INPUT_PULLUP); pinMode(MINUS_BUTTON, INPUT_PULLUP); >void loop() < analogWrite(LED, brightness); plusUp = handleClick(PLUS_BUTTON, plusUp, +20); minusUp = handleClick(MINUS_BUTTON, minusUp, -20); >boolean handleClick(int buttonPin, boolean wasUp, int delta) < boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) < delay(10); isUp = digitalRead(buttonPin); if (!isUp) brightness = constrain(brightness + delta, 0, 255); >return isUp; >
Заключение. Мы изучили несколько примеров того, как управлять светодиодом Arduino с помощью кнопки. Вы узнали, что светодиодом можно управлять с помощью одной кнопки и что его можно включать/выключать с помощью двух кнопок. Кроме того, можно изменять яркость светодиода с помощью тактовых кнопок и ШИМ-сигнала. Все приведенные примеры могут быть использованы в различных проектах с платой Ардуино.
Подключение нескольких трехцветных светодиодов к Arduino Uno
В этой статье мы рассмотрим подключение 5 трехцветных светодиодов RGB (Red Green Blue) к плате Arduino Uno. Эти светодиоды будут соединены в параллель для того чтобы уменьшить число используемых контактов. Более упрощенный пример работы Arduino с трехцветным светодиодом можно прочитать в этой статье.

Принципы работы трехцветных светодиодов
Внешний вид трехцветного светодиода показан на следующем рисунке:

Трехцветный светодиод имеет 4 контакта как показано на рисунке ниже:
- контакт 1: цвет 1 отрицательный вывод при общем аноде или цвет 1 положительный вывод при общем катоде;
- контакт 2: общий положительный вывод для всех трех цветов при общем аноде или общий отрицательный вывод для всех трех цветов при общем катоде;
- контакт 3: цвет 2 отрицательный вывод или цвет 2 положительный вывод;
- контакт 4: цвет 3 отрицательный вывод или цвет 3 положительный вывод.

Таким образом, есть 2 типа трехцветных светодиодов – с общим катодом (ОК) и с общим анодом (ОА). При общем катоде (общий отрицательный вывод) мы имеем три положительных вывода, где каждый вывод отвечает за свой цвет, и один общий отрицательный вывод. Внутренняя схема подключений трехцветного светодиода с общим катодом показана на следующем рисунке:
В таком светодиоде (с ОК) если мы хотим зажечь красный цвет мы должны подать питание на контакт, отвечающий за красный цвет, и подать землю на общий отрицательный вывод. Аналогично и для других цветов.
При общем аноде (общий положительный вывод) мы имеем три отрицательных вывода, где каждый вывод отвечает за свой цвет, и один общий положительный вывод. Внутренняя схема подключений трехцветного светодиода с общим анодом показана на следующем рисунке:

В таком светодиоде (с ОА) если мы хотим зажечь красный цвет мы должны подать землю на контакт, отвечающий за красный цвет, и подать питание на общий положительный вывод. Аналогично и для других цветов.
В нашем примере мы будем использовать трехцветные светодиоды с общим анодом. В обычном режиме для подключения 5 трехцветных светодиодов к плате Arduino нам бы понадобилось 5×4= 20 контактов, но мы уменьшим количество используемых контактов до 8 при помощи соединения трехцветных светодиодов в параллель и использовании технологии мультиплексирования.
Необходимые компоненты
Плата Arduino Uno
Трехцветный светодиод с общим анодом (ОА) – 5 шт.
Резистор 1 кОм – 3 шт.
Работа схемы
Схема устройства представлена на следующем рисунке.
Предположим, к примеру, что нам в представленной схеме необходимо включить красный светодиод в SET1 (наборе 1) и зеленый светодиод в SET2. Для этого будет необходимо подать напряжение питания на PIN8 и PIN9 платы Arduino Uno, и землю на PIN7 и PIN6.
Но при этом включатся еще зеленый светодиод в SET1 и красный светодиод в SET2. Аналогичная ситуация будет наблюдаться и при попытке включить светодиоды в других наборах (светодиодов).
Чтобы устранить эту проблему мы будем включать только один набор (SET, светодиод) в один момент времени. Например, в момент времени t=0 сек мы будем включать SET1. А в момент времени t=1 мсек мы SET1 будем выключать, а SET2 включать. Продолжая аналогично будем иметь что в t=6 мсек SET5 мы будем выключать, а SET1 будем включать. И так по кругу.
Поскольку человеческий глаз не может различить частоту мигания более 30 Гц, то нам необходимо будет переключать светодиоды с частотой 30 Гц или более. В этом случае человеческий глаз будет видеть что светодиод постоянно горит. Но на самом деле это не так – светодиоды будут постоянно включаться и выключаться. Эта технология и называется мультиплексированием.
Проще говоря, мы будем запитывать каждый общий катод 5 наборов (SET) на 1 миллисекунду. В этом случае по прошествии 5 миллисекунд мы будем иметь полный цикл, после чего снова происходит переключение к SET1. И так будет продолжаться снова и снова. Поскольку светодиоды будут включаться и выключаться достаточно часто, то человеческий глаз будет видеть их постоянно горящими.
То есть когда мы запитываем SET1 в момент времени t=0 мс, мы подаем землю на общий контакт красных светодиодов. В момент времени t=1 мс мы подаем питание на SET2 и землю на общий контакт зеленых светодиодов (в это время на общие контакты красных и синих светодиодов должен быть подан высокий уровень). Поскольку все это происходит достаточно часто для человеческого глаза, то глаз видит постоянного горящими красный светодиод в первом наборе (трехцветном светодиоде) и зеленый светодиод во втором наборе (трехцветном светодиоде).
В представленной ниже программе мы будем медленно зажигать светодиоды всех цветов чтобы наглядно продемонстрировать как работает технология мультиплексирования.
Исходный код программы
Текст программы снабжен необходимыми пояснения для лучшего понимания ее работы.
// цикл, в котором мы будем зажигать светодиоды
void loop()
for (int i=3;i <8;i++)
digitalWrite(i,HIGH); // подаем питание на каждый трехцветный светодиод в каждый момент времени
for (int j=8;j <11;j++)
digitalWrite(j,LOW);
delay(100);
digitalWrite(j,HIGH); // мигаем тремя цветами каждого трехцветного светодиода
>
digitalWrite(i,LOW); // подаем низкий уровень на каждый трехцветный светодиод когда помигали цветами
>
>
Подключение трехцветного светодиода к Arduino Uno
В этой статье мы будем подключать трехцветный (красный/зеленый/синий) светодиод (RGB LED) к плате Arduino Uno.

Принципы работы трехцветного светодиода
Внешний вид трехцветного светодиода показан на следующем рисунке:

Трехцветный светодиод имеет 4 контакта как показано на рисунке ниже:
- контакт 1: цвет 1 отрицательный вывод при общем аноде или цвет 1 положительный вывод при общем катоде;
- контакт 2: общий положительный вывод для всех трех цветов при общем аноде или общий отрицательный вывод для всех трех цветов при общем катоде;
- контакт 3: цвет 2 отрицательный вывод или цвет 2 положительный вывод;
- контакт 4: цвет 3 отрицательный вывод или цвет 3 положительный вывод.

Таким образом, есть 2 типа трехцветных светодиодов – с общим катодом (ОК) и с общим анодом (ОА). При общем катоде (общий отрицательный вывод) мы имеем три положительных вывода, где каждый вывод отвечает за свой цвет, и один общий отрицательный вывод. Внутренняя схема подключений трехцветного светодиода с общим катодом показана на следующем рисунке:
В таком светодиоде (с ОК) если мы хотим зажечь красный цвет мы должны подать питание на контакт, отвечающий за красный цвет, и подать землю на общий отрицательный вывод. Аналогично и для других цветов.
При общем аноде (общий положительный вывод) мы имеем три отрицательных вывода, где каждый вывод отвечает за свой цвет, и один общий положительный вывод. Внутренняя схема подключений трехцветного светодиода с общим анодом показана на следующем рисунке:

В таком светодиоде (с ОА) если мы хотим зажечь красный цвет мы должны подать землю на контакт, отвечающий за красный цвет, и подать питание на общий положительный вывод. Аналогично и для других цветов.
В нашей схеме мы будем использовать трехцветный светодиод с общим анодом (ОА). Если вам будет необходимо подсоединить больше подобных светодиодов к плате Arduino Uno, к примеру 5, то вам будет нужно 5×4= 20 контактов, но можно уменьшить количество контактов в этом случае до 8 если мы соединим трехцветные светодиоды параллельно и будем использовать технологию мультиплексирования.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- Трехцветный светодиод с общим анодом (ОА) (купить на AliExpress).
- Резистор 1 кОм (купить на AliExpress).
Работа схемы
Схема устройства представлена на следующем рисунке.

На представленной схеме мы подсоединили общий отрицательный вывод трехцветного светодиода к выводу питания платы Arduino при помощи резистора 1 кОм.
Отрицательные выводы (1, 3, 4) трехцветного светодиода подсоединены к контактам 2, 3 и 4 Arduino. Здесь трехцветный светодиод подсоединен в обратной логике, то есть если мы подадим на отрицательные выводы светодиода высокий уровень, то он выключится. То есть чтобы светодиод оставался в выключенном состоянии необходимо поддерживать на его отрицательных выводах высокий уровень. А если мы подадим на них низкий уровень, то светодиод зажгется.
То есть мы имеем, что контакт 2 светодиода – это его общий анод, а контакты 1, 3 и 4 – отрицательные выводы для красного, синего и зеленого цветов соответственно.
В представленном далее коде программы вы можете увидеть как мы последовательно мигаем всеми тремя цветами в трехцветном светодиоде последовательно подавая на соответствующие отрицательные выводы светодиода высокий и низкий уровень.
Исходный код программы
Код программы достаточно простой, поэтому комментариев к нему нет. Но если у кого возникнут какие либо вопросы по тексту данной программы, то вы можете задать их в комментариях к данной статье.