Сторінка 1 з 1

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

Додано: 25 травня 2017 18:05
Arduino
В цьомуприкладі ми складаємо схему, що послідовно перемикає світлодіоди створюючи ефект біжучого вогника. Схема може бути складена із звичайних світлодіодів.
Перед сскладанням необхідно зазначити, що резистори встановлені між катодом і землею на відміну від експерименту "пульсар" з наростаючою яскравістю .
Ми підключаємо світлодіоди до цифрових портів, починаючи з порту 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 мс після включення не помітно оку, тому що дуже скоро буде знову обчислено, який з світлодіодів включати, і він буде включений - тільки що погашений або наступний.

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

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