Урок 8. Подключение внешнего светодиода. Бегущий огонек на 5 светодиодах

В этом уроке мы продолжим работать с цифровыми выводами Arduino. Создадим "бегущий огонек" на ленте из 5 светодиодов. Где мы возьмем столько светодиодов? На плате Easy Module shield мы найдем 5 светодиодов. Синий и красный светодиоды, подключенные к контактам D12 и D13, и RGB-светодиод, подключенный к контактам D9-D11.
Светодиод RGB отличается от обычного тем, что содержит 3 небольших кристалла R, G, B, которые смогут синтезировать любой цвет или оттенок. RGB-светодиод имеет 4 вывода (см. рис. 8.1).
Рис. 8.1. Контакты RGB-светодиода.

RGB расшифровывается как аббревиатура Red, Green, Blue. При помощи этих цветов можно получить любой цвет путем смешения, но мы будем использовать их как 3 светодиода – красный, синий, зеленый и включать отдельно. Итого у нас 5 светодиодов.
Схема подключения светодиодов к плате Arduino фактически выглядит следующим образом.
Рис. 8.2. Схема соединений для программы ̎бегущий огонек̎.

Создадим программу ̎бегущий огонек̎ - будем по очереди зажигать 1 светодиод.
Приступаем к написанию скрипта в программе Snap4Arduino. Подключаемся к плате Arduino (см. урок 6). Теперь в поле размещения блоков добавляем из группы Управление блок старта скрипта:
Риc 8.3. Добавление блока старта скрипта.

Далее добавляем бесконечный цикл:
Риc 8.4. Добавление блока бесконечного цикла.

Из группы Arduino добавим блоки управления цифровыми пинами, на все светодиоды добавим команду выключения, затем на один из них добавим команду включения светодиода. А так же паузу перед переключением светодиода.
Риc 8.5. Добавление команд для "бегущего огонька".

Для запуска нажимаем на запуск ( ̎флажок̎ из блока команд управления скриптом). На плате Arduino поочередно зажигается светодиод – синий, красный, зеленый (RGB-светодиод), синий (RGB-светодиод), красный (RGB-светодиод).
Наша программа получилась очень длинной и громоздкой. Команды для выключения светодиодов постоянно повторяются. Snap4Arduino позволяет создавать собственные блоки, которые состоят из простых блоков.
Создадим блок выключения светодиодов – ledsOff. Нажимаем на кнопку Новый блок, выбираем группу Arduino и вводим название.
Риc 8.6. Создание пользовательского блока.

Нажимаем кнопку OK. В окно вносим необходимые блоки. Сохраняем. В группе Arduino появляется новый блок. Это самый простой пример пользовательского блока.
Риc 8.7. Создание функционала пользовательского блока.

И тогда программу можем изменить следующим образом.
Риc 8.8. Программа с использованием пользовательского блока

Подключаемся к плате Arduino. Нажимаем на кнопку Подключиться к Arduino в группе Arduino и выбираем порт подключения.
Риc 8.9. Подключение к плате Arduino.

Затем появляется окно процесса подключения
Риc 8.10. Процесс подключения к плате Arduino.

При появлении данного окна необходимо нажать на кнопку RESET на плате Arduino!
После появления окна об удачном подключении можно запускать скрипт.
Риc 8.11. Плата Arduino удачно подключена!

Запускаем (нажимаем на ̎флажок̎ из блока команд управления скриптом) и проверяем работу.
Скачать данный скрипт 08_01.xml можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip

Создание скетча в программе Arduino IDE.
Создадим программу ̎бегущий огонек̎ в среде Arduino IDE.
В процедуре setup() настроим режим работы контактов (пинов), к которым подключены светодиоды, как OUTPUT (выход)

void setup() {
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
}

Алгоритм основного цикла следующий:
1. "гасим" все 5 светодиодов;
2. включаем первый светодиод;
3. вклачаем в скетче продолжительную паузу, чтобы увидеть горение одного светодиода;
4. повторяем шаги 1-3 для второго, третьего и далее до восьмого светодиода;
5. далее возврат в начало цикла loop().
Сокращенный код цикла loop() представлен в листинге 8.1.
Листинг 8.1

void loop() {
// выключить 5 светодиодов
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
// включить 1 светодиод
digitalWrite(13, HIGH);
// пауза 1000 мсек
delay(1000);
// выключить 5 светодиодов
….
// включить 2 светодиод
digitalWrite(12, HIGH);
// пауза
delay(1000);
// выключить 5 светодиодов
….
// включить 3 светодиод
digitalWrite(11, HIGH);
// пауза
delay(1000);
// выключить 5 светодиодов
….
// включить 4 светодиод
digitalWrite(10, HIGH);
// пауза
delay(1000);
// выключить 5 светодиодов
….
// включить 5 светодиод
digitalWrite(9, HIGH);
// пауза
delay(1000);
}

Скачать данный скетч 08_01.ino можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip
Загрузим данный скетч на плату Arduino.
При том, что скетч работает верно, у него есть большой недостаток – он очень громоздкий. Рассмотрим, как можно код значительно уменьшить с помощью функций. Функция – это именованная последовательность операций. Причиной создания функции является необходимость выполнять одинаковое действие несколько раз. В цикле loop() восемь раз встречается совершенно одинаковый код для выключения 8 светодиодов. Создадим функцию ledoff() (выключить светодиоды). Функция создается за скобками функций setup(0 и loop(). Создание функции:

void ledsOff() {
// код функции
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
}

И тогда цикл loop() нашего скетча сократится следующим образом (листинг 8.2)

Листинг 8.2
void loop() {
// выключить 5 светодиодов
ledsOff();
// включить 1 светодиод
digitalWrite(13, HIGH);
// пауза 1000 мсек
delay(1000);
//
ledsOff();
digitalWrite(12, HIGH);
delay(1000);
//
ledsOff();
digitalWrite(11, HIGH);
delay(1000);
//
ledsOff();
digitalWrite(10, HIGH);
delay(1000);
//
ledsOff();
digitalWrite(9, HIGH);
delay(1000);
}

Скачать данный скетч 08_02.ino можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip
Как видно, ввведение функции значительно сократило программу. Здесь мы рассмотрели простейший пример функции, в дальнейшем научимся передавать в функцию параметры и возвращать из функции в программу значения.