Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Умная лампочка

Ввведение:

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

Перечень элементов используемых в проекте:

-  Инфракрасный передатчик (ИК светодиод);

-  Инфракрасный приёмник;

-  Ардуино уно;

-  Ардуино нано;

-  2 бредборда;

-  8 модулей кнопок;

-  Зуммер (пищалка, баззер);

-  Модуль RGB-светодиода;

Практическая часть

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

1.  Передатчик (пульт).

2.  Приёмник (к нему будет подключаться лампочка).

Передатчик основан на ИК-светодиоде, который исполняет роль излучателя сигнала, и наборе кнопок (8шт), каждая из которых задаёт количество импульсов, которые пошлёт передатчик, а так же ардуино уно, который считывая нажатия на кнопки будет посылать через ИК-светодиод – сигнал. В среде S4A мы можем использовать лишь два цифровых входа ардуино – D2 и D3, что естественно для наших целей недопустимо, так как пульт должен иметь восемь кнопок. Решается этот вопрос очень просто, мы можем задействовать аналоговые входы, которых у нас шесть и считывать аналоговое значение 0, когда кнопка не нажата и аналоговое значение 255, когда нажата. Модули кнопки основаны на инверсной логике и имеют по три вывода (s, vcc,-). При прямом подключении в цифровой или аналоговый вход мы получим значение инверсное необходимому. То есть если используется цифровой вход, нажатие на кнопку будет переводить значение на пине в false, а при отпущенной кнопке значение будет true. В случае же аналогового входа при нажатой кнопке мы получим аналоговое значение на пине равное 0, в противном случае значение будет равным 255. Что бы облегчить работу, было решено поменять полярность кнопок (поменять + и – местами, сделав таким образом инверсию инверсии) и в итоге мы можем снимать не инвертированные значения. ИК-светодиод подключен к земле и цифровому выходу ардуино D13.

НЕ нашли? Не то? Что вы ищете?

Схема передатчика (пульта)

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

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

2.  rgb-светодиод выключится и зуммер так же подаст сигнал.

3.  Яркость красного цвета выростет на 10 единичных значений. Например если аналоговое значение ровнялось 50, после нажатия на кнопку оно стане равным 60.

4.  Яркость красного цвета опустится на 10 единичных значений.

5.  Яркость зелёного цвета выростет на 10 единичных значений.

6.  Яркость зелёного цвета опустится на 10 единичных значений.

7.  Яркость синего цвета выростет на 10 единичных значений.

8.  Яркость синего цвета опустится на 10 единичных значений.

Приёмник принимает посланные с пульта импульсы, считает их количество и основываясь на полученных данных выполняет определённые манипуляции над rgb-светодиодом. Для создания приёмника были использованы ИК-приёмник (элемент чувствительный к инфракрасному излучению), ардуино нано для управления процессом, rgb-светодиод и зуммер, который будет подавать сигнал при включении и отключении светодиода.

ИК-приёмник имеет три вывода (+,s,-). Вывод S подключен к цифровому входу ардуино D8 (Данная часть проекта делалась на С++, потому мы сами выбираем рабочую конфигурацию порта). Данный модуль передаёт контроллеру инвертное значение (когда приёмник ничего не принимает, значение на входе - true), однако здесь нельзя менять полярность, так как приёмник подобно диоду может быть подключен лишь в одном направлении (минус к минусу, плюс к плюсу), потому решать это нужно программно.

Зуммер подключен к аналоговому выходу ардуино D6 и питанию. Зуммер работает на принципах ШИМ, единица и ноль постоянно меняются тем самым постоянно меняя изгиб пластинок колебающих воздух издавая тем самым звук.

rgb-светодиод минусом подключен в землю на ардуино, а тремя входами отвечающими за цвет и яркость – к аналоговым выходам ардуино. r – D10, g – D9, b – D11. Подавая различные аналоговые значения на эти пины мы можем менять яркость каждого отдельного цвета и цвета всего светодиода комбинируя яркости его составляющих.

Схема приёмника

Реализация программной части

Фактически мы имеем два устройства (передачик и приёмник), каждое из которых управляется своим ардуино. Соответственно мы имеем две программы:

1.  Программа передатчика реализована в среде S4A на языке Scretch

Программа имеет две переменные:

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

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

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

2.  Программа приёмника

Программа приёмника написана на языке С++, а это значит, что мы сами решаем, какую роль (вход/выход) будет исполнять тот или иной цифровой порт.

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

Каждому сегменту светодиода мы можем задавать яркость. Будем сохранять яркость каждого цветового сегмента в отдельной переменной.

Так же создаём переменные указывающие на пины подключения сигнальных контактов зуммера и ИК-приёмника.

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

Далее перейдём в блок «setup», в котором установим режимы работы наших портов указав, будут они выполнять роль входов или выходов.

Затем можем переходить в блок «loop», который являет собой аналог знакомого нам из S4A блока «всегда», то есть – вечный цикл. Здесь описан алгоритм работы программы, и работает он следующим образом:

1.  Срабатывает программа лишь после первого считывания сигнала с ИК-приёмника

·  if() – проверка выполнения условия заданного в скобках.

·  digitalRead(ik) – считываем цифровое (1/0, true/false, HIGH/LOW) значение с порта, на который указывает переменная ik. То есть на пин D8.

·  == - проверка равенства левого и правого аргументов

И того представленный фрагмент кода можно буквально прочитать, как ”если значение на цифровом порте ik в низком уровне, то…”.

Почему в низком? Потому, что наш ИК-датчик имеет инверсную логику, то есть в состоянии покоя он отправляет сигнал высокого уровня и digitalRead(ik) имеет значение HIGH. А когда приёмник ловит ИК луч с передатчика, значение digitalRead(ik) соответственно становится LOW.

2.  После считывания первого сигнала идёт цикл, который считает количество последующих сигналов. Его работа основана на том, что при получении сигнала программа считает количество миллисекунд до того, когда мы перестанем сигнал получать. То есть нужно вернуться в начало программы и объявить новую переменную, которая будет в себе хранить это время

Непосредственно ожидание прекращения получения сигнала

Далее идёт проверка значения высчитаного времени. Если это значение больше 30мс (защита от случайных вспышек), мы увеличиваем наш счётчик сигналов на единицу с помощью оператора инкремента “++” и выставляем счётчик времени в значение 0.

Затем мы ждём пока не будет получен новый сигнал или время ожидания не выйдет за приемлемые рамки

И весь блок счёта сигналов имеет следующий вид

3.  Следующим этапом является проверка значения счётчика сигналов и выполнение заданных манипуляций над светодиодом.

Проверяем оператором “if/else if”, где if – если, а else if – иначе если.

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

Если значение переменной s равно единице, выставляем переменные отвечающие за яркость в значение 128 (середина доступного диапазона от 0 до 255) оператором присваивания “=”, после чего отправляем данные значения на порты, к которым подключен светодиод с помощью функции analogWrite(pin, value). Когда светодиод зажёгся, выполняется инструкция включающая пищалку. Подождав одну секунду с помощью функции delay(ms), пищалка выключается.

Иначе, если значение s равно двум, выполняем те же действия, только переменные отвечающие за яркость выставляем в 0, выключая тем самым наш светодиод.

Иначе, если значение s равно тройке, увеличиваем имеющееся значение яркости красного сегмента светодиода на 10 единиц

Иначе, если значение s равно четырём, уменьшаем имеющееся значение яркости красного сегмента светодиода на 10 единиц

Иначе, если значение s равно пяти, увеличиваем имеющееся значение яркости зелёного сегмента светодиода на 10 единиц

Иначе, если значение s равно шести, уменьшаем имеющееся значение яркости зелёного сегмента светодиода на 10 единиц

Иначе, если значение s равно семи, увеличиваем имеющееся значение яркости синего сегмента светодиода на 10 единиц

Иначе, если значение s равно восьми, уменьшаем имеющееся значение яркости синего сегмента светодиода на 10 единиц

4.  И в конце переводим значения счётчиков сигнала и времени в 0 для следующей итерации блока «loop»

Заключение:

В этом проекте дети научились дистанционному взаимодействию и основам ИК-связи двух устройств. Так же нами успешно была реализована идея проекта – правление цветом и яркостью освещения с помощью пульта дистанционного управления. Данный прототип является лишь идеей, однако при наличии большего количества комплектующих, и навыках декорирования можно создавать светильники и системы освещения. Дети научились использовать аналоговые входы в качестве цифровых (при необходимости), а так же часть детей ознакомилась с основами программирования на более гибком и функциональном языке С++, научились менять конфигурацию порта (вход/выход), а так же познакомились с основными операторами языка С++ и управляющими блоками среды разработки Arduino.