Нічник зі старої лампочки, на основі Arduino та WS2812. Завдання для самостійного вирішення

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

Зараз я навчаюсь на 4-му курсі БДУІР і коли нам повідомили, що курсовий проект із схемотехніки можна зробити не на папері, а на залізяку, мене осяяло: нічник, який так хотів у дитинстві, можна зробити самої. Причому зробити не просто об'єкт, який освітлюватиме кімнату в темний час доби, а пристрій, яким можна буде легко управляти під будь-який настрій. А чому б і ні? Я вирішила додати можливість змінювати кольори за допомогою рук: чим ближче рука підноситься до нічника, тим яскравіше горить один із квітів (RGB). А також хотілося б керувати нічником за допомогою пульта дистанційного керування.

Відразу зізнаюся, що ідею я підглянула на cxem.net. Якщо коротко, у цьому прикладі використовувалася RGB-матриця, яка керувалася за допомогою регістрів зсуву, та ультразвукові датчики відстані. Але я подумала, що матриця світить виключно в один бік, мені ж хотілося, щоб нічник світив на всі боки.

Обґрунтування елементів схеми


Я звернула увагу на мікроконтролери Arduino. UNO цілком підходящий варіант для мого задуму, по-перше тому що це найбільш популярна платформа і кількість пінів не надто велика, на відміну від Mega, по-друге, до неї можна підключити зовнішнє джерело живлення, в моєму випадку він 12В, на відміну від Nano , по-третє… ну думаю можна зупинитися на цих двох пунктах. Платформа користується величезною популярністю у всьому світі завдяки зручності та простоті мови програмування, а також відкритій архітектурі та програмному коду.

Більше детальну інформаціюпро цю плату можна легко знайти на просторах інтернету, так що не перевантажуватиму статтю.

Отже, основні вимоги до системи. Необхідні:
– датчики, які відстежуватимуть відстань до перешкоди для керування системою;
- Датчик для зчитування сигналів з пульта дистанційного керування;
- світлодіоди, які і забезпечуватимуть необхідну функціональність освітлення;
– керуючий блок, який керуватиме всією системою.

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

Найбільш популярні далекоміри на Наразіце Sharp GP2Y0A21YK та HC-SR04. Sharp GP2Y0A21YK - це інфрачервоний далекомір. Він оснащений ік-випромінювачем і ик-приймачем: перший є джерелом променя, відбиток якого ловить другий. При цьому ик-промені датчика для ока невидимі і за такої інтенсивності нешкідливі.

Порівняно з ультразвуковим датчиком HC-SR04, цей датчик має і переваги, і недоліки. До переваг можна віднести нейтральність і нешкідливість. А недоліки – менший радіус дії та залежність від зовнішніх перешкод, у тому числі – деяких типів освітлення.

Як датчики відстані для проекту використані ультразвукові далекоміри HC-SR04.
Принцип дії HC-SR04 ґрунтується на добре відомому явищі ехолокації. При використанні випромінювач формує акустичний сигнал, який відбившись від перешкоди, повертається до датчика і реєструється приймачем. Знаючи швидкість поширення ультразвуку в повітрі (приблизно 340м/с) і час запізнення між випромінюваним та прийнятим сигналом, легко розрахувати відстань до акустичної перешкоди.

Вхід TRIG підключається до будь-якого висновку мікроконтролера. На цей висновок потрібно подавати імпульсний цифровий сигналтривалістю 10 мкс. За сигналом на вході TRIG датчик надсилає пачку ультразвукових імпульсів. Після прийому відбитого сигналу датчик формує на виведенні ECHO імпульсний сигнал, тривалість якого пропорційно відстані до перешкоди.

Ік-датчик. Зрозуміло, з даного датчика зчитуватиметься і декодуватиметься сигнал, необхідний для дистанційного керування. TSOP18 відрізняються між собою лише за частотою. Для проекту вибрано датчик VS1838B TSOP1838.

В основі проекту лежала ідея про освітлення приміщення будь-яким кольором, це говорить про те, що знадобляться 3 основні кольори, з яких буде отримано освітлення: червоний, зелений, синій. Тому була обрана модель світлодіодів SMD 5050RGB, які чудово впораються з поставленим завданням.

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

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

У зв'язку з тим, що напруга на світлодіодах у «вимкненому» стані дорівнює 6В і необхідно регулювати живлення, що перевищує 5В, до схеми необхідно додати транзистори в ключовому режимі. Мій вибір ліг на модель BC547c.

Розглянемо коротко, для тих, хто призабув, принцип роботи n-p-n транзистора. Якщо напруга не подавати зовсім, а просто взяти і замкнути висновки бази та емітера нехай навіть і не накоротко, а через резистор у кілька Ом, вийде, що напруга база-емітер дорівнює нулю. Отже, немає й струму основи. Транзистор закритий, колекторний струм зневажливо малий, саме цей початковий струм. І тут кажуть, що транзистор перебуває у стані відсічення. Протилежний стан називається насичення: коли транзистор відкритий повністю, то далі відкриватися вже нікуди. При такому ступені відкриття опір ділянки колектор емітер настільки мало, що включати транзистор без навантаження в колекторному ланцюзі просто не можна, згорить моментально. При цьому залишкова напруга на колекторі може становити лише 0,3…0,5В.

Ці два стани – насичення та відсікання, використовуються в тому випадку, коли транзистор працює у ключовому режимі на кшталт звичайного контакту реле. Основний сенс такого режиму в тому, що малий струм бази управляє великим струмом колектора, який у кілька десятків разів більший за струм бази. Великий струм колектора виходить за рахунок зовнішнього джерелаенергії, але все одно посилення по струму, що називається, є. У нашому випадку, мікросхема, робоча напруга якої 5В, включає 3 планки зі світлодіодами, що працюють від 12В.

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

Тому планки можуть бути робочу напругу 220В, а базова ланцюг управлятися від мікросхеми з напругою 5В. Якщо транзистор розрахований працювати з такою напругою на колекторі, то світлодіоди горітимуть без проблем.
Падіння напруги на переході база-емітер 0,77В за умови, що струм бази 5мА, струм колектора 0,1А.
Напруга на базовому резисторі складе:

За Законом Ома:

Зі стандартного ряду опорів вибираємо резистор 8,2 кОм. На цьому розрахунок закінчено.

Хочу звернути увагу на одну проблему, з якою я зіткнулася. При використанні бібліотеки IRremote Arduino зависав під час регулювання синього кольору. Після тривалого та ретельного пошуку в інтернеті виявилося, що ця бібліотека використовує за замовчуванням таймер 2 для цієї моделі Arduino. Таймери використовуються для керування виходами ШІМ.

Tаймер 0 (системний час, ШІМ 5 і 6);
Таймер 1 (ШИМ 9 і 10);
Таймер 2 (ШИМ 3 і 11).

Спочатку у мене був використаний ШІМ 11 для регулювання синього кольору. Тому будьте уважні при роботі з ШІМ, таймерами та сторонніми бібліотеками, які можуть їх використовувати. Дивно, що на головній сторінціна гітхабі про цей нюанс не було нічого сказано. За бажанням ви можете розкоментувати рядок з таймером 1 і закоментувати 2.

Підключення елементів на макетній платі виглядає так:

Після тестування на макетці розпочалися фази «Розміщення елементів на платі» та «Робота з паяльником». Після першого тестування готової плати на думку закрадається думка: щось пішло не так. І тут починається знайома багатьом фаза «Кропітка робота з тестером». Однак неполадки (випадково спаялися кілька сусідніх контактів) були швидко усунуті і ось він довгоочікуваний бешкетний вогник світлодіодів.

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

Корпус клеївся на двокомпонентному епоксидному клеї. Варто відзначити особливість даного клею для тих, хто з ним раніше не зустрічався. Цей товариш поставляється у двох окремих ємностях, при змішуванні вмісту яких відбувається миттєва хімічна реакція. Після змішування діяти доводиться швидко, не більше 3–4 хвилин. Для подальшого використання слід змішати нову порцію. Так що якщо намагаєтеся це повторити, моя вам порада, змішувати маленькими порціями і діяти дуже швидко, час на подумати буде не так вже й багато. Тому варто заздалегідь продумати, як і де склеїти корпус. Причому за один раз це зробити не вийде.

Для кріплення планок зі світлодіодами в верхню кришкубула вставлена ​​трубка через яку чудово пройшли всі дроти.

Коли виникло питання з абажуром, я згадала як у дитинстві робила вироби з простої нитки, клею та повітряної кульки, яка служила основою. Принцип для абажура взятий той самий, проте обмотувати багатогранник виявилося складніше, ніж кулька. За рахунок тиску, що чиниться нитками на конструкцію, догори вона почала звужуватися і нитки стали опадати. Екстрено, з руками в клею, було вирішено зміцнити конструкцію зверху. І тут прийшов на допомогу компакт-диск. У результаті вийшов такий нічник:

Що хочеться сказати у результаті

Щоб я змінила проект? Для подачі сигналу датчиків відстані TRIG можна було б використовувати один вихід Arduino замість трьох. Так само я передбачила б отвір для ик-датчика (про який я забула), який поки, на жаль, захований в корпусі з якого він, природно, не може зчитувати сигнали з пульта. Однак хто сказав, що не можна нічого перепаювати і свердлити?

Хочеться відзначити, що це був цікавий семестр, і чудова можливість спробувати зробити щось не на папері, завдяки чому я можу поставити ще одну галочку біля пункту дитяча мрія. І якщо вам здається, що пробувати щось нове складно, і ви не знаєте, за що насамперед взятися, не варто переживати. У багатьох у голові пролітає думка: з чого тут почати і як це взагалі можна зробити? У житті багато виникає завдань, від яких можна розгубитися, але варто лише спробувати, як ви помітите, що з вогником в очах ви можете згорнути гори, нехай навіть для цього доведеться трошки постаратися.

Для додаткового завдання

    ще 1 світлодіод

    ще 1 резистор номіналом 220 Ом

    ще 2 дроти

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

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

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

    У цьому вся експерименті ми встановлюємо фоторезистор між живленням і аналоговим входом, тобто. в позицію R1 у схемі дільника напруги. Це нам потрібно для того, щоб при зменшенні освітленості ми отримували меншу напругу на аналоговому вході.

    Намагайтеся розмістити компоненти так, щоб світлодіод не засвічував фоторезистор.

Скетч

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // зчитуємо рівень освітленості. До речі, оголошувати // змінну і надавати їй значення можна разом int lightness = analogRead(LDR_PIN) ; // зчитуємо значення з потенціометра, яким ми регулюємо // Порогове значення між умовними темнотою та світлом int threshold = analogRead(POT_PIN) ; // Оголошуємо логічну змінну та призначаємо їй значення // «темно зараз». Логічні змінні, на відміну // Цілочисленних, можуть містити лише одне з двох значень: // Істину (англ. true) або брехня (англ. false). Такі значення // Ще називають булевими (англ. boolean). boolean tooDark = (lightness< threshold) ; // використовуємо розгалуження програми: процесор виконає один з //Двох блоків коду в залежності від виконання умови. // Якщо (англ. «if») занадто темно... if (tooDark) ( // ...включаємо освітлення digitalWrite(LED_PIN, HIGH); ) else ( // ...інакше світло не потрібне - вимикаємо його digitalWrite(LED_PIN, LOW); )

Пояснення до коду

    Ми використовуємо новий тип змінних - boolean , які зберігають лише значення true (істина, 1) або false (брехня, 0). Ці значення є результатом обчислення логічних виразів. У цьому прикладі логічний вираз - це lightness< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

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

    У нашому експерименті логічний вираз буде істинним, коли значення lightness менше значення threshold , тому що ми використовували оператор< . Мы можем использовать операторы > , <= , >= , == , != , які означають «більше», «менше чи одно», «більше чи одно», «рівно», «не дорівнює» відповідно.

    Будьте особливо уважні з логічним оператором == і плутайте його з оператором присвоєння = . У першому випадку ми порівнюємо значення виразів і отримуємо логічне значення (істина чи брехня), тоді як у другому випадку присвоюємо лівому операнду значення правого. Компілятор не знає наших намірів і помилку не видасть, а ми можемо ненароком змінити значення якоїсь змінної і потім довго розшукувати помилку.

    Умовний оператор if («якщо») - одна з ключових у більшості мов програмування. З його допомогою ми можемо виконувати як жорстко задану послідовність дій, але приймати рішення, якою гілки алгоритму йти, залежно від умов.

    У логічного вираження lightness< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    З тим самим успіхом ми могли б сказати «якщо освітленість менше порогового рівня, то включити світлодіод», тобто. передати в if весь логічний вираз:

if (lightness< threshold) { // ... }

    За умовним оператором if обов'язково слідує блок коду, який виконується у разі істинності логічного виразу. Не забувайте про обидві фігурні дужки ()!

    Якщо у разі істинності висловлювання нам потрібно виконати тільки однуінструкцію, її можна написати відразу після if (…) без фігурних дужок:

if (lightness< threshold) digitalWrite(LED_PIN, HIGH) ;

    Оператор if може бути розширений конструкцією else («інакше»). Блок коду або єдина інструкція, що йде за нею, буде виконаний тільки якщо логічний вираз у if має значення false, «брехня». Правила, що стосуються фігурних дужок, такі самі. У нашому експерименті ми написали «якщо надто темно, включити світлодіод, інакше вимкнути світлодіод».

Датчики освітленості (освітлення), побудовані на базі фоторезисторів, досить часто використовуються в реальних Ардуін проектах. Вони відносно прості, не дорогі, їх легко знайти та купити у будь-якому інтернет-магазині. Фоторезистор ардуїно дозволяє контролювати рівень освітленості та реагувати на його зміну. У цій статті ми розглянемо, що таке фоторезистор, як працює датчик освітленості на його основі, як правильно підключити датчик до плат Arduino.

Фоторезистор, як випливає з назви, має пряме відношення до резистори, які часто зустрічаються практично в будь-яких електронних схемах. Основною характеристикою звичайного резистора є його величина опору. Від нього залежить напруга і струм, за допомогою резистора ми виставляємо потрібні режими роботи інших компонентів. Як правило, значення опору у резистора в тих самих умовах експлуатації практично не змінюється.

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

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

Які фоторезистори можна купити в інтернет-магазинах

Найпопулярніший і доступний варіантДатчика на ринку – це моделі масового випуску китайських компаній, клони виробів виробника VT. Там не завжди можна розоритися, хто і що саме робить той чи інший постачальник, але для початку роботи з фоторезисторами цілком підійде найпростіший варіант.

Ардуїнщику-початківцю можна порадити купити готовий фотомодуль, який виглядає ось так:


На цьому модулі вже є всі необхідні елементи для простого підключенняфоторезистора до плати Ардуїно. У деяких модулях реалізована схема з компаратором і доступний цифровий вихід та підстроювальний резистор для керування.

Російському радіоаматору можна порадити звернутися на російський датчик ФР. Ті, що зустрічаються у продажу ФР1-3, ФР1-4 і т.п. - Випускалися ще в союзівські часи. Але, попри це, ФР1-3 – точніша деталь. З цього випливає і різниця в ціні За ФР просять трохи більше 400 рублів. ФР1-3 коштуватиме понад тисячу рублів за штуку.

Маркування фоторезистора

Сучасне маркування моделей, що випускаються в Росії, досить просте. Перші дві літери - фоторезистор, цифри після рисочки позначають номер розробки. ФР -765 - фоторезистор, технологія 765. Зазвичай маркується прямо на корпусі деталі

У датчика VT у схемі маркування вказано діапазон опорів. Наприклад:

  • VT83N1 - 12-100кОм (12K – освітлений, 100K – у темряві)
  • VT93N2 - 48-500кОм (48K – освітлений, 100K – у темряві).

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

На заводі деталі налаштовуються на довжину хвилі від червоного до зеленого світла. Більшість у своїй «бачить» і інфрачервоне випромінювання. Особливо точні деталі можуть уловлювати навіть ультрафіолет.

Переваги та недоліки датчика

Основним недоліком фоторезисторів є чутливість до спектра. Залежно від типу падаючого світла опір може змінюватися кілька порядків. До мінусів також відноситься низька швидкістьреакцію зміну освітленості. Якщо світло блимає – датчик не встигає відреагувати. Якщо частота зміни досить велика - резистор взагалі перестане «бачити», що освітленість змінюється.

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

Підключення фоторезистора до ардуїно

У проектах arduinoФоторезистор використовується як датчик освітлення. Отримуючи від нього інформацію, плата може включати або вимикати реле, запускати двигуни, надсилати повідомлення. Звичайно, при цьому ми повинні правильно підключити датчик.

Схема підключення датчика освітленості до Ардуїно задоволена проста. Якщо ми використовуємо фоторезистор, то схемою підключення датчик реалізований як дільник напруги. Одне плече змінюється від рівня освітленості, друге подає напругу на аналоговий вхід. У мікросхемі контролера ця напруга перетворюється на цифрові дані через АЦП. Т.к. опір датчика при попаданні на нього світла зменшується, то і значення напруги, що падає на ньому, буде зменшуватися.

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

Сам монтаж плати повинен викликати труднощів. Так як фоторезистор не має полярності, можна підключити будь-якою стороною, до плати його можна припаяти, під'єднати проводами за допомогою монтажної плати або використовувати звичайні кліпси (крокодили) для з'єднання. Джерелом харчування у схемі є сам Ардуїно. Фоторезисторприєднується однією ногою до землі, інша підключається до АЦП плати (у прикладі – АТ). До цієї ж ноги підключаємо резистор 10 ком. Звичайно, підключати фоторезистор можна не тільки на аналоговий пін A0, але і на будь-який інший.

Декілька слів щодо додаткового резистора на 10 К. У нього в нашій схемі дві функції: обмежувати струм у ланцюгу та формувати потрібна напругау схемі з дільником. Обмеження струму потрібне у ситуації, коли повністю освітлений фоторезистор різко зменшує свій опір. А формування напруги – для передбачуваних значень аналоговому порту. Насправді для нормальної роботиз нашими фоторезисторами вистачить і опору 1К.

Змінюючи значення резистора ми можемо "зрушувати" рівень чутливості в "темну" та "світлу" сторону. Так, 10 К дасть швидке перемиканнянастання світла. У разі 1К датчик світла більш точно визначатиме високий рівень освітленості.

Якщо ви використовуєте готовий модульдатчика світла, то підключення буде ще простішим. З'єднуємо вихід модуля VCC із роз'ємом 5В на платі, GND – з землею. Висновки, що залишилися, з'єднуємо з роз'ємами ардуїно.

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

Приклад скетчу датчика освітленості на фоторезисторі

Ми підключили схему з фоторезистором до Ардуїно, переконалися, що все зробили правильно. Тепер лишилося запрограмувати контролер.

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

Давайте напишемо скетч для датчика освітленості, що включає або вимикає світлодіод, підключений за наступною схемою.

Алгоритм роботи такий:

  • Визначаємо рівень сигналу з аналогового піна.
  • Порівнюємо рівень із пороговим значенням. Максимальне значення буде відповідати темряві, мінімальне – максимальній освітленості. Порогове значення виберемо 300.
  • Якщо рівень менший за пороговий – темно, потрібно включати світлодіод.
  • Інакше – вимикаємо світлодіод.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

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

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

Датчик освітленості та плавна зміна яскравості підсвічування

Можна модифікувати проект так, щоб залежно від рівня освітленості змінювалась яскравість світлодіода. До алгоритму ми додамо такі зміни:

  • Яскравість лампочки змінюватимемо через ШІМ, посилаючи за допомогою analogWrite() на пін зі світлодіодом значення від 0 до 255.
  • Для перетворення цифрового значення рівня освітлення від датчика освітленості (від 0 до 1023) у діапазон ШІМ яскравості світлодіода (від 0 до 255) використовуватимемо функцію map().

Приклад скетчу:

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println = map(val, 0, 1023, 0, 255);// Перетворимо отримане значення на рівень PWM-сигналу. Змінюємо яскравість)

У разі іншого способу підключення, при якому сигнал з аналогового порту пропорційний ступеню освітленості, треба буде додатково "звернути" значення, віднімаючи його від максимального:

Int val = 1023 - analogRead (PIN_PHOTO_RESISTOR);

Схема датчика освітлення на фоторезисторі та реле

Приклади скетчу для роботи з реле наведено у статті, присвяченій програмуванню реле в ардуїно. В даному випадку, нам не потрібно робити складних рухів тіла: після визначення «темряви» ми просто включаємо реле, подавай на його пін відповідне значення.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR);< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Висновок

Проекти із застосуванням датчика освітленості на базі фоторезистора досить прості та ефектні. Ви можете реалізувати безліч цікавих проектів, при цьому вартість обладнання буде невисокою. Підключення фоторезистора здійснюється за схемою дільника напруги із додатковим опором. Датчик підключається до аналогового порту для вимірювання різних значень рівня освітленості або цифрового, якщо нам важливий лише факт настання темряви. У скетчі ми просто зчитуємо дані з аналогового (або цифрового) порту та приймаємо рішення, як реагувати на зміни. Сподіватимемося, що тепер у ваших проектах з'являться і такі ось найпростіші «очі».

У цьому експерименті світлодіод повинен включатися при падінні рівня освітленості нижче за поріг, заданий потенціометром.

СПИСОК ДЕТАЛІВ ДЛЯ ЕКСПЕРИМЕНТУ

- 1 плата Arduino Uno;

- 1 безпайкова макетна плата;

- 1 світлодіод;

- 1 фоторезистор;

- 1 резистор номіналом 220 Ом; 1 резистор номіналом 10 кОм;

- 1 змінний резистор (потенціометр);

- 10 дротів «тато-тато».

ДЕТАЛІ ДЛЯ ДОДАТКОВОГО ЗАВДАННЯ

Ще 1 світлодіод;

Ще один резистор номіналом 220 Ом;

Ще 2 дроти.

ПРИНЦИПОВА СХЕМА

СХЕМА НА МАКЕТНІЙ ПЛАТІ

СКЕТЧ

скачати для Arduino IDE
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // зчитуємо рівень освітленості. До речі, оголошувати // змінну і присвоювати їй значення можна разом = analogRead(LDR_PIN);// зчитуємо значення з потенціометра, яким ми регулюємо // порогове значення між умовними темнотою і світлом int threshold = analogRead(POT_PIN);// оголошуємо логічну змінну і призначаємо їй значення // "темно зараз". Логічні змінні, на відміну від // цілих, можуть містити лише одне з двох значень: // істину (англ. true) або брехня (англ. false) Такі значення // ще називають булевими (англ. boolean). (lightness< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

ПОЯСНЕННЯ ДО КОДУ

  • Ми використовуємо новий тип змінних. boolean, які зберігають лише значення true (істина, 1) або false (брехня, 0). Ці значення є результатом обчислення логічних виразів. У цьому прикладі логічний вираз — це lightness< threshold . На людській мові це звучить як: «освітленість нижча від порогового рівня». Таке висловлювання буде істинним, коли освітленість нижча від порогового рівня. Мікроконтролер може порівняти значення змінних lightnessі threshold, які, у свою чергу, є результатами вимірів, і обчислити істинність логічного виразу.
  • Ми взяли цей логічний вираз у дужки тільки для наочності. Завжди краще писати код читання. В інших випадках дужки можуть впливати на порядок дій, як у звичайній арифметиці.
  • У нашому експерименті логічний вираз буде істинним, коли значення lightnessменше значення threshold, тому що ми використовували оператор < . Ми можемо використовувати оператори > , <= , >= , = = , != , які означають «більше», «менше чи одно», «більше чи одно», «рівно», «не дорівнює» відповідно.
  • Будьте особливо уважні з логічним оператором = = і не плутайте його з оператором присвоєння = . У першому випадку ми порівнюємо значення виразів і отримуємо логічне значення (істина чи брехня), тоді як у другому випадку присвоюємо лівому операнду значення правого. Компілятор не знає наших намірів і помилку не видасть, а ми можемо ненароком змінити значення якоїсь змінної і потім довго розшукувати помилку.
  • Умовний оператор ifякщо») - одна з ключових у більшості мов програмування. З його допомогою ми можемо виконувати як жорстко задану послідовність дій, але приймати рішення, якою гілки алгоритму йти, залежно від умов.
  • У логічного виразу lightness< threshold є значення: trueабо false. Ми вирахували його та помістили у булеву змінну tooDark(«занадто темно»). Таким чином ми говоримо «якщо занадто темно, то включити світлодіод»
  • З тим самим успіхом ми могли б сказати «якщо освітленість менше порогового рівня, то включити світлодіод», тобто. передати до ifвесь логічний вираз:
if (lightness< threshold) { // ... }
  • За умовним оператором ifобов'язково слідує блок коду, який виконується у разі істинності логічного виразу. Не забувайте про обидві фігурні дужки {} !
  • Якщо у разі істинності висловлювання нам потрібно виконати тільки одну інструкцію, її можна написати відразу після if (…)без фігурних дужок:
if (lightness< threshold) digitalWrite(LED_PIN, HIGH);
  • Оператор ifможе бути розширений конструкцією else(«Інакше»). Блок коду або єдина інструкція, що слідує за нею, буде виконаний тільки якщо логічний вираз у ifмає значення false , « брехня». Правила, що стосуються фігурних дужок, такі самі. У нашому експерименті ми написали «якщо надто темно, включити світлодіод, інакше вимкнути світлодіод».

ПИТАННЯ ДЛЯ ПЕРЕВІРКИ СЕБЕ

  1. Якщо ми встановимо фоторезистор між аналоговим входом та землею, наш пристрій працюватиме навпаки: світлодіод буде вмикатися зі збільшенням кількості світла. Чому?
  2. Який результат роботи пристрою ми отримаємо, якщо світло від світлодіода падатиме на фоторезистор?
  3. Якщо ми все ж таки встановили фоторезистор так, як сказано в попередньому питанні, як нам потрібно змінити програму, щоб пристрій працював правильно?
  4. Допустимо, у нас є код if (умова) (дія;). У яких випадках буде виконано дія ?
  5. При яких значеннях yвираз x + y > 0буде істинним, якщо x > 0 ?
  6. Чи обов'язково вказувати, які інструкції виконувати, якщо умова оператора ifхибно?
  7. Чим відрізняється оператор = = від оператора = ?
  8. Якщо ми використовуємо конструкцію if (умова) дію1; else дію2;Чи може бути ситуація, коли жодна з дій не виконається? Чому?

ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО РІШЕННЯ

  1. Перепишіть програму без використання змінної tooDarkіз збереженням функціоналу пристрою.
  2. Додайте до схеми ще один світлодіод. Доповніть програму так, щоб при падінні освітленості нижче порогового значення включався один світлодіод, а при падінні освітленості нижче половини від порогового значення включалися обидва світлодіоди.
  3. Змініть схему та програму так, щоб світлодіоди включалися за старим принципом, але світилися тим сильніше, чим менше світла падає на фоторезистор.




Top