Управление несколькими светодиодами с использованием цикла for.
Часто вам нужно перебирать ряд пинов и выполнять над ними какие-то действия. Например, в этом примере 6 светодиодов, подключенных к Arduino, мигают с использованием цикла for(), который перемещается вперед и назад через цифровые пины с 2 по 7. Светодиоды включаются и выключаются последовательно с использованием функций digitalWrite() и delay().
Этот пример также называется “Knight Rider” в память о телесериале из 80-х годов, в котором Дэвид Хассельхоф имел искусственный интеллект по имени KITT, управляющий его Pontiac. В машину было установлено множество светодиодов разных размеров, выполняющих разные эффекты. В частности, у него был дисплей, сканирующийся вперед и назад по линии, как показано в этой захватывающей схватке между KITT и KARR. Этот пример воссоздает дисплей KITT.
Требуемое оборудование
- Плата Arduino
- 6 светодиодов
- 6 резисторов 220 Ом
- Провода для подключения
- Макетная плата
Схема подключения
Подключите шесть светодиодов, с резисторами 220 Ом в последовательности, к цифровым пинам 2-7 на вашей плате.
Код
Код ниже начинает с использования цикла for() для определения цифровых пинов с 2 по 7 в качестве выходов для используемых 6 светодиодов.
В основном цикле кода используются два цикла for(), чтобы последовательно перебирать светодиоды, по одному, начиная с пина 2 и заканчивая пином 7. Как только пин 7 включается, процесс разворачивается, и светодиоды поочередно выключаются, двигаясь в обратном направлении от пина 7 к пину 2.
/*
Итерация с использованием цикла For
Демонстрирует использование цикла for().
Зажигает несколько светодиодов последовательно, а затем в обратном порядке.
Создано в 2006 году
Дэвидом А. Меллисом
Изменено 30 августа 2011 года
Томом Айго
https://www.arduino.cc/built-in-examples/ForLoopIteration
*/
int timer = 100; // Чем выше число, тем медленнее тайминг.
void setup() {
// Используем цикл for для инициализации каждого пина как выхода:
for (byte thisPin = 2; thisPin < 8; thisPin++) {
pinMode(thisPin, OUTPUT);
}
}
void loop() {
// Цикл от самого низкого пина к самому высокому:
for (byte thisPin = 2; thisPin < 8; thisPin++) {
// Включаем пин:
digitalWrite(thisPin, HIGH);
delay(timer);
// Выключаем пин:
digitalWrite(thisPin, LOW);
}
// Цикл от самого высокого пина к самому низкому:
for (byte thisPin = 7; thisPin >= 2; thisPin--) {
// Включаем пин:
digitalWrite(thisPin, HIGH);
delay(timer);
// Выключаем пин:
digitalWrite(thisPin, LOW);
}
}
Вариация с использованием массива
Этот пример показывает, как можно включить последовательность пинов, номера которых не обязательно идут подряд. Для этого можно поместить номера пинов в массив, а затем использовать циклы for для итерации по массиву.
В этом примере используются 6 светодиодов, подключенных к пинам 2-7 на плате с использованием резисторов 220 Ом, так же, как и в случае с циклом For Loop. Однако здесь порядок светодиодов определяется их порядком в массиве, а не их физическим порядком.
Этот способ помещения номеров пинов в массив очень удобен. Вам не нужно иметь пины последовательно друг за другом или даже в том же порядке. Вы можете переставлять их в любом порядке, который вам нужен.
int timer = 100; // Чем выше число, тем медленнее тайминг.
byte ledPins[] = { 2, 7, 4, 6, 5, 3}; // массив номеров пинов, к которым подключены светодиоды
byte pinCount = 6; // количество пинов (длина массива)
void setup() {
// элементы массива нумеруются от 0 до (pinCount - 1).
// используйте цикл for для инициализации каждого пина как выход:
for (byte pinIndex = 0; pinIndex < pinCount; pinIndex++) {
pinMode(ledPins[pinIndex], OUTPUT);
}
}
void loop() {
// цикл от самого низкого пина к самому высокому:
for (byte pinIndex = 0; pinIndex < pinCount; pinIndex++) {
// включаем пин:
digitalWrite(ledPins[pinIndex], HIGH);
delay(timer);
// выключаем пин:
digitalWrite(ledPins[pinIndex], LOW);
}
// цикл от самого высокого пина к самому низкому:
for (byte pinIndex = pinCount - 1; pinIndex >= 0; pinIndex--) {
// включаем пин:
digitalWrite(ledPins[pinIndex], HIGH);
delay(timer);
// выключаем пин:
digitalWrite(ledPins[pinIndex], LOW);
}
}