#8Средний

Светодиодный эффект Knight Rider с регулируемой скоростью

4.5(60)
120 собрано
Светодиодный эффект Knight Rider с регулируемой скоростью
Свет бежит от одного края шести светодиодов к другому, разворачивается и бежит обратно. Поверни ручку потенциометра, и скорость этого бега сразу изменится: в одном крайнем положении свет почти летит, в другом медленно прогуливается. Здесь ты впервые пробуешь управлять живой анимацией одной ручкой.

Видео

Схема

Светодиодный эффект Knight Rider с регулируемой скоростью - Circuit

Исходный код

C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Светодиодный эффект Knight Rider с регулируемой скоростью
4// ─────────────────────────────────────────
5// Потенциометр задаёт скорость эффекта Knight Rider (огонёк туда и
6// обратно). A0 читается на каждом шаге, и его значение 0-1023 становится
7// временем задержки (мс).
8//
9// Пины:
10//   D2, D3, D4, D5, D6, D7 -> 6 светодиодов (по порядку)
11//   Каждый светодиод с резистором 330 ohm
12//   A0 -> Средний вывод потенциометра
13//   (крайние выводы к 5V и GND)
14
15int ledPins[] = {2, 3, 4, 5, 6, 7};   // Пины светодиодов в порядке зажигания
16int potValue;                         // Значение потенциометра = задержка (мс)
17
18void setup() {
19  // Все пины светодиодов как выходы
20  for(int i = 0; i < 6; i++) {
21    pinMode(ledPins[i], OUTPUT);
22  }
23}
24
25void loop() {
26  // Вперёд: от D2 до D7
27  for(int i = 0; i < 6; i++) {
28    potValue = analogRead(A0);        // Прочитать скорость (0-1023)
29    digitalWrite(ledPins[i], HIGH);
30    delay(potValue);                  // Ждать столько мс, каково значение потенциометра
31    digitalWrite(ledPins[i], LOW);
32  }
33
34  // Назад: от D6 до D3. Крайние светодиоды пропускаются, чтобы отскок выглядел плавно
35  for(int i = 4; i > 0; i--) {
36    potValue = analogRead(A0);
37    digitalWrite(ledPins[i], HIGH);
38    delay(potValue);
39    digitalWrite(ledPins[i], LOW);
40  }
41}
42

Частые вопросы

Чему этот проект учит по сравнению с предыдущими?

Он объединяет аналоговый вход (потенциометр) с циклом в двух направлениях: пока свет бегает туда-обратно, потенциометр читается на каждом шаге, и значение обновляется в момент паузы. Это основа изменения поведения в зависимости от значения датчика.

Показание колеблется. Как его стабилизировать?

Небольшие колебания аналоговых показаний — это нормально. Усреднение нескольких показаний или разбиение значения через `map()` на более крупные интервалы (например, по 10 миллисекунд) скрывает колебания.

Можно ли использовать вместо потенциометра другой датчик?

Да, можно использовать LDR, но сам по себе LDR не выдаёт напряжение. Собери делитель напряжения из LDR и постоянного резистора между 5 V и GND и подключи их среднюю точку к A0. Затем в коде через `map()` можно перевести измеряемый диапазон в нужный диапазон паузы.

Какой аналоговый пин использовать?

На Uno для аналогового чтения подходят все пины от A0 до A5. Проверь, что пин в коде совпадает с подключением в схеме; A4 и A5 используются ещё и для I2C, поэтому, если позже планируешь добавить дисплей, выбирай A0.