Ночник из старой лампочки, на основе Arduino и WS2812. Умная лампа с помощью Arduino

Добрый день или ночь, у кого как. Сегодня я поделюсь инструкцией по изготовления небольшого ночника. Основой послужит – матовый рассеиватель от сгоревшей светодиодной лампочки. А внутрь мы поместим Arduino Pro Mini и светодиоды SW2812. Я выложу только один скетч, но вариантов цветов или переливаний может быть очень много. Начнем, как всегда, со списка необходимого:

Рассеиватель от светодиодной ламы, цоколь Е27
- Блок питания на 5В
- Arduino Pro Mini 5V
- USB-TTL (для заливки скетча в ардуино)
- Светодиоды WS2812
- Тонкий пластик
- Двусторонний скотч
- Зарядка от телефона не нужная, но рабочая
- Паяльник
- Провода
- Припой, канифоль
- Термоклеевой пистолет

Шаг 1. Изготовление корпуса.
Для начал нам понадобиться добыть рассеиватель. Берем светодиодную лампочку, с цоколем Е27. Лучше, конечно, брать уже отработавшую свое лампочку:

Одной рукой держим лампочку за цоколь и пластиковый корпус, другой - берем за рассеиватель, и надламываем лампочку. Рассеиватель должен легко отойти от корпуса, так как держится только на герметике:

Теперь нам надо изготовить основу, к которой мы будем приклеивать светодиоды. Для этого берем тонкий пластик, подойдет обложка от пластикового скоросшивателя. Теперь замеряем внутренний диаметр посадочного отверстия рассеивателя, а также надо измерить глубину рассеивателя. Переходим к изготовлению основы. Она будет в форме цилиндра, диаметр которого должен быть на 5 мм меньше внутреннего диаметра посадочного отверстия рассеивателя. А высота меньше на 7 мм глубины рассеивателя. Выглядеть должно примерно так:

На этом пока закончим.

Шаг 2. Электрика.
Как я уже говорил ранее, контролером будет Arduino Pro Mini, версия, работающая от 5 вольт. Светодиодная лента подключается вполне просто, для этого необходимо контакт +5V подключить к плюсу от блока питания на 5 вольт, а GND – к минусу. Контакт DIN (вход) соединить с pin 6 Arduino. Порт подключения ленты можно поменять на любой удобный в скетче. Arduino будем питать от того же блока питания. Так как блок питания будем использовать стабилизированный, соединяем плюс от блока питания с контактом 5V на Arduino. Минус блока питания должен быть подключен к GND Arduino. Схема такая:

Итак, один светодиод, при максимальной яркости всех трех цветов, потребляет 60 мА. У меня поместилось 25, значит получается:

25 х 60 mA = 1500 mA = 1.5 А

То есть, мне нужен блок питания 5 В, 1.5 А. Это максимальный показатель силы тока, который будет при включение все светодиодов в режим максимальной яркости всех трех цветов.

В качестве блока питания возьмем старую зарядку от телефона. Блок питания надо выбирать на 5 вольт, а по мощности, посчитать сколько у вас поместиться светодиодов:

Отрезаем штекер от нее и припаиваем провода напрямую к ленте, не забудьте проверить полярность тестером или мультиметром. Также следует сделать выводы проводов для питания Arduino. И сигнальный провод от ленты к Arduino.

В нижней части цилиндра делаем прорезь, для того чтобы пропустить контакты ленты с припаянными проводами внутрь:

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

Если у вас получилось так же, не расстраивайтесь, просто обрежьте свисающую по краям ленту и припаяйте провода напрямую к светодиодам. Контакты WS2812:

Обратить внимание, светодиодная лента на WS2812B имеет направление, с одной стороны (начало или вход) у нее контакты DIN, +5V, GND. А с другой стороны (конец или выход) DO, +5V, GND. Если припаиваете на прямую к светодиодам, смотри на расположение контактов, ориентируясь на ключ (срез угла). Для упрощения монтажа, на ленте нарисованы стрелки, указывающие на направление. Особое внимание уделите переходу на верх, получается очень резкий изгиб, велика вероятность переломить ленту. У меня получилось вот так:


Сверху припаивался на прямую к светодиодам:

А посередине, вторым уровнем, еще пару светодиодов:

И для надежности, заливаем провода термоклеем:

Теперь вставляем наш цилиндр со светодиодами внутрь шара от лампочки. Используя термоклей, фиксируем цилиндр внутри шара по кругу:

Не забудьте проделать прорезь для вывода наружу провода питания:

Шаг 3. Подготовка среду и прошивка.
Для загрузки скетча (или прошивки) будем использовать Arduino IDE. Скачиваем с официального последнюю версию и устанавливаем ее.

Чтобы это сделать, вначале скачиваем архив. Затем распаковываем этот архив. И перемещаем распакованные файлы в папку «libraries», которая находится в папке с установленной Arduino IDE. Можно сделать проще. Запускаем Arduino IDE. Не распаковываем скачанный архив. Прямо в среде Arduino IDE выбираем пункт меню Скетч – Подключить библиотеку. В самом верху выпадающего списка выбираем пункт «Добавить.Zip библиотеку». Должно появиться диалоговое окно. Далее в нем выбираем нашу библиотеку, Adafruit_NeoPixel-master. Немного стоит подождать. Снова открываем пункт меню Скетч – Подключить библиотеку. Теперь в самом низу выпадающего списка вы увидите новую библиотеку. Перезагрузив Arduino IDE, библиотеку можно использовать.

Скачиваем мой скетч:

Осталось залить скетч в Arduino. Мы используем Arduino Pro Mini. У этой версии популярной Arduino нет распаянного на плате USB-TTL чипа. Поэтому для связи с компьютером и заливки скетча необходимо использовать отдельный USB-TTL. Подключение по следующей схеме:

Arduino – USB-TTL
RX (P0) – TX
TX (P1) – RX
GND – GND

Питание USB-TTL будет от USB порта компьютера. Arduino можно запитать от USB-TLL или использовать внешний источник питания. Главное, чтобы контакт GND USB-TTL и Arduino были соединены. Чаще всего в продаже попадаются USB-TTL без вывода контакта DTR. Контакт DTR необходимо соединить с Reset Arduino для осуществления автоматической перезагрузки перед загрузкой скетча. Если у вас, как и у меня, такого вывод нет, перезагрузку перед заливкой скетча необходимо выполнять вручную. Действуем так: подключаем всем по схеме, описанной выше, открываем Arduino IDE, открываем скаченный вами скетче, нажимает кнопку – Загрузка – и смотрим что написано внизу. Пока идет «компиляция», ничего не делаем, просто ждем, когда появится надпись «загрузка» нам необходимо нажать кнопку Reset на Arduino. Если не удобно нажимать кнопку на плате, можно вывести кнопку, подключенную к GND и Reset. Или просто вывести провода к тем же выводам и замыкать их в нужный момент.

Хочу сказать, что вариантов свечения ночника огромное множество, я записал в скетч лишь несколько, которые мне самому понравились. Вы можете отредактировать скетч, как вам нравиться. Поэкспериментируйте и выберете то, что вам больше всего понравиться.

Датчики освещенности (освещения), построенные на базе фоторезисторов, довольно часто используются в реальных ардуино проектах. Они относительно просты, не дороги, их легко найти и купить в любом интернет-магазине. Фоторезистор ардуино позволяет контролировать уровень освещенности и реагировать на его изменение. В этой статье мы рассмотрим, что такое фоторезистор, как работает датчик освещенности на его основе, как правильно подключить датчик в платам 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 – c землей. Оставшиеся выводы соединяем с разъемами ардуино.

Если на плате представлен цифровой выход, то отправляем его на цифровые пины. Если аналоговый – то на аналоговые. В первом случае мы получим сигнал срабатывания – превышения уровня освещенности (порог срабатывания может быть настроен с помощью резистора подстройки). С аналоговых же пинов мы сможем получать величину напряжения, пропорциональную реальному уровню освещенности.

Пример скетча датчика освещенности на фоторезисторе

Мы подключили схему с фоторезистором к ардуино, убедились, что все сделали правильно. Теперь осталось запрограммировать контроллер.

Написать скетч для датчика освещенности довольно просто. Нам нужно только снять текущее значение напряжения с того аналогового пина, к которому подключен датчик. Делается это с помощью известной нам всем функции 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); if (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(val); int ledPower = map(val, 0, 1023, 0, 255); // Преобразуем полученное значение в уровень PWM-сигнала. Чем меньше значение освещенности, тем меньше мощности мы должны подавать на светодиод через ШИМ. analogWrite(PIN_LED, ledPower); // Меняем яркость }

В случае другого способа подключения, при котором сигнал с аналогового порта пропорционален степени освещенности, надо будет дополнительно «обратить» значение, вычитая его из максимального:

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); if (val < 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Заключение

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

Для дополнительного задания

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

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

Сейчас я учусь на 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 and 6);
Tаймер 1 (ШИМ 9 и 10);
Tаймер 2 (ШИМ 3 и 11).

Первоначально у меня был использован ШИМ 11 для регулирования синего цвета. Поэтому будьте внимательны при работе с ШИМ, таймерами и сторонними библиотеками, которые могут их использовать. Странно, что на главной странице на гитхабе об этом нюансе не было ничего сказано. При желании вы можете раскомментировать строчку с таймером 1 и закомментировать 2.

Подключение элементов на макетной плате выглядит следующим образом:

После тестирования на макетке начались фазы «Размещение элементов на плате» и «Работа с паяльником». После первого тестирования готовой платы в голову закрадывается мысль: что-то пошло не так. И тут начинается знакомая многим фаза «Кропотливая работа с тестером». Однако неполадки (случайно спаялись несколько соседних контактов) были быстро устранены и вот он долгожданный озорной огонек светодиодов.

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

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

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

Когда возник вопрос с абажуром, я вспомнила как в детстве делала поделки из простой нитки, клея и воздушного шарика, который служил основой. Принцип для абажура взят тот же, однако обматывать многогранник оказалось сложнее, чем шарик. За счет давления, оказываемого нитками на конструкцию, кверху она начала сужаться и нитки стали опадать. Экстренно, с руками в клею, было принято решение укрепить конструкцию сверху. И тут пришел на помощь компакт диск. В итоге получился вот такой ночник:

Что хочется сказать в итоге

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

Хочется отметить, что это был интересный семестр, и отличная возможность попробовать сделать что-то не на бумаге, благодаря чему я могу поставить еще одну галочку около пункта «детская мечта». И если вам кажется, что пробовать что-то новое сложно, и вы не знаете за что первым делом взяться, не стоит переживать. У многих в голове пролетает мысль: с чего бы тут начать и как это вообще можно сделать? В жизни много возникает задач от которых можно растеряться, но стоит только попробовать как вы заметите, что с огоньком в глазах вы можете свернуть горы, пусть даже для этого придется немножко постараться.

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

СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА

- 1 плата Arduino Uno;

- 1 беспаечная макетная плата;

- 1 светодиод;

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

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

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

- 10 проводов «папа-папа».

ДЕТАЛИ ДЛЯ ДОПОЛНИТЕЛЬНОГО ЗАДАНИЯ

Еще 1 светодиод;

Еще 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() { // считываем уровень освещённости. Кстати, объявлять // переменную и присваивать ей значение можно разом 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 , «ложь ». Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод».

ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ

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

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ

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