Arduino подключения светильника с br

Обновлено: 28.04.2024

Для проекта мы использовали светодиодную ленту, которая включается за счет реле SRD-05VDC-SL-C. Это 1-канальный релейный модуль с током питания 5 Вольт, максимальное напряжение на контактах до 250 Вольт, максимальный переключаемый ток 20 Ампер. Плата Ардуино и LED-лента запитаны от блока питания 12 В. Управление светильником осуществляется за счет пульта ДУ и ИК приемника на Ардуино.

Светильник с управлением с пульта своими руками

Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • ИК приемник;
  • любой пульт ДУ;
  • реле SRD-05VDC-SL-C;
  • блок питания на 12 В; ;
  • провода и изолента.

Скетч для светильника на Ардуино с пультом

Эксперимент 3. Светильник с управляемой яркостью

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

Прочтите перед выполнением

Список деталей для эксперимента

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

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

6 проводов «папа-папа»

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

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

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

еще 2 провода

Принципиальная схема

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

Обратите внимание

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

Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает

Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки

Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A . Для Arduino Uno — это A0-A5.

Скетч

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

Переменным принято давать названия, начинающиеся со строчной буквы.

Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:

Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение в диапазоне от -32 768 до 32 767, с другими типами мы познакомимся позднее

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

Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA

Обратите внимание, как мы получили значение, возвращенное функцией analogRead() : мы просто поместили его в переменную rotation с помощью оператора присваивания = , который записывает то, что находится справа от него в ту переменную, которая стоит слева

Вопросы для проверки себя

Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND микроконтроллера?

В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?

Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT) ? строчку pinMode(POT_PIN, INPUT) ?

Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать?

Задания для самостоятельного решения

Отключите питание платы, подключите к порту 5 еще один светодиод. Измените код таким образом, чтобы второй светодиод светился на 1/8 от яркости первого

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International

конспект-arduino/светильник-с-управляемой-яркостью.txt · Последние изменения: 2017/02/21 09:32 — ptushkin

Эксперимент 19. Светильник, управляемый по USB

В этом эксперименте мы отправляем устройству команды, как ему светить.

Список деталей для эксперимента

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

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

Принципиальная схема

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

Скетч

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

В этой программе мы создаем объект класса String . Это встроенный класс, предназначенный для работы со строками, т.е. с текстом.

Не путайте его с типом данных string , который является просто массивом символов. String же позволяет использовать ряд методов для удобной работы со строками.

Мы знакомимся с новым видом циклов: цикл с условием while . В отличие от цикла со счетчиком for , цикл while(expression) выполняется до тех пор, пока логическое выражение expression истинно.

Метод available() объекта Serial возвращает количество байт, полученных через последовательный порт.

В данном эксперименте цикл while работает до тех пор, пока available() возвращает ненулевое значение, любое из которых приводится к true .

Переменные типа char могут хранить один символ.

В этом примере символ мы получаем методом Serial.read() , который возвращает первый байт, пришедший на последовательный порт, или -1, если ничего не пришло.

Обратите внимание, что в if мы сравниваем не пришедший символ с 0 и 9, но их коды. Если пришел какой-то символ, который не является цифрой, мы не будем его добавлять к нашей строке message .

Объекты типа String позволяют производить конкатенацию, т.е. объединение строк. Это можно сделать так: message = message + incomingChar , но можно записать в сокращенной форме: message += incomingChar .

В этой программе мы дополняем if конструкцией else if . Это еще один условный оператор, который проверяется только в случае ложности выражения, данного первому оператору. Несколько else if могут следовать друг за другом, при этом каждое следующее условие будет проверяться только в случае невыполнения всех предыдущих. Если в конце разместить else , он выполнится только если ни одно из условий не выполнено.

Напомним, что последовательностью \n кодируется символ переноса строки. Если он был передан устройству, мы передаем полученные ранее символы как параметр для analogWrite() , которая включает светодиод.

Мы используем один из методов String , toInt() , который заставляет считать строку не набором цифр, но числом. Он возвращает значение типа long , при этом, если строка начинается с символа, не являющегося цифрой, будет возвращен 0. Если после цифр, идущих в начале строки, будут символы не-цифры, на них конверсия остновится.

Обратите внимание на выпадающее меню внизу монитора порта: чтобы наше устройство получало символ перевода строки, там должно быть выбрано «Новая строка (NL)»

Пустая строка обозначается так: "" . Опустошив ее, мы готовы собирать новую последовательность символов.

Вопросы для проверки себя

Какие объекты позволяют легко манипулировать текстовыми данными?

Что возвращают методы Serial.available() и Serial.read() ?

Чем отличаются конструкции for и while ?

Каким образом можно организовать более сложное ветвление, чем if … else ?

Как можно объединить текстовые строки?

Как можно привести текстовую строку, содержащую цифры, к числовому типу?

Задания для самостоятельного решения

Переделайте программу так, чтобы устройство распознавало текстовые команды, например, «on» и «off», и соответственно включало и выключало светодиод.

Вам может пригодиться один из методов String : toLowerCase(yourString) или toUpperCase(yourString) , которые возвращают переданную строку yourString , приведенную к нижнему или верхнему регистру соответственно.

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International

Управление светильниками по протоколу DALI с помощью Arduino

DALI (Digital Addressable Lighting Interface) – протокол, предназначенный для управления осветительными приборами. Протокол был разработан австрийской компанией Tridonic и основан на манчестерском кодировании: каждый бит данных кодируется перепадом от низкого сигнала к высокому или наоборот.

DALI сеть состоит из контроллера и подключенных к нему осветительных приборов. Передача данных идет на скорости 1200бит/с. Напряжение для логической единицы составляет 16±6,5В, а для логического нуля 0±4,5В. Шина DALI всегда находится под напряжением 16В, в противном случае все осветительные приборы, подключенные к шине, переходят в аварийный режим и включаются. Питание шины обеспечивает контроллер. К одной шине подключается до 64 светильников. Устройства можно объединять в 16 групп и задавать до 16 сцен освещения. Яркость каждого осветительного прибора регулируется от 0 до 254.



Список команд можно посмотреть здесь.

Инициализация новых светильников

До начала работы каждому светильнику должен быть присвоен адрес от 1 до 63 (short address). У новых светильников короткий адрес как правило не задан, поэтому управлять конкретным светильником не получится. Такие светильники реагируют только на широковещательные команды.

Для того чтобы назначить короткий адрес светильнику нужно его инициализировать. У каждого светильника есть случайный адрес, состоящий из 24 бит (3 раза по 8 бит). 24 битный адрес может принимать значения от 1 до 16777216. Вероятность подключения светильников с одинаковыми адресами минимален и составляет один случай из 1 из 266144.

Умный светильник для «богатых» своими «ленивыми» руками, это же «просто» и удобно


Давным-давно, чтобы помыть посуду или приготовить пищу нужно было включить светильник над мойкой. Это была переделанная настольная лампа.

Мне не нравилось нажимать маленький выключатель мокрыми руками, потому что он коммутировал 220 вольт на лампу накаливания.


Также свет от лампы падал преимущественно на мойку, а хотелось лучше освещать стол для готовки и плиту.

  • Сделать включение/выключение света на кухне бесконтактным;
  • Равномерно освещать мойку, стол для готовки и плиту;
  • Экономить электроэнергию, за счёт замены лампы накаливания на светодиоды.

Корпус взял промышленный (пыле, влагозащищённый). Поскольку лента на 12 вольт, то в блоке разместился блок питания с 220 В на 12 В, плата гальванической развязки для управления лентой на базе TLP250 (оптопара) и управляла всем этим ардуино в компактном исполнении.
Плата гальванической развязки у меня осталась от старого проекта. Когда-то делал подсветку для минибара у себя в тумбочке. При открывании двери сенсорная площадка фиксировала изменение ёмкости и включала мягко переливающийся свет. То есть, плата хорошо подходила для текущего проекта, оставалось только обрезать всё лишнее. На плате стоял линейный преобразователь на 5 вольт, с него запитал ZUNo.

Включать светильник планировалось подносом руки к ультразвуковому измерителю расстояния. Его вмонтировал в крышку, а в коробку влезли все остальные части. Всё «надёжно» закрепил термоклеем. На время тестирования сделал рядом кнопку подачи питания в блок управления из выключателя света для внешнего монтажа.


Включать свет стало удобнее и безопаснее. Он крепился вверх «ногами» к дну кухонного шкафчика и воде с мокрых рук попасть внутрь было тяжелее.

Выводы по предыдущему блоку управления

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

С бесконтактным включением/отключением всё оказалось хуже. Оно работало. Но после 5 минут в отключенном состоянии начинались всполохи на светодиодной ленте. Переделывать схему на оптопарах не стал и оставил всё как есть. Только для включения и выключения стали пользоваться новым выключателем. Его местоположение и форма всем понравились.
За два года использования на корпусе и внутри него скопился жир и прочие соединения выделяемые во время приготовления пищи. Данный налёт частично проник и в корпус через отверстия для ввода проводов. Но из-за глянцевой поверхности корпуса это вещество сконденсировалось в желатиноподобную массу. На ощупь приятную, без запаха и… (на вкус пробовать не стал). Сделал несколько фотографий пятна в виде зародыша дракона.



На стенах же данное вещество превращается в ужасный налёт, который не просто отмывается.

Что стало

Порывшись в закромах нашёл недоделанный модуль расширения для ZUNo. ZUNo – это ардуино подобная плата для конструирования собственного устройства, совместимого с умным домом Z-Wave. Программируется из среды ардуино.

Характеристики от производителя:
  • 28 kB Flash memory for your sketches
  • 2 kB RAM available
  • Z-Wave RF transmitter at 9.6/40/100 kbps
  • 26 GPIO (overlaps with special hardware controllers)
  • 4 ADC
  • 5 PWM
  • 2 UART
  • 1 USB (serial port)
  • 16 kB EEPROM
  • 1 SPI (master or slave)
  • 4 IR controllers, 1 IR learn capability
  • 1 TRIAC/ZEROX to control dimmer
  • 3 Interrupts
  • 1 Timer 4 MHz
  • I2C (software)
  • 1-Wire (software)
  • 8x6 Keypad Scanner (software)
  • 2 service LED, 1 service button
  • 1 user test LED

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

Немного информации от производителя:
  • One 0-10 V analog output — control industrial dimmers
  • Up to four PWM or switch outputs (up to 5 A per channel) — control contactors, switches, halogen bulbs or LED strips
  • Up to eight digital 0/3 V inputs or outputs — connect various low voltage digital senors and actors
  • Up to four digital 0/3, 0/5 or 0/12 V digital or analog inputs — connect industrial 10 V sensors or any Arduino-compatible sensor
  • RS485 or UART — for industial meters
  • OneWire — for DS18B20 or other sensors

Для своего проекта мне нужно 3 мощных транзистора для коммутации 12 вольт на светодиодную ленту и преобразователь с 12 вольт на 5 вольт, для питания ZUNo. Остальная периферия модуля расширения не напаяна или не протестирована.


В этой части схемы не хватает диода на питание, для защиты от «переполюсовки» и резисторы на затворах силовых полевых транзисторов надо было подключать на затвор, а не перед ограничивающим резистором. Об этом ещё напишу в выводах.

Поставляется данный модуль расширения в корпусе от Gainta. Мой предыдущий блок управления тоже был в корпусе от этой фирмы, но другого размера. К сожалению крепления на модуле не подошли к старому корпусу, а сверлить новый не хотелось, оставил старый корпус. Плату «посадил» на термоклей.


Немного о программировании Arduino и ZUNo

Z-wave устройства обязательно имеют некоторое количество классов. Классы описывают функции устройства и интерфейс взаимодействия. Например, мой светильник управляет светодиодной лентой, состоящей из трёх цветов (красный, зелёный, голубой). Эти функции выполняет класс Switch multilevel. Если мы добавим его в скетч, то сможем удалённо менять яркость одного из цветов. Чтобы управлять тремя цветами, нужно сделать три экземпляра этого класса. Более подробно и детально говорить об этом не буду. Потому что рутинные манипуляции с классами скрыты для пользователей ZUNo понятием «канал». Например, мне нужны три класса Switch multilevel, значит в коде должно появиться 3 канала Switch multilevel и несколько функций callback'ов для управления по радио. Как же это сделать? Ещё нужно добавить класс Switch basic, чтобы включать и выключать светильник по нажатию одной кнопки (из интерфейса контроллера сети), а не настраивать 3 канала каждый раз.

Нужно зайти на сайт разработчиков, где выложены примеры z-uno.z-wave.me/Reference/ZUNO_SWITCH_MULTILEVEL. К каждому классу, поддерживаемому ZUNo есть описание и пример. Далее копируем и вставляем в свой скетч предлагаемые функции. Теперь в скетче есть три канала switch multilevel и 6 функций callback для реакции на команды по радио. Я не сильно искушён в классах Z-Wave, поэтому моё предыдущее устройство со светодиодной лентой работало с этим набором классов.

Объявлялись каналы так:

Заголовок спойлера

Это приводило к генерации следующих виджетов в контроллере после добавления в сеть:


Для настройки цвета приходилось в меню контроллера открывать и настраивать каждый цвет отдельно. Это не удобно и медленно. Однако, мне повезло. оказалось я не одинок. О нас подумали и сделали канал z-uno.z-wave.me/Reference/ZUNO_SWITCH_COLOR. Теперь в скетче только один канал и две callback функции. В меню контроллера настройка цветов выполняется как отдельно по каждому цвету, так сразу всех, путём выбора из палитры.


А в меню контроллера это выглядит так:


Следующая функция отвечает на запросы по радио. Придти может запрос на чтение состояние одного из каналов цветов.


А это функция для задания цвета из интерфейса контроллера.


Вот и весь код, который нужно добавить, чтобы превратить скетч arduino в скетч для ZUNo.

Заключение

После сборки и установки все заявленные задачи были выполнены. Однако, привычка включать свет выключателем осталась (очень уж удобно получилось). Бесконтактный выриант включения тоже работает. Из недостатков хочу отметить мерцание светодиодной лампы в течение секунды после подачи питания на блок управления. Это вызвано долгой инициализацией периферии ZUNo. В этот момент на ножках непредсказуемое состояние. Думаю подтягивающий резистор на затворе транзистора исправит ситуацию если его поставить после ограничивающего резистора. Если же код инициализации настраивает ножки на выход и меняет логические уровни целенаправленно, можно поэкспериментировать с RC-фильтром, который не будет пропускать короткие импульсы. Пока не делал, и возможно, не сделаю никогда!

Выводы

ZUNo и модуль расширения к ней сильно упрощают “домашнее техническое творчество». Однако, считаю эти продукты очень дорогими и если бы я работал в другом месте и вокруг меня не валялось бы «недоиспорченное» оборудование Z-Wave, то делал бы всё на ESP8266. Во время разработки узнал новый «стандарт» маркировки проводов от блока питания.


Теперь чёрной полосой помечается не только земля, но как и в моём случае «положительный» провод. Для модуля расширения это оказалось важно. Вышел из строя преобразователь на 5 вольт LM2594 (Цена в Чип и Дип около 200 рублей). Надеюсь, в следующей версии модуля расширения будет стоять защитный диод от «переполюсовки». А я буду проверять полярности питающих проводов. Ещё недостаток связан с корпусом. Корпус выглядит хорошо, но подключить провода без пинцета к клеммникам у меня не получилось. Надеюсь, что будет версия с другими клеммниками (для подключения проводов сверху, или под углом).

Я не люблю хранить фотографии на облачных сервисах и часто делать резервные копии. Поэтому большая часть фотографий связанная с процессом конструирования и светильника 1 безвозвратно испорчены.


Это всё, что осталось от процесса сборки и отладки.

А так выглядит пущенная в эксплуатацию подсветка, если немного пригнуться. Если выпрямиться, то коробку и выключатель не видно.

Светильник управляемый жестами на Arduino

image

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

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

И так, все по порядку.

Описание светильника

Основной упор в этом светильнике я сделал не на визуализацию, а на управление жестами, все остальные функции второстепенные.

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

Если после включения лампы начнем листать влево, то увидим динамические световые эффекты, такие как «Огонь», «Матрица», «Лава лампа», «Радуга», «Конфетти», «Искры», «Огненный светильник». Если Вам нужно вернуться на обычный светильник, то вместо перелистывания, можно выключить лампу жестом от себя и включить любым из трех жестов.
Выключение производится жестом от себя.

Яркость регулируется жестом приближения и отдаления от датчика. Сначала нужно поднести ладонь на максимально близкое расстояние к сенсору, а потом резко поднять вверх. Светильник перейдет в режим регулировки яркости, приближая и отдаляя ладонь, нужно найти подходящую яркость и зафиксировать руку на пару секунд, для того чтобы значение яркости сохранилось. Когда яркость сохранится, светильник даст об этом знать плавным выключением света с последующим включением уже с новым уровнем яркости.

Я не уделял особого внимания визуальным эффектам, так как планирую сделать вторую версию лампы на контроллере Wemos D1 mini. В которой планирую довести все до идеала. По этой же причине я пока использую только одну линейку светодиодов, состоящую из 4 планок ws2812b, вместо четырех.

Прерывания APDS9960

Собственно основные проблемы светодиодной лампы связаны именно с ним. Прерывания в apds9960 живут своей жизнью, может сработать от чего угодно например от ЭМ помехи или от нахождения рядом с датчиком человека, от пульсации по питанию и возможно от чего то еще.


По мере изучение пришло понимание от чего происходят ложные срабатывания прерываний. Основная проблема — это случайные отражения ИК сигнала. Производитель рекомендует покрыть датчик и все вокруг него черным резиновым напылением. У меня нет такой краски и я не стал с этим заморачиваться. Хотя наверняка это могло бы немного уменьшить число ложных срабатываний.

Я написал код который фильтрует все случайные срабатывания, но столкнулся еще с одной проблемой. После срабатывания прерывания информация о жесте передается по шине I2C не моментально, а имеет определенную задержку. А если питание из-за адресной светодиодной ленты зашумлено, то время передачи с учетом этих помех всегда будет разным. Пришлось учитывать этот факт и по новой переписывать код определения жестов.

Определение жеста

Если в коде не использовать прерывание от датчика, то с определением жеста нет ни каких проблем. Но в таком случае теряется многозадачность. Если на лампе включен динамический эффект, то соответственно он требует цикличного, постоянно исполняемого кода и чтобы вывести контроллер из цикла, потребуется использование прерываний.

Для того, что бы улучшить стабильность распознавания жестов, так же пришлось в библиотеке уменьшить чувствительность приемника. Для этого нужно в файле SparkFun_APDS9960.h заменить строку:

if( !setLEDBoost(LED_BOOST_300) )
на
if( !setLEDBoost(LED_BOOST_150) )

Если Вы скачали библиотеку из этой статьи, то ничего делать не нужно, там уже все исправлено.
Я так же экспериментальным путем подобрал ток светодиода 50 мА, при котором жесты определяются наиболее стабильно и нет надобности насиловать инфракрасный светодиод, током 100 мА.

А так же я допустил ошибку, разместив микроконтроллер в нижней части светильника, а датчик жестов в верхней крышке. Из-за этого, для соединения arduino и apds9960, пришлось использовать провода длинной 30 см. Что тоже добавило дополнительной нестабильности работы датчика. В итоге я программным путем победил все эти проблемы.

Схема


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

Стабилизатор dc-dc mini360, можно заменить на любой другой понижающий преобразователь напряжения, с выходным током не менее 150 мА.

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

Вместо Ардуино Нано можно использовать контроллер Arduino UNO или его клоны.

Обязательно проверьте на датчике жестов наличие перемычек, они отмечены красным цветом на фотографии ниже. В случаи их отсутствия следует паяльником на эти контактные дорожки, нанести и разогреть припой до образования однородной капли. Сейчас китайцы поставляют эти датчики без перемычек. Без указанных перемычек работа датчика не гарантируется.


Используемые компоненты
Программный код для Ардуино

Код разбит на две части. В первой части находится основной код, который работает с сенсором, а во второй части находится код всех световых эффектов.

Вы можете сами добавить любой эффект по аналогии с моим кодом, но главное не забудьте добавить функцию выхода по жесту из зацикленного эффекта. Для этого нужно добавить в конце цикла, следующую строку if(check_int()) return;

Описание основных функций программы
processingGesture() обрабатывает прерывания от датчика жестов.
processingProximity() обрабатывает прерывания от датчика приближения.
gesture_int() — обработчик прерывания от датчика жестов.
proximity_int() — обработчик прерывания от датчика приближения.

Описание констант

APDS9960_INT — вход для внешнего прерывания. В Arduino Nano и UNO всего два таких входа, 2 и 3.

PIN — здесь нужно указать выход на светодиодную ленту. Можно указывать любой цифровой пин к которому подключены планки ws2812b.

NUM_PIX — здесь указываем количество адресных светодиодов в используемой ленте.
range — предел погрешности от 0 до 10. Если при регулировке яркости зафиксировать руку над датчиком на 2 сек, то показания должны сохраниться, если же показания не сохраняются, то увеличивайте постепенно предел погрешности.

Видео демонстрирующее работу светильника
Итоги

Светильник в живую выглядит лучше чем на видео. Теперь все кто увидел его у меня, просят собрать им такой же. На данный момент мне не нравится как работает регулировка яркости, но я над этим работаю. Не обещаю, что скоро, но уже в разработке следующая версия светильника.

Спасибо, что дочитали статью до конца! Если у Вас остались вопросы, можете задать в комментариях под статьей.

RGB светодиоды и ленты


400 нм (фиолетовый) до

RGB светодиоды

В качестве магазина рекомендую CHANZON, самые хорошие светодиоды и чипы/матрицы.

RGB ленты

blank

RGB светодиодные ленты устроены аналогично одноцветным лентам и RGB светодиодам: в 12 Вольтовой ленте светодиоды каждого цвета соединяются по три штуки с токоограничивающим резистором и образуют сегмент ленты, далее эти сегменты подключаются параллельно. Также лента имеет общий вывод со всех цветов, в большинстве случаев это общий анод. Почему? Помните, в уроке про управление нагрузкой я говорил, что чаще всего используют N-канальные полевые транзисторы, потому что они дешевле, удобнее в применении и имеют более удачные характеристики? Вот именно поэтому! Драйверы для RGB лент также делают на основе N-канальников, поэтому найти в продаже ленту с общим катодом даже вряд-ли получится. В качестве магазина на aliexpress рекомендую BTF Lighting , самые качественные ленты. Итак, как нам подключить RGB светодиодную ленту к Arduino? Точно так же, как обычную! Но тут я добавлю ещё несколько интересных вариантов.

MOSFET

LED Amplifier

Драйвер Н-моста

Ну и экзотический вариант: использовать полномостовой драйвер для моторов. Почему нет? Количество выходов у таких драйверов всегда кратно двум (для подключения одного мотора), так что это отличный вариант для управления также RGBW лентой. Драйверы можно найти на aliexpress по названию.

blank

blank

blank

Программирование

Программирование эффектов для управления RGB цветом заключается в изменении интенсивностей трёх цветов, то есть трёх численных значений. У меня есть мощная библиотека для RGB светодиодов и лент, в ней реализовано очень много различных удобных инструментов для работы с цветом. Например плавная смена цвета по спектру будет выглядеть вот так:

В рамках этого урока мы рассмотрим некоторые алгоритмы, потому что это интересно и может пригодиться где-то ещё.

Хранение цвета

Может пригодиться при связке Arduino и веба.

Включение цветов

Как я уже писал выше, включение того или иного цвета производится точно так же, как в уроке про обычные светодиоды. Для плавного управления яркостью используется ШИМ сигнал.

Для плавного управления цветом можно использовать потенциометры:

Цветовое колесо

Пространство HSV

На этом этапе я могу вам сказать, что после прочтения всех предыдущих уроков вы можете самостоятельно открыть и изучить исходник GyverRGB.cpp и при желании взять оттуда нужный алгоритм или эффект!

Подключение большого количества RGB

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

Светодиоды и ленты


Подключение светодиода

2.5 вольта, у синих, зелёных и белых

Мигаем

Мигаем плавно

Как насчёт плавного управления яркостью? Вспомним урок про ШИМ сигнал и подключим светодиод к одному из ШИМ пинов (на Nano это D3, D5, D6, D9, D10, D11). Сделаем пин как выход и сможем управлять яркостью при помощи ШИМ сигнала! Читай урок про ШИМ сигнал. Простой пример с несколькими уровнями яркости:

blank

Подключим потенциометр на A0 и попробуем регулировать яркость с его помощью:

Как вы можете видеть, все очень просто. Сделаем ещё одну интересную вещь: попробуем плавно включать и выключать светодиод, для чего нам понадобится цикл из урока про циклы.

Плохой пример! Алгоритм плавного изменения яркости блокирует выполнение кода. Давайте сделаем его на таймере аптайма.

Теперь изменение яркости не блокирует выполнение основного цикла, но и остальной код должен быть написан таким же образом, чтобы не блокировать вызовы функции изменения яркости! Ещё одним вариантом может быть работа по прерыванию таймера, см. урок.

Светодиод будет мигать не очень плавно: яркость будет нарастать слишком резко и практически не будет меняться. Связано это с тем, что человеческий глаз воспринимает яркость нелинейно, а мы управляем ей линейно. Для более плавного ощущения яркости используется коррекция по CRT гамме, которая переехала из этого урока в отдельный урок по миганию светодиодом по CRT гамме в блоке алгоритмов. Изучи обязательно!

Светодиодные ленты


Светодиодная лента представляет собой цепь соединённых светодиодов. Соединены они не просто так, например обычная 12V лента состоит из сегментов по 3 светодиода в каждом. Сегменты соединены между собой параллельно, то есть на каждый приходят общие 12 Вольт. Внутри сегмента светодиоды соединены последовательно, а ток на них ограничивается общим резистором (могут стоять два для более эффективного теплоотвода): Таким образом достаточно просто подать 12V от источника напряжения на ленту и она будет светиться. За простоту и удобство приходится платить эффективностью. Простая математика: три белых светодиода, каждому нужно по

3.2V, суммарно это 9.6V. Подключаем ленту к 12V и понимаем, что 2.5V у нас просто уходят в тепло на резисторах. И это в лучшем случае, если резистор подобран так, чтобы светодиод горел на полную яркость.

Подключаем к Arduino

Здесь всё очень просто: смотрите предыдущий урок по управлению нагрузкой постоянного тока. Управлять можно через реле, транзистор или твердотельное реле. Нас больше всего интересует плавное управление яркостью, поэтому продублирую схему с полевым транзистором: Конечно же, можно воспользоваться китайским мосфет-модулем! Пин VCC кстати можно не подключать, он никуда не подведён на плате.

Управление

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

Питание и мощность

Светодиодная лента потребляет немаленький ток, поэтому нужно убедиться в том, что выбранный блок питания, модуль или аккумулятор справится с задачей. Но сначала обязательно прочитайте урок по закону Ома! Потребляемая мощность светодиодной ленты зависит от нескольких факторов:

Лента всегда имеет характеристику мощности на погонный метр (Ватт/м), указывается именно максимальная мощность ленты при питании от номинального напряжения. Китайские ленты в основном имеют чуть меньшую фактическую мощность (в районе 80%, бывает лучше, бывает хуже). Блок питания нужно подбирать так, чтобы его мощность была больше мощности ленты, т.е. с запасом как минимум на 20%.

    Пример 1: нужно подключить 4 метра ленты с мощностью 14 Ватт на метр, лента может работать на максимальной яркости. 14*4 == 56W, с запасом 20% это будет 56*1.2

Важные моменты по току и подключению:

Видео

Читайте также: