Біжучі вогні на світлодіодах

Способи підключення світлодіодів, біжучих вогнів, світлодіодних панелей та індикаторів, гирдлянди, світлодіодні стрічки та керування ними. Дисплеї та цифрові сегментні індикатори
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Біжучі вогні на світлодіодах

Повідомлення Arduino » 25 травня 2017 18:05

В цьомуприкладі ми складаємо схему, що послідовно перемикає світлодіоди створюючи ефект біжучого вогника. Схема може бути складена із звичайних світлодіодів.
Перед сскладанням необхідно зазначити, що резистори встановлені між катодом і землею на відміну від експерименту "пульсар" з наростаючою яскравістю .
Ми підключаємо світлодіоди до цифрових портів, починаючи з порту 2. Порти 0 і 1 є каналами передачі даних послідовного порту і для кожної перепрошивки плати доведеться відключати пристрої, підключені до них. Вони в звичайних схемах зарезервовані для обміну даними.
begushijogonek1.jpg

Код програми для біжучіх вогнів

// світлодіодна шкала підключена до групи пинов розташованих
// поспіль. Даємо зрозумілі імена першому і останньому пінам
#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 ) ;
}


Тлумачення команд скетчу

Пояснення до коду
  • За допомогою виразу forми організуємо цикл з лічильником . В даному випадку для налаштування портів на вихід. Щоб зробити такий цикл, потрібно:
    • Ініціалізувати змінну-лічильник, присвоївши їй початкове значення. У нашому випадку:int pin = FIRST_LED_PIN
    • Вказати умова, до досягнення якого буде повторюватися цикл. У нашому випадку:pin <= LAST_LED_PIN
    • Визначити правило, за яким буде змінюватися лічильник. У нашому випадку ++pin(див. Нижче про оператора ++).
  • Наприклад, можна зробити цикл for (int i = 10; i > 0; i = i - 1). В цьому випадку:
    • Змінної iприсвоюється значення 10
    • Це значення задовольняє умові i > 0 Тому блок коду, поміщений в цикл, виконується перший раз
    • Значення iзменшується на одиницю, згідно заданому правилу, і приймає значення 9
    • Блок коду виконується вдруге.
    • Все повторюється знову і знову аж до значення iрівного 0
    • Коли iстане дорівнює 0, умова i > 0не виконається, і виконання циклу закінчиться
    • Контролер перейде до коду, наступного за циклом for
  • Розміщуйте код, який потрібно зробити в циклі, між парою фігурних дужок {}, якщо в ньому більше однієї інструкції.
  • Змінна-лічильник, оголошується в операторі for, може використовуватися всередині циклу. Наприклад, в даному експерименті pinпослідовно приймає значення від 2 до 11 і, будучи переданою в pinMode, дозволяє налаштувати 10 портів одним рядком, що вміщений в цикл.
  • Змінні-лічильники видно тільки всередині циклу. Тобто якщо звернутися до pin до чи після циклу, компілятор видасть помилку про неоголошення змінної.
  • Конструкція i = i - 1в поясненні вище не є рівнянням! Ми використовуємо оператор присвоювання =для того, щоб в змінну iпомістити значення, рівне поточного значення i, зменшеному на 1.
  • Вираз ++pin- це т.зв. оператор інкремента , застосований до змінної pin. Ця інструкція дасть той же результат, що pin = pin + 1
  • Аналогічно Інкремент працює оператор декремента -- , що зменшує значення на одиницю. Детальніше про це в статті про арифметичні операції .
  • Тип даних unsigned intвикористовують для зберігання цілих чисел без знака, тобто тільки невід'ємних . За рахунок зайвого біта, який тепер не використовується для зберігання знака, ми можемо зберігати в змінної такого типу значення до 65 535.
  • Функція millisповертає кількість мілісекунд, що пройшли з моменту включення або перезавантаження мікроконтролера. Тут ми використовуємо її для відліку часу між перемиканнями світлодіодів.
  • За допомогою виразу (ms / 120) % 10ми визначаємо, який з 10 світлодіодів повинен горіти зараз. Перефразовуючи, ми визначаємо який відрізок довжиною в 120 мс йде зараз і який його номер всередині поточного десятка. Ми додаємо порядковий номер відрізка до номера того порту, який в поточному наборі виступає першим.
  • Те, що ми гасимо світлодіод за допомогою digitalWrite(pin, LOW)всього через 10 мс після включення не помітно оку, тому що дуже скоро буде знову обчислено, який з світлодіодів включати, і він буде включений - тільки що погашений або наступний.

Art
Повідомлень: 1
З нами з: 15 грудня 2021 09:29

Біжучі вогні на світлодіодах

Повідомлення Art » 15 грудня 2021 09:33

8-) Найкращу біжучу строку можна замовити ось тут -> https://arduinka.biz.ua/index.php?route ... earch=2812

Відповісти

Повернутись до “Індикація та LED, дисплеї”