Arduino для початківців. Створюємо світло, що реагує на освітлення (Частина 4)

18 лютого 2025 1 хвилина Автор: Lady Liberty

Arduino відкриває безмежні можливості для творчості, і у цій четвертій частині нашого гайду ми навчимося створювати кольорову лампу, яка реагує на зміни освітлення. За допомогою RGB-світлодіода, фоторезисторів і функції широтно-імпульсної модуляції (PWM) ви зможете змішувати кольори світла та спостерігати, як воно плавно змінюється залежно від умов навколишнього середовища.

Лампа змішування кольорів

Використовуючи трикольорий світлодіод і трьох фоторезисторів, ви створите лампу, яка плавно зміняє кольори залежно від умов зовнішнього освітлення.

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

Arduino не може змінювати вихідну напругу на своїх контактах, він може видавати лише 5 В. Тому вам потрібно буде використовувати техніку під назвою широтно-імпульсна модуляція (ШІМ), щоб згаснути світлодіоди. ШІМ швидко перетворює вихідний висновок у високий і низький рівень протягом фіксованого періоду часу. Зміни відбуваються швидше, ніж може побачити людське око. Це схоже на те, як працюють фільми, швидко блимає кілька нерухомих зображень, щоб створити ілюзію руху.

Коли ви швидко обертаєте штифт HIGH і LOW, це виглядає так, ніби ви змінюєте напругу. Відсоток часу, протягом якого контакт є ВИСОКИМ за період, називається робочим циклом. Коли висновок ВИСОКИЙ протягом половини періоду та НИЗЬКИЙ протягом іншої половини, робочий цикл становить 50%. Нижчий робочий цикл дає вам більш тьмяний світлодіод, ніж більш високий робочий цикл.

Arduino Uno має шість контактів, відведених для ШІМ (цифрові контакти 3, 5, 6, 9, 10 і 11), їх можна ідентифікувати за знаком ~ поруч із їхнім номером на платі.

Для входу в цей проект ви використовуватимете фоторезистори (датчики, які змінюють свій опір залежно від кількості світла, що на них потрапляє, також відомі як фотоелементи або світлозалежні резистори). Якщо під’єднати один кінець резистора до Arduino, можна виміряти зміну опору, перевіривши напругу на контакті.

  1. Підключіть свою макетну плату, щоб мати живлення та заземлення з обох сторін, як і в попередніх проектах.

  2. Розмістіть три фоторезистори на макетній платі так, щоб вони перетинали центральний розділ від одного боку до іншого, як показано на мал. 1. Приєднайте один кінець кожного фоторезистора до джерела живлення. З іншого боку приєднайте до землі резистор на 10 кОм. Цей резистор включений послідовно з фоторезистором, і разом вони утворюють дільник напруги. Напруга в точці, де вони зустрічаються, пропорційна співвідношенню їхніх опорів відповідно до закону Ома (додаткову інформацію про закон Ома див. у Проекті 1). Оскільки опір фоторезистора змінюється, коли на нього потрапляє світло, напруга на цьому переході також змінюється. З тієї ж сторони, що й резистор, під’єднайте фоторезистори до контактів аналогового входу 0, 1 і 2 за допомогою з’єднувального дроту.

  3. Візьміть три кольорові гелі та покладіть по одному на кожен із фоторезисторів. Помістіть червоний гель на фоторезистор, підключений до A0, зелений – на фоторезистор, підключений до A1, і синій – на той, який підключений до A2. Кожен із цих фільтрів пропускає лише світло певної довжини хвилі до датчика, який він охоплює. Червоний фільтр пропускає тільки червоне світло, зелений фільтр пропускає тільки зелене світло, а синій фільтр пропускає тільки синє світло. Це дозволяє виявляти відносні рівні кольорів у світлі, яке потрапляє на датчики.

  4. Світлодіод з 4 ніжками є звичайним катодом RGB LED. Світлодіод має окремі червоні, зелені та сині елементи всередині та одну загальну землю (катод). Створюючи різницю напруги між катодом і напругою, що виходить із контактів ШІМ Arduino (які з’єднані з анодами через резистори на 220 Ом), ви призведете до того, що світлодіод згасне між трьома кольорами. Зверніть увагу на те, який найдовший контакт на світлодіоді, помістіть його на макетну плату та підключіть цей контакт до землі. Підключіть інші три контакти до цифрових контактів 9, 10 і 11 послідовно за допомогою резисторів на 220 Ом. Обов’язково під’єднайте кожен провід світлодіода до правильного контакту ШІМ, згідно з малюнком ліворуч.

Код

Корисні константи

Налаштуйте константи для контактів, які ви використовуєте для введення та виведення, щоб ви могли відстежувати, який датчик поєднується з яким кольором світлодіода. Використовуйте const int для типу даних.

  • Змінні для зберігання показань датчиків, а також рівня освітлення кожного світлодіода. Додайте змінні для вхідних значень датчиків і для вихідних значень, які ви використовуватимете для згасання світлодіода. Ви можете використовувати тип даних int для всіх змінних.

  • Налаштування напрямку цифрових контактів і налаштування послідовного порту. У setup() почніть послідовний зв’язок зі швидкістю 9600 біт/с. Як і в попередньому прикладі, ви будете використовувати це, щоб побачити значення датчиків у послідовному моніторі. Крім того, ви зможете побачити зіставлені значення, які використовуватимете для згасання світлодіода. Крім того, визначте світлодіодні контакти як виходи за допомогою pinMode().

  • Зчитування значення кожного датчика освітлення. У loop() читайте значення датчиків на A0, A1 і A2 за допомогою analogRead() і зберігайте значення у відповідних змінних. Додайте невелику затримку () між кожним analogRead(), оскільки АЦП займає мілісекунди, щоб виконати свою роботу.

  • Повідомити показання датчика в комп’ютер Роздрукуйте значення датчика в одному рядку. «\t» є еквівалентом натискання клавіші «tab» на клавіатурі.

const int greenLEDPin = 9;
const int redLEDPin = 11;
const int blueLEDPin = 10;
const int redSensorPin = A0;
const int greenSensorPin = A1;
const int blueSensorPin = A2;
int redValue = 0;
int greenValue = 0;
int blueValue = 0;
int redSensorValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;
void setup() {
 Serial.begin(9600);
 pinMode(greenLEDPin,OUTPUT);
 pinMode(redLEDPin,OUTPUT);
 pinMode(blueLEDPin,OUTPUT);
}
void loop() {
 redSensorValue = analogRead(redSensorPin);
 delay(5);
 greenSensorValue = analogRead(greenSensorPin);
 delay(5);
 blueSensorValue = analogRead(blueSensorPin);
 Serial.print(“Raw Sensor Values \t Red: “);
 Serial.print(redSensorValue);
 Serial.print(“\t Green: “);
 Serial.print(greenSensorValue);
 Serial.print(“\t Blue: “);
 Serial.println(blueSensorValue);

Перетворення показань датчика

Функція зміни яскравості світлодіода через ШІМ називається analogWrite(). Йому потрібні два аргументи: PIN-код для запису та значення від 0 до 255. Це друге число представляє робочий цикл, який Arduino виведе на вказаний висновок. Значення 255 постійно встановлюватиме висновок HIGH, роблячи підключений світлодіод настільки яскравим, наскільки це можливо. Значення 127 встановить висновок HIGH половину періоду, роблячи світлодіод тьмянішим. 0 встановлюватиме висновок LOW весь час, вимикаючи світлодіод. Щоб перетворити показання датчика зі значення 0-1023 на значення 0-255 для analogWrite(), розділіть показання датчика на 4.

Повідомте про розраховані рівні світлодіодного світла

Роздрукуйте нові зіставлені значення в окремому рядку.

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

Вимкніть світло в кімнаті, де ви перебуваєте, і подивіться, що станеться зі значеннями датчиків. За допомогою ліхтарика освітліть кожен із датчиків окремо та зверніть увагу, як змінюються значення на послідовному моніторі, а також помітьте, як змінюється колір світлодіода. Коли фоторезистори покриті гелем, вони реагують лише на світло певної довжини хвилі. Це дасть вам можливість змінювати кожен із кольорів незалежно.

redValue = redSensorValue/4;
 greenValue = greenSensorValue/4;
 blueValue = blueSensorValue/4;
 Serial.print(“Mapped Sensor Values \t Red: “);
 Serial.print(redValue);
 Serial.print(“\t Green: “);
 Serial.print(greenValue);
 Serial.print(“\t Blue: “);
 Serial.println(blueValue);
 analogWrite(redLEDPin, redValue);
 analogWrite(greenLEDPin, greenValue);
 analogWrite(blueLEDPin, blueValue);
}

Ви можете помітити, що вихідний сигнал фоторезистора не коливається від 0 до 1023. Це нормально для цього проекту, але для більш детального пояснення того, як відкалібрувати діапазон, який ви читаєте, див. Проект 6.

Ви, мабуть, помітите, що світлодіод згасає не лінійно. Коли яскравість світлодіода досягає половини яскравості, здається, він перестає ставати набагато яскравішим. Це тому, що наші очі не сприймають яскравість лінійно. Яскравість світла залежить не лише від рівня, який ви analogWrite(), але й від відстані світла від розсіювача, відстані вашого ока від світла та яскравості світла відносно іншого світла в кімнаті.

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

Світлодіод сам по собі досить акуратний, але це не дуже лампа. Однак існує кілька способів розсіяти світло, щоб зробити його схожим на традиційну лампу розжарювання. М’ячик для пінг-понгу з отвором, у який можна ковзати світлодіодом, стане гарним розсіювачем. Інші способи включають покриття світла напівпрозорим клеєм або шліфування поверхні світла. Незалежно від того, який шлях ви виберете, ви втратите принаймні трохи яскравості, коли він буде розсіяний, але це, мабуть, виглядатиме набагато краще.

Більше не обмежуючись лише вмиканням і вимиканням світла, тепер ви можете контролювати, наскільки яскравим чи тьмяним буде щось. analogWrite() — це функція, яка дозволяє вам змінювати робочий цикл компонентів ШІМ, підключених до контактів 3, 5, 6, 9, 10 або 11.

Інші статті по темі
Майстерня мікроконтролерівОсвіта
Читати далі
Arduino для початківців. Створюємо прості схеми з LED, кнопками та резисторами (Частина 2)
Ви дізнаєтеся, що таке електричний струм, напруга та опір, а також на практиці вивчите основи роботи з паралельним і послідовним з’єднанням компонентів.
213
Майстерня мікроконтролерівОсвіта
Читати далі
Arduino для початківців. Як зробити механічний індикатор настрою на Arduino за допомогою сервоприводу (Частина 5)
Ви дізнаєтесь, як працює сервопривід, як його підключити до Arduino за допомогою бібліотеки Servo, а також як використовувати потенціометр для керування положенням стрілки.
147
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.