RGB-нічник на базі Arduino. Підключення фоторезистора до ардуїно та робота з датчиком освітленості Робимо "розумну лампу"

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

Зараз я навчаюсь на 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 замість трьох. Так само я б передбачила отвір для ик-датчика (про який я забула), який поки що, на жаль, захований у корпусі, з якого він, природно, не може зчитувати сигнали з пульта. Однак хто сказав, що не можна нічого перепаювати і свердлити?

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

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

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

Напруга з дільника, ми подаємо на вхід АЦП Arduino. Там ми порівнюємо отримане значення з певним порогом і вмикаємо або вимикаємо світильник.

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

На фото нижче показана зібрана схема на макетній платі. Напруги 0В та 5В беруться з Arduino. Ніжка А0 використовується як вхід АЦП.

Нижче показаний скетч Arduino. У даному уроці ми просто вмикаємо та вимикаємо LED, який вбудований у плату Arduino. Більш яскравий LED-світлодіод, ви можете підключити до ноги 13 (через резистор ~220 Ом). Якщо підключатимете більш потужне навантаження, таку як лампу розжарювання, то її слід підключати через реле або тиристор.

У коді програми є закоментовані ділянки, які служать для налагодження. Можна буде контролювати значення АЦП (від 0 до 1024). Також, необхідно в коді змінити значення 500 (поріг включення та вимкнення) на те, яке ви підберете досвідченим шляхом, змінюючи освітленість.

/* ** Нічник ** ** www.hobbytronics.co.uk */ int sensorPin = A0; // встановлюємо вхідну ногу для АЦП unsigned int sensorValue = 0; // цифрове значення фоторезистора void setup() ( pinMode(13, OUTPUT); Serial.begin(9600); // старт послідовного виведення даних (для тестування) ) void loop() ( sensorValue = analogRead(sensorPin); // зчитуємо значення з фоторезистора if(sensorValue<500) digitalWrite(13, HIGH); // включаем else digitalWrite(13, LOW); // выключаем // Для отладки раскомментируйте нижеследующие строки //Serial.print(sensorValue, DEC); // вывод данных с фоторезистора (0-1024) //Serial.println(""); // возврат каретки //delay(500); }

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

    ще 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, «брехня». Правила, що стосуються фігурних дужок, такі самі. У нашому експерименті ми написали «якщо надто темно, включити світлодіод, інакше вимкнути світлодіод».

Всім привіт! Я - Артем Лужецький і я вестиму серію статей присвячених "Розумному дому" та IoT (англ. - Internet of Things, інтернет речей). Ми познайомимося з дивовижними способами створення домашньої мережі з різноманітних пристроїв, які будуть працювати автономно, або за допомогою людини. Ну що? Почнемо!

Перша стаття ознайомлювальна, я хочу, щоб ви зрозуміли, що я працюватиму з найпоширенішими платами та модулями, щоб більшість людей могла спробувати себе у розробці IoT.

Отже, для початку нам знадобляться два мікроконтролери, які ми будемо використовувати: і .

Arduino UNO

Я думаю не треба знайомити вас з цією платою, вона дуже популярна серед початківців та шанувальників DIY. Скажу тільки те, що можливості цієї плати обмежені і UNO не може працювати з протоколом https, не вистачає обчислювальної потужності мікроконтролера ATmega328P, тому коли нам доведеться працювати з мікроконтролером і протоколом https, то ми будемо програмувати ESP8266.

ESP8266

Я працюватиму з Troyka-модулем ESP8266 від компанії "Амперка", але можна спокійно використовувати і звичайний модуль ESP 8266, вони практично не мають відмінностей, головне при підключенні подивитися значення пінів і запам'ятати, що ESP працює за 3,3 вольтовою логікою, тому Необхідно або підключати через 5 вольт, але підключити на схему стабілізатор напруги, або легко використовувати пін з подачею напруги на 3,3 вольта.

Даний мікроконтролер не найпотужніший у серії компанії Espressif на загальному ринку, але він один із найдешевших і найпоширеніших. Він буде основою наших IoT розробок.

Додаткові деталі

Також нам знадобиться для створення всіх дослідів:

  1. Світлодіоди
  2. Фоторезистор
  3. Термістор
  4. Ультразвуковий далекомір
  5. П'єзодинамік
  6. Міні Сервопривід
  7. ІЧ - датчик
  8. ІЧ - пульт

Не потрібно мати всі ці модулі, щоб працювати з IoT, але для того, щоб зробити всі майбутні проекти, нам згодом доведеться придбати їх усі.

Програми та бібліотеки

Перше - завантажте бібліотеку, яка допоможе вам набагато простіше працювати в Arduino IDE, якщо ви використовуєте ESP8266 - http://wiki.amperka.ru/_media/iot-m:iot-m-libs.zip

Друге – для кращого ознайомлення з IoT нам потрібні веб-сайти, які нададуть нам можливість надсилати на них дані.

  1. www.dweet.io
  2. maker.ifttt.com
  3. narodmon.ru
  4. і т.д.

Третє - також нам знадобляться різні програми на Android, щоб за допомогою телефону ми могли управляти розумним будинком.

  1. OpenHab
  2. Blink
  3. і т.д.

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

2. Робимо "розумну лампу"

Я вже змусив вас нудьгувати? Зробимо найпростішу розумну лампу, яка вмикається, якщо в кімнаті темно.

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

Якщо ви не впевнені в тому, що готові працювати з електрикою 220 вольт, то використовуйте замість ліхтаря звичайний світлодіод. На початку я взяв свою стару лампу TLI-204, такі є практично в будь-якому магазині (відключив заздалегідь від мережі).

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

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

Загальна електрична схема має виглядати так:

Якщо все зробити правильно, то на третій позиції перемикача ви зможете, подаючи з мікроконтролера струм на реле, включати лампу.

Підключимо до Ардуін фоторезистор. Схема виглядає так:

3. Код для "розумної лампи"

Тепер напишемо код, яким будемо передавати струм на реле, якщо у кімнаті буде темно.

#define SHINE 5 //ПІН НА ФОТОРЕЗИСТОРІ #define REL 13 //ПІН НА РЕЛЕ void setup()( pinMode(SHINE, INPUT); pinMode(REL, OUTPUT); Serial.begin(9600); ) void loop()( if (analogRead(SHINE)<600) // Если света в комнате мало, то включаем лампу { digitalWrite(REL, HIGH) } else // если много, то выключаем { digitalWrite(REL, LOW); } Serial.printIn(analogRead(SHINE)); selay(500); }

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

Наступного разу спробуємо ускладнити код і додати ще пару функцій. До скорої зустрічі!

Не працює