● Проект 2: Обрабатываем нажатие кнопки на примере зажигания светодиода
Это эксперимент по работе с кнопкой. Мы будем включать светодиод по нажатии кнопки и выключать по отпускании кнопки. Рассмотрим понятие дребезга и программные методы его устранения.
Необходимые компоненты:
В данном эксперименте мы будем использовать контакт D2 Arduino в качестве входа. Это позволяет подключить к нему кнопку для взаимодействия с проектом в режиме реального времени. При использовании Arduino в качестве входов используют pull-up- и pulldown-резисторы, чтобы вход Arduino не находился в «подвешенном» состоянии (в этом состоянии он будет собирать внешние наводки и принимать произвольные значения), а имел заранее известное состояние (0 или 1). Резисторы pull-up подтягивают вход к питанию +5 В, pull-down-резисторы подтягивают вход к GND. Кроме этого, pull-up- и pull-down-резисторы гарантируют, что кнопка не создаст короткого замыкания между +5 В и землей при нажатии. В нашем эксперименте для подключения кнопки мы будем использовать pulldown-резистор. Схема подключения представлена на рис. 2.1.
Рис. 2.1. Схема подключения кнопки и светодиода
Когда кнопка отключена, вход D2 будет подтянут к «земле» через резистор номиналом 10 кОм, который будет ограничивать поток тока, и на входном контакте будет установлено значение напряжения LOW. При нажатии на кнопку входной контакт напрямую связан с 5 В. Большая часть тока будет протекать по пути наименьшего сопротивления через замкнутую кнопку, и на входе генерируется уровень HIGH. При нажатии на кнопку включаем светодиод, при отпускании – гасим.
Код данного скетча приведен в листинге 2.1.
const int LED=10; // вывод для подключения светодиода 10 (D10) void setup() < // Конфигурируем вывод подключения светодиода как выход (OUTPUT) pinMode(LED, OUTPUT); > void loop() < // включаем светодиод, подавая на вывод 1 (HIGH) digitalWrite(LED,HIGH); // пауза 1 сек (1000 мс) delay(1000); // выключаем светодиод, подавая на вывод 0 (LOW) digitalWrite(LED,LOW); // пауза 1 сек (1000 мс) delay(1000); >
Порядок подключения:
1. Длинную ножку светодиода (анод) подключаем к цифровому выводу D10 Arduino, другую (катод) – через резистор 220 Ом к выводу GND (см. рис. 2.1).
2. Один вход кнопки подключаем к +5 В, другой – через резистор 10 кОм к GND, выход кнопки подключаем к входу D2 Arduino (см. рис. 2.1).
3. Загружаем в плату Arduino скетч из листинга 2.1.
4. При нажатии на кнопку светодиод должен гореть, при отпускании – затухнуть.
Усложним задачу – будем переключать состояние светодиода (включен/выключен) при каждом нажатии кнопки. Загрузим на плату Arduino скетч из листинга 2.2.
const int LED=10; // Контакт 10 для подключения светодиода const int BUTTON=2; // Контакт 2 для подключения кнопки int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния // к нопки boolean ledOn = false; // Текущее состояние светодиода (включен/выключен) void setup() < // Сконфигурировать контакт светодиода как выход pinMode (LED, OUTPUT); // Сконфигурировать контакт кнопки как вход pinMode (BUTTON, INPUT); > void loop() < tekButton=digitalRead(BUTTON); if (tekButton == HIGH && prevButton == LOW) < // нажатие кнопки – изменить состояние светодиода ledOn=!ledOn; digitalWrite(LED, ledOn); > prevButton=tekButton; >
При нажатии кнопки светодиод должен изменять свое состояние. Но это будет происходить не всегда. Виной тому – дребезг кнопок.
Кнопки представляют из себя механические устройства с системой пружинного контакта. Когда вы нажимаете на кнопку вниз, сигнал не просто меняется от низкого до высокого, он в течение нескольких миллисекунд меняет значение от одного до другого, прежде чем контакты плотно соприкоснутся и установится значение HIGH.
Микроконтроллер зафиксирует все эти нажатия, потому что дребезг неотличим от настоящего нажатия на кнопку. Устранить влияние дребезга можно программно. Алгоритм следующий:
1. Cохраняем предыдущее состояние кнопки и текущее состояние кнопки (при инициализации LOW).
2. Cчитываем текущее состояние кнопки.
3. Если текущее состояние кнопки отличается от предыдущего состояния кнопки, ждем 5 мс, потому что кнопка, возможно, изменила состояние.
4. После 5 мс считываем состояние кнопки и используем его в качестве текущего состояния кнопки.
5. Если предыдущее состояние кнопки было LOW, а текущее состояние кнопки HIGH, переключаем состояние светодиода.
6. Устанавливаем предыдущее состояние кнопки для текущего состояния кнопки.
7. Возврат к шагу 2. Добавляем к нашему скетчу подпрограмму устранения дребезга.
Получаем код, показанный в листинге 2.3.
const int LED=10; // Контакт 10 для подключения светодиода const int BUTTON=2; // Контакт 2 для подключения кнопки int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния // к нопки boolean ledOn = false; // Текущее состояние светодиода (включен/выключен) void setup() < // Сконфигурировать контакт светодиода как выход pinMode (LED, OUTPUT); // Сконфигурировать контакт кнопки как вход pinMode (BUTTON, INPUT); > // Функция сглаживания дребезга. Принимает в качестве // аргумента предыдущее состояние кнопки и выдает фактическое. boolean debounce(boolean last) < boolean current = digitalRead(BUTTON); // Считать состояние кнопки, if (last != current) // если изменилось. < delay(5); // ждем 5 м с current = digitalRead(BUTTON); // считываем состояние кнопки return current; // возвращаем состояние кнопки > > void loop() < tekButton = debounce(prevButton); if (prevButton == LOW && tekButton == HIGH) // если нажатие. < ledOn = !ledOn; // инвертировать значение состояния светодиода > prevButton = tekButton; digitalWrite(LED, ledOn); // изменить статус состояния светодиода >
Загружаем скетч в плату Arduino и проверяем работу. Теперь все работает нормально, каждое нажатие кнопки приводит к изменению состояния светодиода.
Листинги программ скачать
Управление СДЛ по цифровому протоколу DMX, DALI
DMX и DALI — цифровые протоколы управления светом, чаще всего используются в театрах, концертных залах, ресторанах и в различных системах интерьерного освещения, в системах «умный дом». При управлении цифровыми протоколами, в дополнение к контроллеру используется декодер, который преобразует цифровой сигнал в привычный аналоговый ШИМ (широтно-импульсная модуляция). Схема подключения представлена на рис. 1. В данном случае существует единая система управления, на которой человек способен задать нужную программу (световой сценарий) управления светом, затем этот сценарий преобразуется в цифровой сигнал и передается на декодеры, объединенные в одну сеть (рис. 1).

Рис. 1. Схема управления светом по цифровому протоколу на примере DMX
Цифровые протоколы дают возможность управлять каждым источником света, можно проигрывать световые сцены. Это удобно для театров, т. к. светооператор с одного пульта управляет всеми световыми приборами. Также это удобно, для больших квартир и офисов, где интересно сформировать различные световые сценарии. Например: одной клавишей включить закарнизную подсветку и все остальные осветительные приборы, создав максимально яркое освещение для активной деятельности, а другой клавишей включить закарнизную подсветку на 30% яркости совместно с торшерами без люстр, создав приглушенный свет для спокойной обстановки. Имеется возможность объединения в одну сеть различного светового оборудования: светильники, одноцветные светодиодные ленты, многоцветные светодиодные ленты RGB, прожекторы, лампы — как светодиодные, так и накаливания или люминесцентные. Еще одно преимущество цифровых протоколов — возможность передавать сигнал на большие расстояния. Например, если у нас расстояние между различными участками светодиодных лент 100 м, то в этом случае управляющий сигнал нужно передавать в цифровом формате. Аналоговый придет от контроллера до усилителя ослабленным, традиционные усилители для диодных лент усиливают ток, а не напряжение, поэтому ленты будет светить тусклее. Если расстояние контроллер–усилитель значительно больше 30 м, советуем также задуматься об использовании цифровых протоколов управления. Бывают световые приборы (светильники и светодиодные ленты), в которые уже встроены цифровые декодеры, то есть мы подключаем управляющий кабель (DMX, DALI) и питающий кабель. Таких типов светильников достаточно много, хотя большинство и не имеет цифровых протоколов управления. А вот светодиодных лент с цифровым управлением бывают редко, есть с DMX, но нам никогда не встречался с DALI, поэтому основное управление светодиодными лентами по цифровому протоколу обычно осуществляется через декодеры. Использование декодеров распространено, есть даже системы, способные передавать декодерам сигнал без проводов по радиоканалу.
По материалам статьи «Управление светом в системах освещения на светодиодных лентах»
Журнал «Полупроводниковая светотехника» N3, 2017 led-e.ru
Автор статьи Сергеев П. А. сотрудник компании СветоЯр.
Arduino.ru
Включение-выключение светодиода одной и той же кнопкой без фиксации.
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 16:09
Зарегистрирован: 18.09.2011
Вобщем программить я толком еще не начал даже наверно 🙂 так, склеиваю куски примеров 🙂
Вопрос такой: Ребят, помогите написать скетч по принципу:
есть 2 светодиода. изначальное состояние — LOW.
pin 2,3 пусть будут кнопки.
при нажатии pin2 загорается диод1, при повторном нажатии диод1 гаснет.
с pin3 и диодом2 картина та же. Работать они должны независимо.
Ну и плюс учесть дребезг контактов. Никак немогу определиться с алгоритмом (точнее просто немогу начать)
Кнопка без фиксации.
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 23:09

Зарегистрирован: 15.04.2011
Первое что пришло в голову.
Возможно можно и уменьшить код или сделать его более красивым.
Если так то напишите. И мне интересно!
int ledPin1 = 13; // сетодиод1 int btnPin1 = 3; // кнопка1 int ledPin2 = 12; // сетодиод2 int btnPin2 = 2; // кнопка2 int val=0; int na=0; int sw=0; int codduble; int val2=0; int na2=0; int sw2=0; int codduble2; int button[] = < btnPin1, btnPin2>; int Led[] = < ledPin1, ledPin2>; void setup() < pinMode(ledPin1, OUTPUT); pinMode(btnPin1, INPUT); pinMode(ledPin2, OUTPUT); pinMode(btnPin2, INPUT); Serial.begin(9600); >void loop() < val = digitalRead(btnPin1); val2 = digitalRead(btnPin2); if(val==HIGH&&na==0) < if(sw==0) < sw=1; codduble=val; na=1; digitalWrite(ledPin1, HIGH); >else < sw=0; codduble=val; na=1; digitalWrite(ledPin1, LOW); >> if(val2==HIGH&&na2==0) < if(sw2==0) < sw2=1; codduble2=val2; na2=1; digitalWrite(ledPin2, HIGH); >else < sw2=0; codduble2=val2; na2=1; digitalWrite(ledPin2, LOW); >> if (codduble==val) < na=1; >else na=0; if (codduble2==val2) < na2=1; >else na2=0; delay(10); >
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 22:06
Зарегистрирован: 18.09.2011
Взяли готовый код из соседней ветки, малость его перелопатили, взяли отдельно 2 кнопки на подтягивающих резисторах и вместо светодиодов взяли пару реле. Ну не суть 🙂
int i = 0;
int k = 0;
int val = 0;
int k1 = 0;
int val1 = 0;
int state = 0;
int old_val = 0;
int state1 = 0;
int old_val1 = 0;
void setup() Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
>
void loop() //digitalWrite(13, HIGH);
val = digitalRead(7);
val1 = digitalRead(8);
old_val = val; // val is now old, let’s store it
old_val1 = val1; // val is now old, let’s store it
if (state == 1) digitalWrite(6, HIGH); // turn LED ON
> else digitalWrite(6, LOW);
>
if (state1 == 1) digitalWrite(6, HIGH); // turn LED ON
> else digitalWrite(6, LOW);
>
//здесь все выполняеться корректно
switch (k) case 0:
digitalWrite(10, LOW);
break;
case 1:
digitalWrite(10, HIGH);
break;
delay(50);
digitalWrite(10, LOW);
break;
default:
k=0;
break;
>
switch (k1) case 0:
digitalWrite(9, LOW);
break;
case 1:
digitalWrite(9, HIGH);
break;
delay(50);
digitalWrite(9, LOW);
break;
default:
k1=0;
break;
>
// все бы хорошо.. но когда выполняеться 1 раз, все шикарно. Но когда по второму кругу идет то не смотря на то что в case 0 все пины выключены. горит аналогично case 1. case 2 выполняесться уже нормально.
// Serial.print(«Knopka1 «);
//digitalWrite(13, LOW);
delay(100);
Код еще не допилен, лишнее не убрано, но схема запустилась.
p.s. работали под пивом 🙂 С Дружбаном на пару )
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 22:07
Зарегистрирован: 18.09.2011
LEVV2006 Ваш код завтра рассмотрю детально. В данный момент уже моск нехочет думать адекватно 🙂
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:49
nestandart

Зарегистрирован: 15.06.2011
Это что у вас такое ?
Вот рабочая программа (на вскидку набросал).
Поймите общие принцыпы , они вам в будещем очень пригодяться.
int knopka=0; int knopka2=0; void setup () < pinMode(13,OUTPUT); pinMode(12,OUTPUT); pinMode(9,INPUT); pinMode(8,INPUT); >void loop ()/***************КНОПКА 1********************************// if(digitalRead(8)==HIGH&&knopka==0)//если кнопка нажата // и перемення "knopka" равна 0 , то . < delay(50);//защита от дребезга knopka++;//пишем 1 в переменную кнопка //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие digitalWrite(13, !digitalRead(13));//меняем значение порта на противоположное > if(digitalRead(8)==LOW&&knopka==1)//если кнопка НЕ нажата //и переменная knopka равна - 1 ,то . < knopka=0;//обнуляем переменную "knopka" >//***********************КНОПКА 2*****************************// if(digitalRead(9)==HIGH&&knopka2==0)//если кнопка нажата // и перемення "knopka2" равна 0 , то . < delay(50); knopka2++;//пишем 1 в переменную кнопка //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие digitalWrite(12,!digitalRead(12)); >if(digitalRead(9)==LOW&&knopka2==1)//если кнопка НЕ нажата //и переменная knopka2 равна - 1 ,то . < knopka2=0;//обнуляем переменную "knopka2" >>
От модератора: Поправил вывод кода. Пожалуйста пользуйтесь кнопкой вставки кода. Вторая кнопка наверху, рядом с кнопкой Источник. Так же легче читать код.
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:21
Зарегистрирован: 18.09.2011
Пасибо, сейчас обязательно просмотрю этот скетч. именно на примерах и приходится учиться, ибо так понятнее )))
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:30

Зарегистрирован: 15.04.2011
Привольно приму к сведению))))
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:43
nestandart

Зарегистрирован: 15.06.2011
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:50
nestandart

Зарегистрирован: 15.06.2011
Я кое что поправил . в общем могут быть чисто «орфаграфические» ошибки (из — за невнимательности).
- Войдите на сайт для отправки комментариев
Втр, 20/09/2011 — 00:46
Зарегистрирован: 25.04.2010
nestandart пишет:
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
Если навести курсор на код, то справа на уровне первых строчек возникнет меню из четырех кнопок, вторая кнопка сохраняет весь код в буфер обмена без номеров строчек — очень удобно.
- Войдите на сайт для отправки комментариев
Втр, 20/09/2011 — 03:23
nestandart

Зарегистрирован: 15.06.2011
Модератору. Спасибо , не знал.
- Войдите на сайт для отправки комментариев
Сб, 10/12/2011 — 21:34
Зарегистрирован: 02.07.2011
Вот нашел в стандартных примерах похожий код.
- Войдите на сайт для отправки комментариев
Втр, 20/12/2011 — 14:30
Зарегистрирован: 03.12.2011
- Войдите на сайт для отправки комментариев
Пт, 03/04/2015 — 10:51
Зарегистрирован: 03.04.2015
http://youtu.be/wezPs_jxPQg вот мой принцып отыграл на протеусе работу скейча, одна кнопка и два светодиода , в скейче придусмотрен дребезг кнопки на ложное срабатывание , Порядок такой нажимаем кнопку загорается светодиод 1 и через заданное время он гаснет, нажимаем ещё раз — загорается второй светодио и гаснет через заданное время , всё прекрасно работает
* Включение одной кнопкой 2х нагрузок по переменки с автовыключением
int switchPin = 2; // замыкание кнопки на минус через резист pin 2
int led1Pin = 12; // нагрузка 1
int led2Pin = 11; // нагрузка 2
int val; // Переменная для чтения статуса контактный
int val2; // Переменная для чтения с задержкой / подавлением дребезга контактов статус
int buttonState; // Переменная провести состояния кнопки
int lightMode = 0; // Есть свет включен или выключен?
void setup() <
pinMode(switchPin, INPUT); // Установите пин в качестве входных данных
pinMode(led1Pin, OUTPUT); // Установите пин в качестве выходных данных
pinMode(led2Pin, OUTPUT); // Установите пин в качестве выходных данных
Serial.begin(9600); // Установите последовательную связь в 9600
buttonState = digitalRead(switchPin); // читать начальное состояние
val = digitalRead(switchPin); // читать входное значение и сохранить его в Val
delay(10); // 10 миллисекунд хорошее количество времени
val2 = digitalRead(switchPin); // читать ввод снова, чтобы проверить отскоков
if (val == val2) < // убедиться, что мы получили 2 показания последовательны!
if (val != buttonState) < // состояние кнопки изменилось!
if (val == LOW) < // проверить, если нажата кнопка
if (lightMode == 0) < // эта нагрузка включена?
lightMode = 1; // включить нагрузку 1
digitalWrite(led1Pin, HIGH); // нагрузка включена
delay(2000); // время до автовыключения
digitalWrite(led1Pin, LOW); // нагрузка выключается
lightMode = 0; // выключить нагрузку 2
digitalWrite(led2Pin, HIGH); // нагрузка включена
delay(2000); // время до автовыключения
digitalWrite(led2Pin, LOW); // нагрузка выключается
buttonState = val; // сохранить новое значение в нашей переменной
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 — 01:39
Зарегистрирован: 03.02.2017
Подскажите молодому, а то в глазах рябит.
К ардуино подключен приемник на 433 Мгц. При нажатии 1 раз кнопки на радиопульте — светодиод загорается. При повторном нажатии -светодиод выключается. Этот скетч имеется, тут я понял. Состояние пина инертируется с каждым нажатием. Так вот, если постоянно удерживать кнопку на радиопульте (приемник принимает код с периодичностью наверно 400-450мс) и светодиод постоянно мигает.
Вопрос, как сделать, что бы хоть при однократном нажатии, хоть при удержании любое время кнопки на радиопульте и последующем отпускании — светодиод загорелся, а при повторном нажатии этой же кнопки на радиопульте (либо удержании с последующим отпусканием) -выключился.
#include RCSwitch mySwitch = RCSwitch(); int led = 12; void setup() < pinMode(12, OUTPUT); mySwitch.enableReceive(0); // Receiver on inerrupt 0 =>that is pin #2 > void loop() < if (mySwitch.available()) < unsigned long value = mySwitch.getReceivedValue(); Serial.print(value); switch (value) < case 0: Serial.println(" - Unknown encoding"); break; case 2276802: digitalWrite(led, !digitalRead(led)); break; default: Serial.println(" - EROR"); >mySwitch.resetAvailable(); > >
- Войдите на сайт для отправки комментариев
Пнд, 06/03/2017 — 19:38
Зарегистрирован: 06.03.2017
Доброго времмени суток! Подскажите пожалуйста,как написать подобный скетч(управлением 2-х реле от 2-х кнопок. каждая кнопка при одном нажатии включает и отключает одно реле,при этом не машает работе другой паре — реле и кнопка! порядок запуска реле должен быть не зависимым друг от друга).
- Войдите на сайт для отправки комментариев
Пнд, 06/03/2017 — 19:45
Зарегистрирован: 03.07.2016
maks_452 Ну где-то так. Полный скетч здесь https://yadi.sk/d/Kzqip-WK3Eoc7h
Головной файл посмотреть
/* class_module_Led.ino #1 светодиод ->13 #2 кнопка 1 -> 2 вкл светодиод #3 кнопка 2 -> 3 светодиод мигает #4 кнопка 3 -> 4 выкл светодиод */ // #1 светодиод #include "Cl_module_led.h" const byte led1_pin = 13; Cl_module_led Led1(led1_pin); // создать // #2 кнопка #include "Cl_module_do_btn.h" const byte btn1_pin = 2; Cl_module_do_btn Btm1(btn1_pin); // создать void Do_Btm1() < Led1.ON(); >// #3 кнопка const byte btn2_pin = 3; Cl_module_do_btn Btm2(btn2_pin); // создать void Do_Btm2() < Led1.OFF(); >// #4 кнопка const byte btn3_pin = 4; Cl_module_do_btn Btm3(btn3_pin); // создать void Do_Btm3() < Led1.blink(); >void setup() < //#1 светодиод Led1.T_blink = 500; // частота мигания Led1.logic = 1;// зажигать светодиод если на выводе 0 Led1.setup(); //#2 кнопка 1 Btm1.setup(); //#3 кнопка 2 Btm2.setup(); //#4 кнопка 3 Btm3.setup(); >void loop() < // #1 светодиод Led1.loop(); // #2 кнопка 1 Btm1.loop(& Do_Btm1); // #3 кнопка 2 Btm2.loop(& Do_Btm2); // #4 кнопка 3 Btm3.loop(& Do_Btm3); >
- Войдите на сайт для отправки комментариев
Вс, 13/08/2017 — 11:35
Зарегистрирован: 13.08.2017
Загружаю на ардуино пишет ошибка
Arduino: 1.8.3 (Windows 7), Плата:»Arduino/Genuino Uno»
sketch_aug13c_knopka_2:16: error: invalid digit «8» in octal constant
sketch_aug13c_knopka_2:18: error: invalid digit «9» in octal constant
sketch_aug13c_knopka_2:2: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:4: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:6: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:10: error: expected initializer before numeric constant
sketch_aug13c_knopka_2:24: error: expected unqualified-id before numeric constant
exit status 1
invalid digit «8» in octal constant
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
в чем проблема?
мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось
Помогите пожалуйста
- Войдите на сайт для отправки комментариев
Вс, 13/08/2017 — 13:14
Зарегистрирован: 03.07.2016
IK10 пишет:
мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось
Помогите пожалуйста
1 вы неправильно скопировали код сайта
2- в даном случае надо качать с яндекс диска
3- этот код отличается от вашей хотелки.
Вот ваш код
/**/ uint32_t mill;// переменная под millis() //---------Cl_Led---------------------------------- //класс светодиод class Cl_Led < uint8_t bit ; // номер бита в виде 00010000,1 находится там где выход volatile uint8_t *reg; // указатель на регистр настройки порта volatile uint8_t *out; // указатель на регистр входа порта bool inv;// состояние бита инверсии выхода bool stat;// 1 мигать / 0 нет unsigned long past, time; public: /* конструктор Cl_Led Описание создает класс Ввод pin: подключение к ноге inv: бит инвертирования 0 нет / 1 инверсия Вывод нет */ Cl_Led (uint8_t pin, uint8_t _inv = 0): inv(_inv) < bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); // получить номер порта reg = portModeRegister(port); out = portOutputRegister(port); >/* Функция setup Описание иницирование класса Ввод нет Вывод нет */ void setup() < uint8_t oldSREG = SREG; cli(); *reg |= bit; if (inv) *out &= ~bit; else *out |= bit; SREG = oldSREG; stat = 0; >/* Функция OFF Описание выключить светодиод Ввод нет Вывод нет */ void OFF() < uint8_t oldSREG = SREG; cli(); if (inv) *out &= ~bit; else *out |= bit; SREG = oldSREG; stat = 0; >/* Функция ON Описание включить светодиод Ввод нет Вывод нет */ void ON() < uint8_t oldSREG = SREG; cli(); if (inv) *out |= bit; else *out &= ~bit; SREG = oldSREG; stat = 0; >/* Функция blink Описание мигать светодиодои Ввод _time - полупериод мигания Вывод нет */ void blink(unsigned long _time = 500) < time = _time; stat = 1; past = mill; uint8_t oldSREG = SREG; cli(); *out ^= bit; SREG = oldSREG; >/* Функция loop Описание для нормальной работе разместить в loop программы Ввод нет Вывод нет */ void loop() < if (!stat) return; if (mill - past >= time) < past = mill; uint8_t oldSREG = SREG; cli(); *out ^= bit; SREG = oldSREG; >> >; //------Cl_Btn------------------------------------------ // класс кнопка c програмной подтяжкой class Cl_Btn < uint8_t bit ; // номер бита в виде 00010000,1 находится там где выход volatile uint8_t *reg; // указатель на регистр настройки порта volatile uint8_t *out; // указатель на регистр выхода порта uint8_t port; // номер порта на выводе const byte pin; void (*Do1)(), (*Do2)(); bool btn, btn_old, btn_new; bool bounce = 0; // антидребезговый флаг uint32_t past = 0 ; public: /* конструктор Cl_Btn Описание создает класс Ввод pin: подключение к ноге _Do1: фунция обработчик нажатия кнопки _Do2: фунция обработчик отжатия кнопки Вывод нет */ Cl_Btn(byte pin, void (*_Do1)(), void (*_Do2)()): Do1(_Do1), Do2(_Do2) < bit = digitalPinToBitMask(pin); port = digitalPinToPort(pin); // получить номер порта reg = portModeRegister(port); out = portOutputRegister(port); >/* Функция setup Описание иницирование класса Ввод нет Вывод нет */ void setup() < uint8_t oldSREG = SREG; cli(); *reg &= ~bit; //INPUT *out |= bit; //PULLUP SREG = oldSREG; btn_old = (*portInputRegister(port) & bit) == 0; >/* Функция loop Описание для нормальной работе разместить в loop программы Ввод нет Вывод нет */ void loop() < btn_new = (*portInputRegister(port) & bit) == 0; if (! bounce && btn != btn_new) < // если прошел фронт изм на выводн bounce = 1; // выставить флаг past = mill; // сделать временую засветку >else if ( bounce && mill - past >= 5 ) < // если прошло антидребезговое время bounce = 0; // то снять флаг btn_old = btn ; btn = btn_new ; // прочитать реальное значение на выводе if (btn_old && ! btn)(*Do1)(); if (!btn_old && btn)(*Do2)(); >> >; //-------------компоновка----------------------------------- Cl_Led Led1(/*пин*/13,/*инв*/1); void Do1_Btn1() < Led1.ON(); >void Do2_Btn1() < Led1.OFF(); >Cl_Btn Btn1(/*пин*/2,/*обраб наж*/Do1_Btn1,/*обраб отж*/Do2_Btn1); //-------------main()----------------------------------- void setup() < Led1.setup(); Btn1.setup(); >void loop() < mill = millis(); Led1.loop(); Btn1.loop(); >/*Скетч использует 1308 байт (4%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 47 байт (2%) динамической памяти, оставляя 2001 байт для локальных переменных. Максимум: 2048 байт. */
Кнопку подлючать земля вывод, без резистора.
Управление светом в системах освещения на светодиодных лентах
В статье описаны системы управления светом, излучаемым светодиодными лентами. Рассмотрены распространенные схемы подключения, описаны «подводные камни», которые могут возникнуть на пути специалиста, осуществляющего монтаж и эксплуатацию систем управления светом.
Закарнизная подсветка на светодиодных лентах (СДЛ) присутствует почти в каждом современном интерьере, причем вписывается она в любой стиль — будь то классика, ампир или «хайтек». Всей этой красотой часто хочется управлять — к примеру, сделать иногда яркость поменьше, чтобы создать «интим», включить только группу светильников согласно определенному сценарию, или выбрать цвет освещения, подходящий под настроение. Все это позволяют сделать многоцветные RGB СДЛ.
Общие подходы к управлению светом СДЛ
СЛД чаще всего питаются напряжением 12 или 24 В, и процесс управления светом сводится к управлению этим напряжением. Для этого используют специальные контроллеры и диммеры (рис. 1).
Рис. 1. Внешний вид устройства управления СДЛ: а) диммер; б) контроллер
Напомним, что диммеры — это устройства управления, позволяющие регулировать яркость свечения СДЛ, а контроллеры — устройства управления, позволяющие управлять многоцветной СДЛ, с их помощью мы можем выбрать любой цвет и нужную интенсивность свечения, задать какой-либо динамический световой эффект.
Подключение
СДЛ подключаются к устройству управления (контроллер или диммер), которое запитывается от блока питания (БП) постоянного напряжения. Оператор задает управляющую команду при помощи пульта дистанционного управления (ПДУ), кнопок на корпусе контроллера (диммера), при помощи смартфона (если есть управление по Wi-Fi) или при помощи запрограммированных сценариев управления освещением. Важно, чтобы мощность контроллера или диммера была не меньше потребляемой мощности системы СДЛ, а БП по мощности минимум на 20% превышал потребности СДЛ.
Есть ряд проблем, часто встречающихся при подключении диммеров и контроллеров.
При их работе БП зачастую начинает издавать писк, причем это случается даже при использовании дорогих и качественных устройств. Как с этим бороться?
Можно использовать БП в металлическом герметичном корпусе (рис. 2).
Рис. 2. Блок питания ТМ Arlight для СДЛ в герметичном металлическом корпусе
Тогда писк, издаваемый БП, не будет слышен: корпус блока не пропускает звуковую волну в окружающую среду. Эффект защиты от писка можно увеличить, если расположить БП в каком-то небольшом закрытом пространстве — обычно в гипсокартонных конструкциях можно найти такие места. В этом случае гипсокартон выполняет функцию дополнительной звукоизолирующей оболочки. Описанный метод борьбы с шумом достаточно распространен, хотя, на наш взгляд, он далеко нс идеален. Правильно было бы решать эту проблему производителям при изготовлении контроллеров и БП, а не монтажникам — электрикам уже на месте установки. Но, вероятно, экономия на элементной базе и технологических процессах приводит к таким последствиям.
Проблема совместимости оборудования
Иногда разные системы управления, которые совместимы в рамках одного стандарта, работают некорректно. Приведем случай из практики. На объекте были установлены регуляторы какого-то малоизвестного производителя для диммеров по стандарту 1-10 В. Затем этот регулятор подключали к контроллеру ТМ Arlight, к которому были подключены СДЛ. В итоге на минимальном уровне освещения наблюдались заметные глазу пульсации света. Но когда к этому диммеру подключили регулятор (1—10 В) той же торговой марки, то эти пульсации, прекратились. Советуем по возможности использовать оборудование одного производителя, иначе, в случае несовместимости, придется производить его замену. Также советуем, прежде чем монтировать оборудование в стены и потолки, подключить его по схеме на рабочем столе и проверить работу.
Схемы подключения диммеров
На рис. 3 представлена простая схема подключения ленты с мощностью в пределах мощности диммера.
Рис. 3. Простое подключение светодиодной ленты через диммер
Диммер питается от БП постоянным напряжением, на СДЛ от диммера поступает уменьшенное напряжение. Управляющие команды приходят от ПДУ. Вместо ПДУ можно использовать и проводные системы передачи управляющего сигнала. Распространено два метода передачи сигнала по кабелю: с использованием традиционных светорегуляторов, предназначенных для ламп накаливания па симисторах (triac), и с использованием светорегуляторов со стандартом 1-10 В (0-10 В).
Симисторные (triac) регуляторы света используются для диммирования обычных ламп накаливания, схема подключения такого диммера представлена на рис. 4.
Рис. 4. Схема подключения симисторного (triac) диммера
Диммер регулирует яркость подключенной к нему светодиодной ленты от 0 до 100%, получая от симисторного регулятора яркости напряжение в диапазоне 40-220 В АС. Это напряжение, в данном случае, является сигналом управления и не используется для питания СДЛ. Лента получает питание от стабилизированного источника напряжения 12 или 24 В.
Необходимо учитывать, что многие светорегуляторы рассчитаны на работу только с лампами накаливания или галогенными лампами и могут некорректно работать со светодиодным оборудованием. Нужно использовать светорегуляторы, предназначенные для работы с электронными балластами. Перед монтажом рекомендуется проверить совместную работу диммера и светорегулятора.
Достоинство симисторного управления светом состоит в распространенности таких регуляторов, почти каждый производитель электроустановочных изделий их выпускает.
Второй метод передачи управляющего сигнала по кабелю использует так называемый интерфейс 0-10 В (1-10 В). Схема подключения диммеров, работающих с этим стандартом для СДЛ, представлена на рис. 5.
Рис. 5. Схема подключения диммера по стандарту 0-10 В
Данный стандарт специально разработан для управления регулируемыми светотехническими приборами: диммерами, диммируемыми БП (драйверами), электронными пускорегулирующими аппаратами. При изменении управляющего напряжения от 0 до 10 В диммер на выходе меняет питающее СДЛ напряжение в диапазоне 0-100%. При напряжении сигнала ниже 1 В диммер (или диммируемый драйвер) снижает выходную мощность до нуля, а при напряжениях порядка 9,5-10 В выходная мощность максимальна. Для производителей диммеров работа с таким стандартом логична и понятна, но производители электроустановочных изделий выпускают такие регуляторы реже, чем симисторные (triac), и не всегда удается подобрать необходимый по внешнему виду регулятор.
Но данный интерфейс все же достаточно перспективный, он позволяет создавать системы с лучшей плавностью регулирования, и более безопасный, так как используется низкое напряжение.
Если вы собираетесь подключать СДЛ мощностью больше, чем мощность диммера, то следует использовать усилитель. Рассмотрим схему подключения СДЛ с одноканальным усилителем (рис. 6).
Рис. 6. Подключение СДЛ через одноканальный усилитель
БП подает напряжение на усилитель и диммер. Одна часть ленты подключается напрямую к диммеру, а другая — через одноканальный усилитель мощности. В данной схеме усилитель питается от БП, к которому подключен диммер, но можно также усилитель питать от отдельного БП. Лучше всего использовать два усилителя, чтобы вся нагрузка была на усилителях, а диммер был бы без нагрузки, как показано на рис. 7.
Рис. 7. Подключение СДЛ через два одноканальных усилителя
Подключение через два одинаковых усилителя дает более правильную нагрузку, таким образом, исключается вероятность задержки по времени и разницы в яркости между разными участками СДЛ. Желательно использовать электрический кабель одинаковой длины и сечения.
Разумеется, по принципу данной схемы можно подключать и большее количество СДЛ через большее количество усилителей.
Иногда для усиления мощности диммируемой системы используются трехканальные RGB-усилители, которые в первую очередь предназначены для подключения многоцветных СДЛ RGB. Рассмотрим схему подключения СДЛ через многоканальный RGB-усилитель (рис. 8).
Рис. 8. Подключение через многоканальный RGB – усилитель
Сигнал от диммера подается на вход усилителя, при этом «+» от диммера подается на «+» усилителя, а «-» с диммера подается на «-» трех входов усилителя. То есть входные клеммы «-» R (красный), «-» G (зеленый) и «-» Б (синий) замкнуты между собой.
Обращаем ваше внимание, что выходные сигналы ни в коем случае не должны замыкаться между собой, иначе усилитель может выйти из строя. На каждый выход усилителя подключается отдельный участок СДЛ, как показано на рис. 8. Более совершенная схема подключения представлена на рис. 9.

Рис. 9. Оптимальное подключение большого количества светодиодных лент через RGB-усилители
Схемы управления многоцветными СДЛ RGB
Сперва рассмотрим наиболее простую последовательность подключения СДЛ, как показано на рис. 10.
Рис. 10. Простое подключение многоцветной RGB СДЛ
БП постоянным напряжением питает контроллер, который способен получать управляющие команды от ПДУ. RGB СДЛ подключаем к контроллеру.
В случае если мощность RGB-лент больше мощности контроллера и, соответственно, БП, используем усилитель. На схеме (рис. 11) показано подключение через многоканальный усилитель. Один участок СДЛ питается от контроллера, а другой — от усилителя сигнала.
Рис. 11. Схема подключения RGB-ленты через усилитель
Здесь есть важный момент. При выборе определенных цветов свечения СДЛ бывают случаи, когда наблюдается разница цветов участка ленты, подключенного к контроллеру, с участком, подключенным к усилителю. На рис. 12 показан пример различия по оттенку свечения СДЛ.
Рис. 12. Пример различия по оттенку свечения ленты
Также возможно различие во времени срабатывания между этими участками СДЛ при включении системы.
Возникает данное явление из-за различия вольт-амперных выходных параметров контроллера и усилителя. Также влияние может оказать слишком большая разница между длиной проводов от участка, подключенного к контроллеру, с участком подключения через усилитель. Чтобы избежать подобного, нужно производить подключение по схеме, как показано на рис. 13.
Рис. 13. Оптимальная схема подключения RGB-лент через усилители
Использовать нужно кабель питания (от усилителей до СДЛ) приблизительно одинаковой длины.
На схеме показано подключение двух усилителей, которые питаются от одного БП. Благодаря установке усилителя на каждую СДЛ в итоге мы получаем одинаковые цвета и оттенки на всех участках. Еще нужно учесть необходимость применять усилители одного производителя и одной модели.
Если у вас большое количество СДЛ и их мощность превышает мощность БП, следует использовать несколько БП, при этом на каждый усилитель можно подключить свой БП, а контроллер может питаться от любого БП, т. к. в данной схеме он не нагружен и будет потреблять крайне малое количество электроэнергии. На схеме (рис. 14) показано данное подключение.

Рис. 14. Оптимальная схема подключения RGB-лент через усилители с раздельным питанием
Также нужно быть осторожным с проводами, подключенными к СДЛ, избегая их замыкания. Результат такой ошибки проявляется постоянным свечением светодиодов на поврежденном канале, без какой-либо реакции на управляющие команды от ПДУ. Поэтому при сборке и наладке многоцветных RGB-систем надо следить особенно внимательно за тем, чтобы проводники не создавали замыканий даже на короткое время. В RGB-лентах такое замыкание возникает чаще, так как контактные площадки расположены близко друг к другу.
Управление СДЛ по цифровому протоколу SPI
Этот цифровой протокол управления заслуживает отдельного внимания, так как он распространен для СДЛ. Протокол позволяет отдельно управлять каждым светодиодом, появляется возможность получать интересные эффекты, такие как «бегущие огни», «северное сияние», можно даже собрать экран или «бегущую строку».
Система на SPI СДЛ показана на рис. 15. От БП (обычно 5 или 12 В) мы питаем контроллеры и SPI СДЛ.
Рис. 15. Схема подключения SPI СДЛ
Такие СДЛ оснащены микросхемами, которые декодируют цифровой сигнал в аналоговый, пригодный для работы светодиодов.
При выборе управляющих контроллеров важно учесть количество RGB- пикселей: если для SPI-ленты заявлено 300 пикселей, то и контроллер должен поддерживать не менее 300 пикселей. Пиксель — это минимальная многоцветная единица управления, то есть это один или несколько RGB-светодиодов, которые в момент времени способны иметь одинаковыми цвет и интенсивность свечения. Чаще всего 1 пиксель = 1 RGB-светодиод, бывают системы 1 пиксель = 3 RGB-светодиода или 1 пиксель = 6 RGB-светодиодов. Важно понимать, что для создания экрана нужно выбирать СДЛ, где 1 пиксель = 1 RGB СДЛ, иначе на трех или шести диодах изображение будет растянутым. При подключении SPI-лент нужно учитывать направление распространения сигнала, оно обозначено стрелкой на печатной плате (рис. 15, 16).
Рис. 16. Фрагмент SPI СДЛ
Управление СДЛ по цифровому протоколу DMX, DALI
DMX и DALI — цифровые протоколы управления светом, чаще всего используются в театрах, концертных залах, ресторанах и в различных системах интерьерного освещения, в системах «умный дом». Схемы и общие принципы схожи с описанными выше, с одной лишь разницей, что в дополнение к контроллеру используется декодер, который преобразует цифровой сигнал в привычный аналоговый ШИМ (широтно-импульсная модуляция). Схема подключения представлена на рис. 17.
Рис. 17. Система управления светом по цифровому протоколу на примере DMX
В данном случае существует единая система управления, на которой человек способен задать нужную программу (световой сценарий) управления светом, затем этот сценарий преобразуется в цифровой сигнал и передается на декодеры, объединенные в одну сеть (рис. 15).
Преимущества цифровых протоколов для управления освещением
Цифровые протоколы дают возможность управлять каждым источником света, можно проигрывать световые сцены. Это удобно для театров, т. к. светооператор с одного пульта управляет всеми световыми приборами. Также это удобно для больших квартир и офисов, где интересно сформировать различные световые сценарии, например: одной клавишей включить закарнизную подсветку и все остальные осветительные приборы, создав максимально яркое освещение для активной деятельности, а другой клавишей включить закарнизную подсветку на 30% яркости совместно с торшерами без люстр, создав приглушенный свет для спокойной обстановки. Имеется возможность объединения в одну сеть различного светового оборудования: светильники, одноцветные СДЛ, многоцветные СДЛ RGB, прожекторы, лампы — как светодиодные, так и накаливания или люминесцентные.
Еще одно преимущество — возможность передавать сигнал на большие расстояния. Например, если у нас расстояние между различными участками СДЛ 100 м, то в этом случае управляющий сигнал нужно передавать в цифровом формате. Аналоговый придет от контроллера до усилителя ослабленным, традиционные усилители для СДЛ усиливают ток, а не напряжение, поэтому СДЛ будет светить тусклее. Если расстояние контроллер — усилитель значительно больше 30 м, советуем также задуматься об использовании цифровых протоколов управления.
В заключение посоветуем перед созданием управляемой светотехнической системы при покупке оборудования получить консультацию и доверять монтаж квалифицированному персоналу.
Источник
Журнал «Полупроводниковая светотехника» 2017
© «СИТИ Эксклюзив», 2018
«Gorod LED» — крупнейший российский интернет магазин оптовой и розничной торговли электронными компонентами, светотехническим оборудованием и комплектующими на основе светодиодов.
Самый широкий ассортимент продукции ведущих мировых и российских светотехнических компаний в наличии на складах в семи городах миллионниках.
Мы предоставляем полный комплекс услуг по проектированию и монтажу систем освещения.
Работаем на рынке светодиодного оборудования более 10 лет.
Есть вопрос? Мы поможем — +7 (495) 414-23-18
- Помощь покупателю
- Как купить?
- Оплата и доставка
- Гарантия и возврат товара
- Информация для покупателя
- Акции и скидки
- Новости
- Статьи
- Всё о свете
- О компании
- О компании
- Выполненные работы
- Политика безопасности
- Документы
Бесплатные звонки по России тел.: 8-800-234-54-05