Урок 9 - Бегущие огни на Arduino UNO

.Урок 9 - Бегущие огни на Arduino UNO

Продолжаем уроки в которых мы используем Arduino, резисторы и светодиоды. Мы уже делали Светофор, полицейский стробоскоп, отправляли сигнал sos и пр.
Сегодня мы будем делать бегущие огни. Бегущие огни уже были в другом блоке уроков на Arduino: Урок 2 — Подключаем сдвиговый регистр 74НС595 к Arduino. «Бегущие» огни
При подключении к сдвиговому регистру всего при подключении по 3 проводам мы можем управлять 8 светодиодами. Но вот чтобы подключить 10 светодиодов, нужно подключать 2 сдвиговых регистра и использовать всего 2 выхода из 8 доступных в регистре. Это не очень логично. Иногда бывает проще подключить к плате Arduino нужное количество светодиодов. Что я и планирую сделать. В примере будет 5 самых простых режимов бегущих огней на Arduino.

Для урока нам понадобится:

  • Arduino UNO или Arduino Nano
  • Плата макетная беспаечная
  • Резисторы 220 ОМ
  • Соединительные провода папа-папа
  • Светодиоды 3 или 5 мм.

Для урока нам понадобится

Подключим наши 10 светодиоды вот по такой схеме.

Подключим наши 10 светодиоды вот по такой схеме



В живую будет выгладить так.

режимов бегущих огней на Arduino

Вы наверное скажите что схема не правильная и к пинам 0 и1 подключать не желательно. Вот именно не желательно, но можно если не использовать Serial port. А для облегчения кода нам будет очень удобно использовать данные пины. При загрузки кода в Ардуину светодиоды подключенные к 0 и 1 выходам будут мигать. Также при работе нашего скетча. Вместе с данными светодиодами на плате Arduino UNO буду включаться светодиода RX и TX. Но как я говорил в данном случаи ни чего старшного в этом нет.

Описывать все режимы не буду. В видео немного поясняю. Немного корява и может не совсем понятно. Но я думаю по комментариям к коду можно разобраться.

Первый пример бегущих огней на Arduino, последовательное включение одного светодиода с 1 по 10. По пинам на ардуино будет с 0 по 9. Это нужно учитывать при написании кода.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

Немного изменим данный пример и сделаем 2 цикла. Получим включение всех светодиодов и выключение в обратном направлении.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
  }
  for (int j = last_pin-1; j >= 0; j--) { //перебираем пины с 0 до last_pin
       digitalWrite(j, LOW); //гасим все светодиоды
    delay(300); //задержка 300мсек
  }
}

Объединив код первого и второго примера получим включение одного светодиода в прямом и обратном направлении. Во втором цикли ставим j-2, потому что у нас пины начинаются с 0, а число светодиодов с 1 до 10. Также чтобы 10 светодиод не включался 2 раза вычитаем еще 1.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
  for (int j = last_pin-2; j > 0; j--) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

Сходящиеся огни. Тут все по аналогии. Добавим переменную в которой будим рассчитывать половину светодиодов. Поэтому количество светодиодов должно быть четным. Либо что-то делать с центральным светодиодом. Можно оставить его постоянно включенным или наоборот всегда включенным.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом 
  for (int j = 0; j < half; j++) { //перебираем пины с 0 до last_pin
    int k = last_pin-j-1;
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    digitalWrite(k, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(k, LOW); //гасим все светодиоды
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

И по аналогии делаем расходящиеся огни.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом 
  for (int j = half; j > 0; j--) { //перебираем пины с 0 до last_pin
    int k = last_pin-j;
    digitalWrite(j-1, HIGH); //зажигание следующего светодиода
    digitalWrite(k, HIGH); //зажигание следующего светодиода
    delay(500); //задержка 300мсек
    digitalWrite(k, LOW); //гасим все светодиоды
    digitalWrite(j-1, LOW); //гасим все светодиоды
  }
}

Как видно без использования сдвигового регистра код получается намного проще и меньше строчек. Один минус количество ограничено. Максимум 20 светодиодов можно подключить к Arduino Uno и 22 к Arduino NANO. Думаете что я ошибся с цифрами. Подписывайтесь на канал. И в следующем уроке в данном блоке уроков я покажу как можно это реализовать.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Уроки Arduino: Светодиоды, Резисторы, Arduino Дата публикации 2 мая , 2019

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.

Максим
#7 Гость: Максим (17 сентября, 2020 в 21:48)

А как сделать,чтобы эти режимы переключались одной кнопкой поочерёдно?

Jiva
#6 Jiva (30 апреля, 2020 в 04:09)
да и еще сколько смогу подключить таких светодиодов? Это все хочу сделать на НАНО, но так как atmega328 сгорела поменял на atmega8
Jiva
#5 Jiva (30 апреля, 2020 в 04:01)
как сделать бегущие огни с rgb светодиодов,так чтобы в одну сторону загорался один цвет возвращался другой,и это все циклично  и с кнопками вкл. выкл
Жора Дорфман
#4 Гость: Жора Дорфман (9 апреля, 2020 в 15:27)

как организовать то же самое, но без делея, используя внешний тактовый генератор?

Дмитрий
#3 Гость: Дмитрий (14 июля, 2019 в 20:56)

Уроки классные! Понятные и очень информативные.

Владимир
#2 Гость: Владимир (18 мая, 2019 в 09:16)

Отличные уроки, многое почерпнул полезного для себя. Удачи тебе!

ЛехаЛ
#1 Гость: ЛехаЛ (12 мая, 2019 в 17:50)

Отличный урок. Сколько светодиодов можно подключить к одной ардуине. Спасибо.


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box