Светильник управляемый по usb arduino код

Светильник управляемый по usb arduino код

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

  • В этой программе мы создаем объект класса 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)»
  • Пустая строка обозначается так: «» . Опустошив ее, мы готовы собирать новую последовательность символов.
  1. Какие объекты позволяют легко манипулировать текстовыми данными?
  2. Что возвращают методы Serial.available() и Serial.read() ?
  3. Чем отличаются конструкции for и while ?
  4. Каким образом можно организовать более сложное ветвление, чем if … else ?
  5. Как можно объединить текстовые строки?
  6. Как можно привести текстовую строку, содержащую цифры, к числовому типу?
  1. Проверьте, попадает ли переданное число в диапазон значений, которые нужно передавать в analogWrite() . Передайте на компьютер сообщение об ошибке, если нет.
  2. Переделайте программу так, чтобы устройство распознавало текстовые команды, например, «on» и «off», и соответственно включало и выключало светодиод.

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

Источник

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

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

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

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

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

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

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

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

Читайте так же:  Флуоресцентный или люминесцентный светильник разница

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

Прерывания APDS9960

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

Сначала попробовал исправить проблему изменениями в железе. Фильтрация питания не помогла, даже от аккумулятора 18650 датчик все равно продолжал жить своей жизнью. Попробовал переключить нагрузочный резистор сигнала INT на +5В и это тоже не принесло успеха.

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

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

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

Итоги

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

Читайте так же:  Гарантийные обязательства по светильникам

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

Источник

USB-LED-Светильник. Схема с Регулировкой Яркости

Интерфейсный разъём USB сейчас используется повсеместно, начиная от ПК и ноутбуков и заканчивая ЗУ для гаджетов. Сама аббревиатура USB расшифровывается как Universal Serial Bus — универсальная последовательная шина. Напряжение питания, которое можно снять с такого разъёма — 5 В , а ток, в зависимости от типа используемого устройства может достигать 3 А , и даже больше.

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

Схема, которую я хочу предложить Вашему вниманию — это светильник на шести последовательных светодиодах белого свечения с током 350 мА и возможностью регулировки их яркости.

Схема представляет из себя повышающий импульсный преобразователь на таймере 555 . Переменным резистором R2 регулируют скважность прямоугольных импульсов с выхода 3 DA1 . Импульсы управляют открытием n- канального mosfet -транзистора VT1 . По сути, транзистор VT1 это электронный ключ, при открытии которого через L1 протекает электрический ток, а при закрытии, накопившаяся энергия с индуктивности отдаётся в нагрузку. И в зависимости от скважности, итоговое напряжение на светодиодах будет изменятся, чем и обеспечивается регулировка их яркости свечения. Частота генератора в данной схеме равна примерно 10 кГц , а заполнение регулируется от 0 до 80 % .

Источник

Светильник управляемый по USB

Просмотр содержимого документа
«Светильник управляемый по USB»

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

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

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

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

// для работы с текстом существуют объекты-строки (англ. string)

// передаваемые с компьютера данные поставляются байт за

// байтом, в виде отдельных символов (англ. character). Нам

// нужно последовательно их обрабатывать пока (англ. while)

// в порту доступны (англ. available) новые данные

// считываем (англ. read) пришедший символ в переменную

char incomingChar = Serial.read();

// не стоит путать целые числа и символы. Они соотносятся

// друг с другом по таблице, называемой кодировкой. Например

// ‘0’ — это 48, ‘9’ — 57, ‘A’ — 65, ‘B’ — 66 и т.п. Символы

// в программе записываются в одинарных кавычках

if (incomingChar = ‘0’ && incomingChar ‘9’) <

// если пришёл символ-цифра, добавляем его к сообщению

// если пришёл символ новой строки, т.е. enter, переводим

// накопленное сообщение в целое число (англ. to integer).

// Так последовательность символов ‘1’, ‘2’, ‘3’ станет

// числом 123. Результат выводим на светодиод

// обнуляем накопленное сообщение, чтобы начать всё заново

// посылайте сообщения-числа с компьютера через Serial Monitor

В этой программе мы создаем объект класса 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)»

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

Источник

Оцените статью
Охраны в доме нет
Adblock
detector