Урок 10. Бегущий огонек на 5 светодиодах. Массивы, циклы

В этом уроке мы будем работать с программой из 8 урока – "бегущий огонек" на ленте из 5 светодиодов. И рассмотрим новые для нас методы программирования.
В уроке 8 для "выключения" 5 светодиодов мы создавали следующую конструкцию из блоков:
Рис. 10.1. Блоки для "выключения" 5 светодиодов.

А если бы светодиодов было 10 или 12? То получилось бы примерно так.
Рис. 10.2. Разрастания программы при увеличении количества светодиодов.

Сейчас рассотрим более элегантный способ – использование массивов. Массив – это набор переменных, к которым обращение идет по индексу (месту переменной в массиве).
Создадим массив из 5 мест, каждое место – это контакт подключения светодиода.
Рис. 10.3. Массив контактов подключения светодиодов.

Как нам получить элемент массива? По индексу – месту в массиве. Например контакт 12 (красный светодиод).
Рис. 10.4. Получить 4 элемент массива.

Или получить элемент массива по индексу, хранящемуся в переменной num.
Рис. 10.5. Получить массива по индексу, хранящемуся в переменной num.

Приступим к написанию скрипта.
Алгоритм слудующий:
Создаем переменную num, в которой будет храниться индекс массива (контакты подключения светодиодов – 9, 10, 11, 12, 13). Присваеваем переменной num значение 1.
Рис. 10.6. Присваеваем переменной num (индекс массива) значение 1.

В непрерывном цикле отключаем все светодиоды (см. пользовательский блок ledsOff, который создавали в уроке 8). И в блок set digital pin в поле пин вставляем значение из массива контактов светодиодов по индексу, хранящемуся в переменной num. Затем вставляем блок ждать продолжительностью 1 секунда.
Рис. 10.7. Присваеваем переменной num (индекс массива) значение 1.

Сейчас в цикле постоянно выключаются все светодиоды, затем включается светодиод, подключенный к контакту 9 (красный RGB-светодиода).
Далее необходимо выбирать другие светодиоды, менять значение переменной num – индекса массива. Увеличиваем значение num на единицу, проверяем, чтобы значение не превысило 5 (максимальный индекс нашего массива). Используем блок if группы Управление.
Рис. 10.8. Весь скрипт.

Скрипт готов.
Подключаемся к плате Arduino. Нажимаем на кнопку Подключиться к Arduino в группе Arduino и выбираем порт подключения.
Затем появляется окно процесса подключения.
При появлении данного окна необходимо нажать на кнопку RESET на плате Arduino!
После появления окна об удачном подключении можно запускать скрипт.
Запускаем (нажимаем на ̎флажок̎ из блока команд управления скриптом) и проверяем работу.
Скачать данный скрипт 10_01.xml можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip
Еще немного изменим программу. Рассмотрим содержимое пользовательского блока ledsOff.
Рис. 10.9. Пользовательский блок ledsOff.

В данном блоке многократно повторяется одна и таже операция, меняется только номер контакта. Мы можем объединить контакты в массив. И использовать оператор для перебора элементов массива.
Рис. 10.10. Перебор элементов массива для получения значения.

Можем это блок вставить в пользовательский блок или в основной скрипт
Рис. 10.11. Измененный скрипт.

Скачать данный скрипт 10_02.xml можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip

Создание скетча в программе Arduino IDE.

Рассмотрим процесс создания скетча – "бегущий огонек" на ленте из 5 светодиодов с использованием массивов. Массив – это набор переменных, к которым обращение идет по индексу (месту переменной в массиве). Только в отличие от Scratch нумерация элементов массива начинается с 0.
Объявление массива из элементов – контактов подключения светодиодов:
int pinLeds[]={9,10,11,12,13};
Обращение к элементу массива происходит по индексу, например
int num=pinLeds[3]
Значение num=12 (четвертый элемент массива, нумерация с 0!).
Очень удобный метод работы с массивами циклы. При этом счетчик чикла используется для индексации каждого элемента массива. Перебор всех элементов массива:
int num;
for(int i=0;i<5;i++) {
num= pinLeds[i];
}

И "выключить" все светодиоды
for(int i=0;i<5;i++) {
digitalWrite(pinLeds[i],LOW);
}
Так же в цикле включаем светодиоды. В переменной num храним индекс активного светодиода. И каждый цикл увеличиваем значение num на единицу. По достижении значения 5 (шестой элемент массива) делаем num=1.
num=num+1;
if(num==5) {
num=0;
}
Включаем светодиод с индексом из переменной num и делаем задержку 1 секунда.
digitalWrite(pinLeds[num], HIGH);
delay(1000);
Полное содержание скетча представлено в листинге 10.1.

Листинг 10.1.
// Массив для хранения контактов подключения светодиодов
int pinLeds[]={9,10,11,12,13};
// Переменная хранения индекса активного светодиода
int num=0;

void setup() {
// Сконфигурировать контакты светодиода как выход
for(int i=0;i<5;i++) {
pinMode(pinLeds[i],OUTPUT);
digitalWrite(pinLeds[i],LOW);
}
}
void loop() {
// "выключить" все светодиоды
for(int i=0;i<5;i++) {
digitalWrite(pinLeds[i],LOW);
}
// изменить переменную num
num=num+1;
if(num==5) {
num=0;
}
// Включаем светодиод с индексом из переменной num
digitalWrite(pinLeds[num], HIGH);
// задержка 1 секунда
delay(1000);
}
Загружаем скетч на плату Arduino и проверяем работу. Скачать данный скетч 10_01.ino можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip
Еще один вариант – можем сделать цикл в цикле (тогда не нужна и переменная num). Смотрите листинг 10.2.

Листинг 10.2.
// Массив для хранения контактов подключения светодиодов
int pinLeds[]={9,10,11,12,13};

void setup() {
// Сконфигурировать контакты светодиода как выход
for(int i=0;i<5;i++) {
pinMode(pinLeds[i],OUTPUT);
digitalWrite(pinLeds[i],LOW);
}
}
void loop() {
// цикл перебора активного светодиода
for(int i=0;i<5;i++) {
// выключение всех светодиодов
// в качестве счетчика другая переменная k!
for(int k=0;k<5;k++) {
digitalWrite(pinLeds[k],LOW);
}
// Включаем светодиод
digitalWrite(pinLeds[i], HIGH);
// задержка 1 секунда
delay(1000);
}
}

Скачать данный скетч 10_02.ino можно по ссылке https://amegakit.ru/libraries/lib_Lab_Om-Robot.zip