mail.ru
Gistroy - портативное оборудование

Управление светодиодной лентой

Дополним ваш дом умными датчиками
Управление светодиодной лентой
В данной статье будет рассмотрен способ создания разноцветной подсветки с использованием светодиодной ленты и включение ленты при присутствии человека в комнате. Для управления лентой будет использоваться плата Arduno NANO, инфракрасный приёмник(ИК) и датчик присутствия. Данная статья будет полезна для всех, кто хочет сделать освещение из светодиодной ленты и у кого нет желания нести расходы на приобретение дорогостоящих контроллеров для управления ею, так как с помощью данной платы можно обеспечить любую комбинацию цветов и режимов для светодиодной ленты. Управлять ими можно будет с помощью обычного пульта от телевизора или с помощью телефона.

Для данного проекта все компоненты можно заказать на Aliexpress, например:

  • Arduino Nano - 160р.
  • ИК приёмник с пультом - 55р.
  • Датчик присутствия HC-SR501 - 37р
  • Светодиодная лента от 200р за метр, есть и дешевле, но с поддержанием управления цветами и в ней должно быть три цвета (RGB).
  • Понадобится ещё блок питания для светодиодной ленты, но это зависит от модели ленты и питающего напряжения.

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

На рисунке выше показана схема подключения ИК приёмника, датчика и светодиодной ленты.

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

Плата Arduino имеет аналоговые, цифровые и ШИМ порты. В данном проекте мы будем использовать ШИМ порт D5 для выхода Date ИК приёмника и цифрой порт D6 для выхода OUT датчика присутствия, а ШИМ порт D3 для входа DIN светодиодной ленты.

ШИМ порты считывают значения от 0 до 255, чтобы считывать данные с ИК приёмника. Цифровые порты у нас принимают значения 0 или 1, это соответствует включению и выключению света, а в нашем случае порт считывает значение с датчика присутствия, то есть датчик определяет наличие в помещении людей. ШИМ порт передаёт на светодиодную ленту сигнал для управления цветами ленты и помогает нам делать разные комбинации оттенков. Оставшиеся разъёмы датчиков подключаются следующим образом, GND в GND, VCC в 5.

После подключения всех датчиков и светодиодной ленты можно приступить к программированию Arduino. Для нашей программы понадобиться подключить несколько библиотек (маленькие программы для простого управления датчиками).

Библиотека Adafruit_NeoPixel.h для управления светодиодной лентой.

Подробнее как её устанавливать написано на сайте http://arduino.on.kg/Adafruit_NeoPixel. Библиотека написана на C++, поддерживает светодиодные ленты и неопиксельные кольца, основанные на светодиодах WS2812 и WS2811. Из данной библиотеки нам понадобятся следующие функции:

Ардуино управление светодиодной лентой

Ардуино код:
1) Для инициализации нашей ленты и дальнейшей работы с ней, необходимо в секции setup() вызвать две команды ранее созданного объекта ленты.
strip.begin() - Функция begin() настроит порт Arduino и выставит значения по умолчанию.
strip.show() - Функция show() передаст команду на выключение всем пикселям.

2) Для того чтобы задать любому пикселю ленты определенный цвет, существует функция strip.setPixelColor(n, red, green, blue).

Где параметр:
n - Номер пикселя в ленте (отсчет идет с нуля, то есть если в вашей ленте 60 пикселей, то первый из них будет 0, а последний 59)
red - Число от 0 до 255 определяющее яркость красного светодиода в пикселе.
green - Число от 0 до 255 определяющее яркость зеленого светодиода в пикселе.
blue - Число от 0 до 255 определяющее яркость синего светодиода в пикселе.

3) Функция show() передает данные в ленту. Данную функцию необходимо вызывать каждый раз после того, как вы изменили цвета пикселей или настройки ленты.

Так же понадобится библиотека IRremote.h для ИК приёмника, чтобы приёмник мог понимать наши сигналы с пульта или телефона.Примеры работы с данной библиотекой и установка можно посмотреть по данной ссылке http://arduino.on.kg/peredacha-dannyh-v-infrakrasnom-diapazone-pri-pomoshchi-Arduino. Из данной библиотеки нам понадобятся следующие функции:

1) Функция для подключения порта ИК приёмника IRrecv irrecv(RECV_PIN).
2) Функция для приёма данных results.value присваивает переменной значение которые приходят на приёмник.

Данных библиотек нам хватит для написания нашей программы.
Создадим программу в которой будет четыре режима у светодиодной ленты:
Режим 0 – выключение светодиодной ленты.
Режим 1 – включение красного цвета на ленте, если кто-то вошёл в комнату или ходит в комнате.
Режим 2 - включение белого цвета на ленте, если кто-то вошёл в комнату или ходит в комнате.
Режим 3 – мигают случайные цвета на ленте с интервалом 200 мс.

Чтобы режимы работы светодиодной ленты не занимали в программе много места, мы создадим для них отдельные подпрограммы, которые называются mode0(), mode1(), mode2(), mode3(). Так же можно будет дополнительно создать свои режимы работы, главное фантазия.

Скетч ардуино

Ниже представлен (код - скетч) программы с пояснениями.

// Подключаем библиотеку для ИК приемника.
#include <IRremote.h>

// Подключаем библиотеку для светодиодной ленты.
#include "Adafruit_NeoPixel.h"

// Указываем пин, к которому подключен IR приемник.
IRrecv irrecv(5);
decode_results results;

// Указываем, какое количество пикселей у нашей ленты.
#define LED_COUNT 30

// Указываем, к какому порту подключен вход ленты DIN.
#define LED_PIN 3

// Создаем переменную strip для управления нашей лентой.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Создаём переменную в которую будут записываться режимы работы ленты, по умолчанию 0-й режим.
int number_mode = 0;

// Подпрограмма для принятия данных с ИК приёмника.
void setupIrReceiver()
{
irrecv.enableIRIn();
irrecv.resume();
}

// Подпрограмма для записи данных с ИК приёмника в переменную типа String.
void getIrCommand(String &receivedCommand)
{
decode_results result;
if (irrecv.decode(&result))
{
receivedCommand = String(result.value, HEX);
receivedCommand.toUpperCase();
irrecv.resume();
}
else
{
receivedCommand = "";
}
}

// Переменная в которую будут записываться данные с ИК приёмника.
String ircode = "";

// Подпрограмма для нулевого режима, для отключения всей ленты.
void mode0()
{

// Выключаем все светодиоды.
for (int i = 0; i < LED_COUNT; i++)
{
strip.setPixelColor(i,0, 0, 0); // Черный цвет, т.е. выключено.
}

// Передаем цвета ленте.
strip.show();
}

// Подпрограмма для первого режима, если кто-то в комнате ходит,то горит лента красного цвета.
void mode1()
{
number_mode = 1; // Говорим переменной, что включился первый режим.

// Если в комнате кто-то ходит, то digitalRead(6) пришлёт 1.
if(digitalRead(6)==1)
{

// Включаем все светодиоды.
for (int i = 0; i < LED_COUNT; i++)
{
strip.setPixelColor(i,255, 0, 0); // Красный цвет.
}

// Передаем цвета ленте.
strip.show();

// Задержка 500 мс.
delay(500);
}
}

// Подпрограмма для второго режима, если кто-то в комнате ходит то горит лента белого цвета.
void mode2()
{
number_mode = 2; // Говорим переменной, что включился второй режим.

// Если в комнате кто-то ходит, то digitalRead(6) пришлёт 1.
if(digitalRead(6)==1)
{

// Включаем все светодиоды.
for (int i = 0; i < LED_COUNT; i++)
{
strip.setPixelColor(i,255, 255, 255); // Белый цвет.
}

// Передаем цвета ленте.
strip.show();

// Задержка 500 мс.
delay(500);
}
}

// Подпрограмма для третьего режима, горит случайные цвета и меняются с интервалом 200мс.
void mode3()
{
number_mode = 3; // Говорим переменной, что включился третий режим.

// Включаем все светодиоды.
for (int i = 0; i < LED_COUNT; i++)
{
strip.setPixelColor(i,random(255), random(255), random(255)); // Случайный цвет.
}

// Передаем цвета ленте.
strip.show();

// Задержка 200 мс.
delay(200);
}
void setup() {

// Запускаем прием инфракрасного сигнала.
setupIrReceiver();

// Подключаем монитор порта.
Serial.begin(9600);

// Подключаем ленту.
strip.begin();
pinMode(6, INPUT); // пин 6 будет входом для датчика движения.
}
void loop() {

// Получаем код нажатой кнопки.
getIrCommand(ircode);

// Отправляем полученные данные на порт, если нажали кнопку пульта, чтобы увидеть какие значения какой кнопке соответствуют.
if (!( ircode.length() == 0 ))
{
Serial.print(ircode);
Serial.println();
}

/* С помощью последовательного порта я определил, какое значение у каждой моей кнопки пульта или пульта с телефона
* например 1 = FFA25D ; 2 = FF629D ; 3 = FFE21D ; ОК = FF38C7 и так далее.
* У каждого пульта РАЗНЫЕ ЗНАЧЕНИЯ кнопок.
* Теперь определим при нажатии на какую кнопку пульта, какой режим работы будет у светодиодной ленты.
*/

// Если придёт код кнопки OK то будет 0-й режим или если в переменной 0-й режим работы.
if (ircode == "FF38C7" || number_mode == 0)
{
mode0();
number_mode = 0; // Говорим переменной, что вкюлчился нулевой режим.
}

// Если придёт код кнопки 1 то будет 1-й режим или если в переменной 1-й режим работы.
if (ircode == "FFA25D" || number_mode == 1)
mode1();

// Если придёт код кнопки 2 то будет 2-й режим или если в переменной 2-й режим работы.
if (ircode == "FF629D" || number_mode == 2)
mode2();

// Если придёт код кнопки 3 то будет 3-й режим или если в переменной 3-й режим работы.
if (ircode == "FFE21D" || number_mode == 3)
mode3();
mode0();
}