Содержание

Эксперимент 7. Бегущий огонёк

← Пульсар | Оглавление | Мерзкое пианино →

В этом эксперименте мы заставляем огонёк бежать по светодиодной шкале.

Список деталей для эксперимента

Принципиальная схема

Схема на макетке

Обратите внимание

Скетч

p070_running_bar.ino
// светодиодная шкала подключена к группе пинов расположенных
// подряд. Даём понятные имена первому и последнему пинам
#define FIRST_LED_PIN  2
#define LAST_LED_PIN   11
 
void setup()
{
  // в шкале 10 светодиодов. Мы бы могли написать pinMode 10
  // раз: для каждого из пинов, но это бы раздуло код и
  // сделало его изменение более проблематичным.
  // Поэтому лучше воспользоваться циклом. Мы выполняем
  // pinMode для (англ. for) каждого пина (переменная pin)
  // от первого (= FIRST_LED_PIN) до последнего включительно
  // (<= LAST_LED_PIN), всякий раз продвигаясь к следующему
  // (++pin увеличивает значение pin на единицу)
  // Так все пины от 2-го по 11-й друг за другом станут выходами
  for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
    pinMode(pin, OUTPUT);
}
 
void loop()
{
  // получаем время в миллисекундах, прошедшее с момента
  // включения микроконтроллера
  unsigned int ms = millis();
  // нехитрой арифметикой вычисляем, какой светодиод
  // должен гореть именно сейчас. Смена будет происходить
  // каждые 120 миллисекунд. Y % X — это остаток от
  // деления Y на X; плюс, минус, скобки — как в алгебре.
  int pin = FIRST_LED_PIN + (ms / 120) % 10;
  // включаем нужный светодиод на 10 миллисекунд, затем —
  // выключаем. На следующем проходе цикла он снова включится,
  // если гореть его черёд, и мы вообще не заметим отключения
  digitalWrite(pin, HIGH);
  delay(10);
  digitalWrite(pin, LOW);
}

Пояснения к коду

Вопросы для проверки себя

  1. Почему в данном эксперименте мы подключаем светодиодную шкалу, не используя транзистор?
  2. Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе?
  3. С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin?
  4. В чем разница между переменными типов int и unsigned int?
  5. Что возвращает функция millis()?
  6. Как в данном эксперименте мы вычисляем номер порта, на котором нужно включить светодиод?

Задания для самостоятельного решения

  1. Измените код так, чтобы светодиоды переключались раз в секунду.
  2. Не выключая порты, сделайте так, чтобы огонёк бежал только по средним четырем делениям шкалы.
  3. Переделайте программу так, чтобы вместо int pin = FIRST_LED_PIN + (ms / 120) % 10 перемещением огонька управлял цикл for
  4. Не меняя местами провода, измените программу так, чтобы огонёк бегал в обратном направлении.

← Пульсар | Оглавление | Мерзкое пианино →