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