Arduino uno програма для створення біжать вогнів. Ті, що біжать поворотники на стрічці WS2812 і Arduino. Пояснення до коду

оголошується зміннаtimer . Це ціле число, з ім'ямtimer , І цей рядок встановлює це число рівним 200. Як ви могли помітити, більшість рядків програм Arduino закінчуються крапкою з комою. При написанні і зміні власних скетчів Arduino не забувати про точці з коми, оскільки рядок без такого знака викличе помилку компіляції.

void setup () (
// use a for loop to initialize each pin as an output:
< 8; thisPin++) {
pinMode (thisPin, OUTPUT);
}
}

процедура setup (Налаштування) конфигурирует контакти плати з 3 по 7 як виходи з використанням циклу for, який являє собою спеціальний цикл, який кілька разів повторює невелику частину коду на основі умови, використовуючи лічильник збільшень. Умова перевіряється кожен раз коли повторюється цикл. Цикл продовжить виконання коду всередині нього до тих пір, поки умова істинна. спочатку зміннаthisPin встановлена \u200b\u200bв 3, умова полягає в тому, що цей номерPin повинен бути менше 8, а лічильник збільшень збільшує це значення змінноїPin при кожному повторенні циклу (thisPin ++ - це те ж саме, що іthisPin \u003d thisPin + 1 ). Отже, на першому проходженні Уїклі, контакт з номером 3 встановлюється в режим виходу. У другій прохід вже контакт 4 конфигурируется на вихід. І так далі, поки thisPin не стане рівним 8, після чого умоваthisPin< 8 стане хибним і код припинить цикл, продовжуючи роботу з іншою частиною програми. Це може здатися занадто складним способом зробити просту річ, але програмісти люблять ефективність! Ви можете так само легко конфігурувати контактів наступним чином, так би мовити "в лоб":

void setup () (
// initialize each pin as an output:
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
}

Ви можете помітити, що, як правило, при програмуванні для Arduino одну і ту ж задачу можна вирішити різними способами. Кодування схоже на створення речей у вашій майстерні: ви, як правило, використовуєте будь-які інструменти, які у вас є. Тому давайте використовувати цикл
for для чогось веселого ... анімації!

Void loop () (

// loop from the lowest pin to the highest:
for (int thisPin \u003d 3; thisPin< 8; thisPin++) {
// turn the pin on:
digitalWrite (thisPin, HIGH);
delay (timer);
// turn the pin off:
digitalWrite (thisPin, LOW);
}

Цикл починається з того ж самого оператора, що і раніше, при збільшенні від меншого числа до більшого. всередині циклу
for код включає світлодіод на контактіPin , Зупиняється на 200 мс (Ми ч вами раніше привласнили це число змінноїtimer ), Потім код вимикає цей світлодіод. Далі цикл повторюється, але вже з наступним світлодіодом

// loop from the highest pin to the lowest:
for (int thisPin \u003d 7; thisPin\u003e \u003d 3; thisPin--) (
// turn the pin on:
digitalWrite (thisPin, HIGH);
delay (timer);
// turn the pin off:
digitalWrite (thisPin, LOW);
}
}

Наступна частина коду - ще один цикл, але він починається з контакту плати з найбільшим номером і використовує
thisPin-- (Так званий Декрімент, зменшення на одиницю), що рівносильно висловомthisPin \u003d thisPin-1 . Можна писати і так, і так, алеthisPin-- коротше і ефективніше. Програма виходить з цього циклу колиthisPin стає менше 3 (умова> = 3 , Більше або дорівнює трьом, тобто 2). Кінцева закриває фігурна дужка закриває основний (головний, великий) цикл. Таким чином, ця програма підсвічує кожен світлодіод по порядку, потім змінює порядок на протилежний і знову запалює світлодіоди.

Сказав в минулому ще році «Гоп» - прийшла пора стрибати :)
Вірніше, робити обіцяний огляд біжать поворотников.
Було замовлено 1 метр чорної стрічки WS2812B (144 світлодіода) в силіконової трубці, при замовленні вибирав «Black 1m 144led IP67» (можливо, комусь сподобається білий колір підкладки, такий вибір є).

невелике застереження

Мені прийшла стрічка, спаяна з двох півметровій шматків. Мінус цього - вразливе місце спайки (згодом можуть порушитися контакти) і збільшений зазор між світлодіодами.
Перед покупкою уточнюйте у продавця цей момент

До стрічці були припаяні з двох сторін контактні дроти для послідовного з'єднання декількох шматків, тому що мені це не потрібно, то з одного боку проводу Відпаяв, все загерметизований нейтральним герметиком і ще трохи чорної ізоляційної стрічки намотав.



Кріпив до скла за допомогою двосторонньої прозорої клейкої стрічки, наприклад,.

подробиці установки

Знежирив поверхні, спочатку приклеїв клейку стрічку до трубки (буду так називати, хоч перетин і прямокутне), зрізав виступають надлишки більш широкої стрічки, просунув краю трубки в щілини між стелею і верхніми частинами декоративних панелей задніх стійок (контактні проводи з роз'ємом сховав за однією панеллю ), відцентрувати і став притискати до скла, потихеньку витягаючи захисний шар стрічки.
Відео, на жаль, немає - вільних рук для зйомки не було, та й машини у всіх різні.
Якщо що незрозуміло - питайте в коментарях.
Перевірка літньою спекою пройшла успішно - нічого не відклеїлося і не попливло.
Єдиний мінус - кут нахилу скла пологий, світлодіоди світять більше вгору. У сонячний день погано видно, але так як це дублюючі сигнали, то

Тепер переходимо до електронної начинки.
Я використовував, але не так давно відкрив для себе

Приблизно за ту ж вартість отримуємо більше булочок

Скетч без особливих переробок буде працювати і на Wemos при програмуванні в середовищі Arduino IDE, а якщо реалізувати невеликий web-сервер, то при підключенні до нього по Wi-Fi можна змінювати значення таких змінних, як час затримки між миготіння, величина уповільнення при екстреному гальмуванні і т.д.
Тут надалі, якщо у когось з'явиться зацікавленість в реалізації проекту на ESP8266, можу викласти приклад для зміни налаштувань через web-інтерфейс, збереження їх в EEPROM, подальшого читання.
Запуск web-сервера можна реалізувати, наприклад, через включений поворотник і натиснення педалі гальма при включенні запалювання (в процедурі setup опитати стан відповідних входів).

Для реалізації миготливого режиму при різкому гальмуванні був куплений
У скетчі відстежується рівень уповільнення при натисканні педалі гальма, якщо він перевищує 0,5G (різке уповільнення, але без вереску гальм), то для залучення додаткової уваги на кілька секунд включається миготливий режим.
Керуючі сигнали на входи Arduino з «плюса» стопів, поворотников і заднього ходу подаються через гальванічні розв'язки - оптопари з обмежуючими ток резисторами, які в підсумку формують рівень LOW на входах Arduino (постійно притягнуті до плюса через резистори 10кОм).
Харчування - 5 вольт через понижуючий перетворювач DC-DC.
Все це справа складено бутербродом і упаковано в підходящу коробочку, на якій стрілочкою зазначив напрямок монтажу для правильної орієнтації датчика гравітації

Схема і фото



Номінал підтягують (до плюса) резисторів стандартний - 10 кОм, що обмежують струм оптопари резисторів - 1кОм. Оптопари випаяв зі старих плат, дві попалися PC123, дві - PC817.


На першому фото можна побачити два додаткових виведення, їх я зробив для поворотников. Так як в моєму автомобілі при включенні підрульового важеля відбувається замикання на масу, то підключив дроти до колодки важеля і входів Arduino. Якщо підрульовий важіль комутує плюс або берете сигнал з "+" лампочок лівого / правого поворотника, то підключаєте їх через гальванічну розв'язку.



Ну і тепер сам скетч (Arduino IDE)

#include #include // кілька загальних коментарів // я відключив по одному крайньому светодиоду, тому що вони відсвічували на декоративні панелі стійок // видно на прикладі цього циклу for (int i \u003d 1; i<143; i++) //если отключать не нужно, заменяем на for (int i=0; i<144; i++) //задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников //поворотники и стоп-сигнал одновременно не включаются, чтобы это реализовать, нужно переписывать соответствующий код скетча (делить ленту на три секции, подбирать тайминги миганий, менять диапазон переменных циклов). //Дерзайте - все в ваших руках // Пин для подключения управляющего сигнала светодной ленты const int PinLS = 2; //Пины для подключения датчиков //если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных const int buttonPinL = 3; const int buttonPinR = 4; const int buttonPinS = 6; const int buttonPinD = 5; //начальные статусы входов (подтянуты к плюсу) int buttonStateS = HIGH; int buttonStateD = HIGH; int buttonStateL = HIGH; int buttonStateR = HIGH; // пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника // такое может быть, если используется меньше половины светодиодов // в моем случае паузы нет (pause_pov1 = 0) int pause_pov1 = 1; // этой паузой регулируем длительность состояния, когда все светодиоды выключены //я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки) int pause_pov2 = 62; // переменная для получения значения ускорения int ix; Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PinLS, NEO_GRB + NEO_KHZ800); Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); void setup() { pinMode(buttonPinS, INPUT); pinMode(buttonPinD, INPUT); pinMode(buttonPinL, INPUT); pinMode(buttonPinR, INPUT); strip.begin(); // гасим ленту for (int i=0; i<144; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); accel.begin(); // ограничиваем измеряемый диапазон четырьмя G (этого хватит с большим запасом) accel.setRange(ADXL345_RANGE_4_G); accel.setDataRate(ADXL345_DATARATE_100_HZ); } void loop() { // СТОПЫ: если включены - высший приоритет //Чтобы сделать меняющуюся по ширине полоску в зависимости от интенсивности торможения //(уточнение - никакой светомузыки, ширина полосы после нажатия на тормоз не меняется!) //от плавного торможения до тапки в пол. //Добавляем еще одну переменную, например, ix2, //присваиваем ей значение ix с коэффициентом умножения, //заодно инвертируем и округляем до целого //ix = event.acceleration.x; //ix2 = -round(ix*10); //ограничиваем для плавного торможения в пробках //(чтобы не менялась при каждом продвижении на 5 метров) //if (ix2<10) ix2 = 0; //и для резкого торможения. //Реальный диапазон изменения переменной ix - от 0 до -5 //для максимальной ширины полосы при G равном или большем 0.5 //if (ix2 >50) ix2 \u003d 50; // потім міняємо цикли в блоці СТОП for (int i \u003d 1; i<143; i++) на for (int i=51-ix2; i<93+ix2; i++) //Получаем минимальную ширину полоски ~30 см (для стояния в пробке) и максимальную для резкого торможения //конец комментария buttonStateS = digitalRead(buttonPinS); if (buttonStateS == LOW) { sensors_event_t event; accel.getEvent(&event); ix = event.acceleration.x; // проверка резкого торможения - мигающий режим // значение 5 - это 0,5G, минус - торможение if (ix < -5) { for (int is=0; is<15; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(240,0,0)); strip.show(); delay(10 + is*10); for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(0,0,0)); strip.show(); delay(10 + is*3); buttonStateS = digitalRead(buttonPinS); if (buttonStateS == HIGH) return; } } // помигали - и хватит, включаем постоянный режим, если педаль тормоза еще нажата // или если не было резкого торможения и предыдущее условие не сработало if (buttonStateS == LOW) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(200,0,0)); strip.show(); while(buttonStateS == LOW){ buttonStateS = digitalRead(buttonPinS); delay(50); } // плавно гасим for (int is=0; is<20; is++) { for (int i=1; i<143; i++) strip.setPixelColor(i, strip.Color(190 - is*10,0,0)); strip.show(); delay(10); } // СТОПЫ конец } } else // если СТОПЫ выключены { // ЗАДНИЙ ХОД: если включен - средний приоритет buttonStateD = digitalRead(buttonPinD); if (buttonStateD == LOW) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(63,63,63)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(63,63,63)); strip.show(); while(buttonStateD == LOW){ buttonStateD = digitalRead(buttonPinD); delay(50); } //плавно гасим for (int is=0; is<16; is++) { for (int i=1; i<37; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); for (int i=107; i<143; i++) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4)); strip.show(); delay(10); } } buttonStateL = digitalRead(buttonPinL); buttonStateR = digitalRead(buttonPinR); // если включена аварийка if (buttonStateL == LOW && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(63,31,0)); strip.setPixelColor(il+72, strip.Color(63,31,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ЛЕВЫЙ ПОВОРОТНИК if (buttonStateL == LOW && buttonStateR == HIGH) { for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(il+72, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } // если включен ПРАВЫЙ ПОВОРОТНИК if (buttonStateL == HIGH && buttonStateR == LOW) { for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(220,120,0)); strip.show(); delay(pause_pov1); } for (int il=0; il<71; il++) { strip.setPixelColor(71-il, strip.Color(0,0,0)); strip.show(); delay(pause_pov1); } delay(pause_pov2); } //правый поворотник конец } //конец условия else Стоп // задержка для следующего опроса датчиков delay(10); }

Постарався по максимуму його прокоментувати, але якщо будуть питання, постараюся додавати коментарі (тому маю його в тексті огляду, а не прикладеним файлом). Це, до речі, стосується і інших пунктів огляду - також буду його доповнювати, якщо в коментарях будуть суттєві питання.

І наостанок демонстрація роботи (для відео використовував скетч з демо-режимом).

Upd. Скетч з демо-режимом зробив спеціально, щоб в одне коротке відео вмістити все.
Стоп-сигнал блимає тільки при різкому гальмуванні (про це писалося вище), при плавному і стоянні в пробках просто горить, не дратуючи водіїв ззаду.
Яскравість в темну пору доби не надмірна, тому що светики через нахилу скла спрямовані більше вгору, ніж назад.
Штатні ліхтарі працюють як зазвичай, ця смуга їх дублює.

Планую купити +95 Додати в обране огляд сподобався +89 +191

Давайте ще трохи поморгай світлодіодами. Давайте створимо з Вашої Arduino лінійку світлодіодів, Морган зліва направо і справа наліво, і використовуючи не один, а вісім штук. Змусимо моргати світлодіоди в нескінченному циклі послідовності 1-2-3-4-5-6-7-8-7-6-5-4-3-2-1-2-3 - ... з затримкою в одну секунду.
Вам знадобиться:

  • Ваші стандартні настройки Arduino (комп'ютер, кабель, Uno або сумісний)
  • 8 світлодіодів.
  • 8 резисторів 360 Ом 0,25 Вт. Резистори необхідні для обмеження струму світлодіодів.
  • Макетна плата і з'єднувального проводу
Пропоную зробити затримку змінної. Так що ви могли легко змінити її .
У вихідному проекті «миготливий світлодіод», описаний в книзі Массімо Банц, використовувався цифровий висновок 13. На цей раз, ви можете використовувати цифрові контакти з 2 до 9. Апаратна сторона проста - підключіть провід від кожного цифрового контакту до анода світлодіода, перш ніж підключати з'єднувальним проводом резистор 360 Ом резистор і далі катод світлодіода на землю. Див. Схему нижче:

Тепер ваше завдання - написати код! Але перш ніж зробити це, треба написати план роботи або алгоритм. Наприклад, для цієї вправи ви могли б написати щось на кшталт ...

0.1 алгоритм роботи програми.
Встановлюємо, що всі контакти ми будемо використовувати як виходи Створюємо змінну для зберігання певну затримку в мілісекундах Починаємо нескінченно повторюваний цикл включити контакт 2, чекати встановлений час затримки, вимкнути його включити контакт 3, чекати встановлений час затримки, вимкнути його Повторіть ці операції для інших виходів - з 4 до 9 Потім зробіть те ж саме, але в зворотному напрямку до контакту 3 Закінчення нескінченного циклу Що вийшло у Вас? Ні чого страшного немає, якщо у вас ні чого не вийшло. Так як Ви вчитеся. Але щоб заощадити ваш час нижче наведений код для даної схеми.

int del \u003d 100; // sets a default delay time, 100 milliseconds (one tenth of a second)
void setup ()
{
// initialize the digital pins as outputs:
// later on there will be easier ways to do this
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
}
// the loop () method repeats indefinitely until you turn off the power
void loop ()
{
digitalWrite (2, HIGH); // turn on LED on pin 2
delay (del); // wait (length determined by value of "del")
digitalWrite (2, LOW); // turn it off

delay (del); // wait


delay (del); // wait


delay (del); // wait


delay (del); // wait


delay (del); // wait


delay (del); // wait

digitalWrite (9, HIGH); // turn on LED on pin 9
delay (del); // wait
digitalWrite (9, LOW); // turn it off
digitalWrite (8, HIGH); // turn on LED on pin 8
delay (del); // wait
digitalWrite (8, LOW); // turn it off
digitalWrite (7, HIGH); // turn on LED on pin 7
delay (del); // wait
digitalWrite (7, LOW); // turn it off
digitalWrite (6, HIGH); // turn on LED on pin 6
delay (del); // wait
digitalWrite (6, LOW); // turn it off
digitalWrite (5, HIGH); // turn on LED on pin 5
delay (del); // wait
digitalWrite (5, LOW); // turn it off
digitalWrite (4, HIGH); // turn on LED on pin 4
delay (del); // wait
digitalWrite (4, LOW); // turn it off
digitalWrite (3, HIGH); // turn on LED on pin 3
delay (del); // wait
digitalWrite (3, LOW); // turn it off

У цьому уроці ми продовжимо роботу зі світлодіодами, але кількість світлодіодів збільшимо до 5. І зробимо ефект біжить вогню. Для управління світлодіодами будемо використовувати маніпуляції з портами Arduino. Ми будемо напряму записувати дані в порти Arduino. Це краще, ніж працювати з конкретними входами / виходами контролера. Це дозволить встановити значення для світлодіодів за допомогою однієї лише операції.

У Arduino UNO є 3 порту:
B (цифрові входу / виходу з 8 по 13)
C (аналогові входу)
D (цифрові входу / виходу з 0 по 7)

Кожен порт управляється 3 регістрами. регістр DDR визначає ніж буде нога (pin) входом або виходом. За допомогою регістра PORT можна встановити pin в стан HIGH або LOW. За допомогою регістра PIN можна вважати стан ніжок Arduino, коли вони працюють на вхід.

Ми будемо використовувати порт B. Спочатку, ми повинні встановити всі ніжки порту B як цифрові виходу. У порту B є тільки 6 ніжок. Біти регістра для В-порту DDRB повинні бути встановлені в 1, якщо нога буде використовуватися як вихід (OUTPUT), і в 0, якщо нога буде використовувати як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не завжди містять всі 8 ніг. приклад:
DDRB \u003d B00111110; // встановити ніжки порту В з 1 по 5 як виходу, а 0 як вхід.

Зверніть увагу, що в мікроконтролерах фірми Microchip все навпаки. 0 біт - нога працює як вихід, а 1 - як вхід.

У нашому проекті біжить вогню ми будемо використовувати 5 виходів:
DDRB \u003d B00011111; // встановити ноги порту В з 0 по 4 як виходу

Для запису значень в порт В необхідно використовувати регістр PORTB. Запалити перший світлодіод можна командою:
PORTB \u003d B00000001;
перший і четвертий:
PORTB \u003d B00001001;

Тепер ви бачите, як легко ми можемо включати і вимикати світлодіоди. Тепер розповімо вам про операторів зсуву

Є 2 оператора двійкового зсуву: оператор зсуву вліво<< и оператор сдвига вправо >\u003e. Оператор зсуву вліво<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >\u003e Зрушує біти вправо.

приклад:
varA \u003d 1; // 00000001
varA \u003d 1<< 0; // 00000001
varA \u003d 1<< 1; // 00000010
varA \u003d 1<< 2; // 00000100

Тепер повернемося до нашої програми, яка показана нижче. Нам потрібно ввести 2 змінні: перша upDown буде містити значення куди рухатися - вгору або вниз, а друга cylon які світлодіоди запалювати.

У функції setup () ми визначаємо які ніжки повинні працювати як виходу.

У головному циклі програми loop (), світлодіоди по черзі спалахують вгору шляхом збільшення змінної cylon, а коли доходить до самого верхнього, то змінної upDown присвоюється 0 і світлодіоди спалахують вниз по черзі.

/ * Той, що біжить вогонь. 5 світлодіодів * / unsigned char upDown \u003d 1; // починаємо з руху вгору unsigned char cylon \u003d 0; // визначає черговість LED void setup () (DDRB \u003d B00011111; // встановлюємо порт B з 0 по 4 як виходу) void loop () (if (upDown \u003d\u003d 1) (// якщо йдемо вгору, то cylon ++; if ( cylon\u003e \u003d 4) upDown \u003d 0; // коли досягнутий найбільший номер LED, то у слід. циклі йдемо вниз) else (cylon--; if (cylon \u003d\u003d 0) upDown \u003d 1; // коли досягнуть найменший номер LED, то в слід. циклі йдемо вгору) PORTB \u003d 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

Принципова схема

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

Зверніть увагу

    Зверніть увагу, що в даному експерименті резистори встановлені між катодом і землею на відміну від експерименту пульсар.

    Ми підключаємо світлодіоди до цифрових портів, починаючи з порту 2. Ми можемо використовувати порти 0 і 1, але вони є каналами передачі даних послідовного порту і для кожної перепрошивки плати доведеться відключати пристрої, підключені до них.

скетч

Тип даних unsigned int використовують для зберігання цілих чисел без знака, тобто тільки невід'ємних. За рахунок зайвого біта, який тепер не використовується для зберігання знака, ми можемо зберігати в змінної такого типу значення до 65 535.

За допомогою виразу (ms / 120)% 10 ми визначаємо, який з 10 світлодіодів повинен горіти зараз. Перефразовуючи, ми визначаємо який відрізок довжиною в 120 мс йде зараз і який його номер всередині поточного десятка. Ми додаємо порядковий номер відрізка до номера того порту, який в поточному наборі виступає першим.

Те, що ми гасимо світлодіод за допомогою digitalWrite (pin, LOW) всього через 10 мс після включення не помітно оку, тому що дуже скоро буде знову обчислено, який з світлодіодів включати, і він буде включений - тільки що погашений або наступний.

Питання для перевірки себе

    Чому в даному експерименті ми підключаємо світлодіодну шкалу, не використовуючи транзистор?

    Якби ми включали світлодіоди тільки на портах 5, 6, 7, 8, 9, що потрібно було б змінити в програмі?

    За допомогою якої іншої інструкції можна виконати дію, еквівалентну ++ pin?

    У чому різниця між змінними типів int і unsigned int?

    Що повертає функція millis ()?

    Як в даному експерименті ми обчислюємо номер порту, на якому потрібно включити світлодіод?