Как сделать плавное затухание светодиода в ардуино
Эффект линейного затухания измеряет яркость светодиода линейно. Это означает что время задержки постоянно для всех шагов.
На схеме выглядит следующим образом:
Данный пример доступен на GitHub.
Чтоб изменить время мирцания нужно добавить значение в строчку 63.
Пример №2
В данном примере светодиод плавно загорается и затухает (как будто дышит). В данном эффекте используется логарифмическая шкала для времени задержки.
Эффект логарифмического затухания изменяет яркость светодиода в логарифмическом масштабе. Это означает, что время задержки является результатом вычисления натурального логарифма для всех шагов (см. Таблицу ниже).
Для изменения времени задержки затухания нам нужно установить дополнительное время линейной задержки в милисекундах. (69тая строчка)
Я хотел показать это все на .jpg анимации, но к сожалению если делать хорошее качество, то анимация очень много весит, а если качество уменьшать то не видно разница в эффектах.
В этом уроке мы узнаем: как подключить кнопку к ардуино, как подавить дребезг контактов, как в прошивке обработать нажатие на кнопку, как послать ШИМ сигнал, как создать свою функцию и как управлять светодиодом.
В этом уроке используются следующие детали:
Большая макетная плата на 1600 точек с 4 шинами питания: | Купить |
Набор резисторов из 100 штук на все случаи: | Купить |
Набор светодиодов из 100 штук: | Купить |
5 штук кнопок в удобной форме: | Купить |
Соединительные провода 120 штук: | Купить |
Подключение кнопки к Arduino
Подключение кнопки к Arduino
Как видите, ничего сложно в подключении кнопки к ардуино нет. Обратите внимание, что кнопка установлена так, что каждый ее контакт подключен к разным линиям макетной платы. Так же вы можете заметить резистор на 10 кОм который притягивает контакт к земле. Это нужно для того, что бы мы на 8 контакте не ловили наводок. Попробуйте убрать этот резистор из схемы. Светодиод будет загораться при шевелении проводов или кнопки. Теперь давайте рассмотрим скетч:
В этом уроке, как и прошлом, в самом начале мы объявляем переменные со значениями пинов к которым у нас подключены кнопка и светодиод. Далее в функции setup() мы обозначаем какой пин используется как вход, а какой как выход. В функции loop() мы используем условный оператор if с оператором сравнения и проверяем приходит ли на пин 8 высокий сигнал. Если да то включаем светодиод, если нет то выключаем. Описание функций и операторов вы найдете в справочнике по языку программирования Arduino
Теперь немного усложним наш код. Давайте сделаем так, что бы при нажатии на кнопку светодиод загорался и гас только при следующем нажатии на кнопку. Для этого в схеме мы менять ничего не будем, а скетч теперь будет выглядеть так:
В этом скетче мы добавили переменные для хранения состояния светодиода и кнопки. Так же мы создали новую функцию для подавления дребезга контактов debounse(). Код в цикле loop() тоже немного изменился. Теперь в условном операторе мы проверяем нажата ли кнопка и если нажата, то меняем состояние светодиода на противоположное. Потом меняем переменную с последним состоянием на текущее состояние кнопки и включаем или выключаем светодиод.
Понравилось? Давайте еще больше усложним наш проект. Теперь мы будем управлять яркостью светодиода. Для этого нам надо немного изменить схему нашего устройства. Для управления яркостью мы будем использовать ШИМ. Значит нам надо подключить светодиод к выходу, который может выдавать ШИМ. Теперь наша схема будет выглядеть вот так:
Подключение светодиода к Arduino
Теперь светодиод подключен к 11 пину ардуино, которой умеет делать ШИМ. И нам пришлось добавить токоограничивающий резистор на 220 Ом перед светодиодом, что бы его не спалить. Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В. Теперь посмотрим что нужно изменить в скетче:
В этом примере мы изменили значение переменной ledPin на 11. Так же добавили переменную для хранения уровня ШИМ ledLevel. При нажатии на кнопку будем увеличивать эту переменную. Функция debounce() осталась без изменений. В цикле мы теперь используем функцию analogWrite().
Вот и все! Сегодняшний урок на этом мы закончим. Надеюсь вам все было понятно. Если нет, то можете задавать свои вопросы в комментариях ниже.
24 комментариев
Здравствуйте)))
Подскажите пожалуйста новечьку,
Как можно реализовать такой скечь
При нажатии на кнопку светодиод плавно загорается если нажать ещё раз на кнопку то светодиод плавно тухнет…?
// переменные с пинами подключенных устройств
int switchPin = 8;
int ledPin = 11;
// переменные для хранения состояния кнопки и светодиода
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;
void setup() pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
>
// функция для подавления дребезга
boolean debounse(boolean last) boolean current = digitalRead(switchPin);
if(last != current) delay(5);
current = digitalRead(switchPin);
>
return current;
>
void loop() currentButton = debounse(lastButton);
//первый цикл, постепенно включает светодиодик
if(lastButton == LOW && currentButton == HIGH) for(int i=ledLevel;i 255) ledLevel = 0;
>
currentButton = debounse(lastButton);
//второй цикл, постепенно выключает светодиодик
if(lastButton == LOW && currentButton == HIGH) for(int i=ledLevel;i>0;i=i-1) ledLevel = ledLevel — 1;
delay(100);
analogWrite(ledPin, ledLevel);>
//if(ledLevel > 255)
ledLevel = 0;
>
Очевидно при нажатии на кнопку в цикле менять значение ledLevel
Денис что такое ledlevel?
//Как можно реализовать такой скечь
//При нажатии на кнопку светодиод плавно загорается если нажать ещё раз на кнопку то светодиод плавно тухнет…?
/*== к примеру, вот так ==*/
// переменные с пинами подключенных устройств
int switchPin = 8;
int ledPin = 11;
// переменные для хранения состояния кнопки и светодиода
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;
// настройка изменения яркости
int deltaLevel = 5; // Шаг изменения яркости
int sign = 1; // Знак шага
int step_delay = 100; // задержка в шаге изменения яркости светодиода
// настройка сигнализатора окончания изменения яркости
int max_blink = 3; //число морганий светодиода на pin13 (LED_BUILTIN)
int blink_delay = 500; //задержка состояния светодиода на pin13 (LED_BUILTIN)
void setup()
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);// потушим светодиод на pin13 (LED_BUILTIN)
>
// функция для подавления дребезга
boolean debounse(boolean last)
boolean current = digitalRead(switchPin);
if(last != current)
delay(5);
current = digitalRead(switchPin);
>
return current;
>
МУЖЧИНЫ кто согласится написать скетч за вознаграждение,к примеру на телефон.
Всем привет! Помогите, пожалуйста разобраться со скетчем.
Есть 3 кнопки, есть 3 светодиода. Каждая кнопка отвечает за свой светодиод. Алгоритм работы такой:
Нажали кнопку 1 — плавно загорелся светодиод 1. Отпустили кнопку 1 — плавно потух светодиод 1.
Нажали кнопку 2 — плавно загорелся светодиод 2. Отпустили кнопку 2 — плавно потух светодиод 2.
Нажали кнопку 3 — плавно загорелся светодиод 3. Отпустили кнопку 3 — плавно потух светодиод 3.
Реализовал скетч следующим образом:
void setup()
pinMode(button1, INPUT); //настариваем пин кнопки на вход
pinMode(led1, OUTPUT); //настариваем пин светодиода на выход
light1 = 0; //задаем переменную для хранения последнего состояния света
>
void loop()if(digitalRead(button1) == LOW) //если кнопка нажата
if(light1 == 0) //и если свет не был включен
for(int i=0; i =0; i--) //плавно гасим его
analogWrite(led1, i);
delay(10);
>
light1 = 0; //и передаем значение переменной, что свет выключен
>
>
>
И точно так же для Button2 Led 2 и Button 3 Led 3
Все работает, светодиоды плавно разгораются и тухнут, но есть одна проблема.
Пока разгорается/гаснет один из светодиодов, микроконтроллер не воспринимает другие команды. Например:
Быстро нажимаем подряд 1, 2, 3 кнопки. Сначала разгорается первый, потом второй, и только потом третий.
Вопрос: как реализовать независимую работу этих 3х каналов розжига? Нужно, чтобы во время розжига одного можно было разжигать/тушить остальные.
В современных домохозяйствах большинство устройств (лампочки, телевизоры, кондиционеры и т.д.) запитываются от напряжения переменного тока. Мы можем управлять включением и выключением этих устройств с помощью платы Arduino и реле, эти способы управления домашними электронными устройствами рассматривались на нашем сайте в проектах автоматизации дома. Но если нам нужно не просто управлять процессами включения/выключения устройств, а нужно еще, к примеру, регулировать яркость свечения лампы или частоту вращения вентилятора, то здесь нам необходимо использовать методы управления фазами и статические переключатели наподобие симисторов (TRIAC) для управления фазами напряжение переменного тока.
В данной статье мы рассмотрим создание регулятора силы света (диммера, dimmer) лампы переменного тока на основе платы Arduino и симистора. Для переключения режимов лампы переменного тока мы будем использовать симистор (TRIAC) – быстродействующий электронный переключатель, наиболее хорошо подходящий для проектов подобного вида.
На нашем сайте вы можете также посмотреть проекты, в которых использовалась регулировка силы света:
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Оптопара MCT2E (купить на AliExpress).
- Оптопара MOC3021 (купить на AliExpress).
- Симистор (TRIAC) BT136 (купить на AliExpress).
- Понижающий трансформатор (12-0V, 500mA) (купить на AliExpress).
- Резисторы 1 кОм, 10 кОм, 330 Ом (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Лампа переменного тока с держателем (патроном).
- Соединительные провода.
Методика обнаружения перехода через ноль
Для управления напряжением переменного тока первое, что мы должны уметь делать – это обнаруживать переходы через ноль сигнала переменного тока. Следовательно, в каждый момент времени, когда этот сигнал переходит через ноль, мы должны переключать симистор. Момент перехода через ноль сигнала переменного тока показан на следующем рисунке.
Принцип работы симистора
Симистор (симметричный триодный тиристор, в англ. TRIAC) представляет собой переключатель переменного тока с тремя выводами, который можно переключить при помощи подачи отпирающего импульса на его управляющий вывод (затвор). Но в отличие от других подобных переключателей, которые проводят ток в одном направлении, симистор может управлять током в обоих направлениях. В нашем проекте мы будем использовать симистор BT136.
Принцип управления симистора переменным током показан на следующем рисунке.
Как показано на рисунке, мы можем переключать, к примеру, симистор на угле 90 градусов при помощи подачи отпирающего импульса на его управляющий вывод. В этом случае мы будем подавать ток на лампу только в половине времени положительной полуволны сигнала (на графике время t1), соответственно, лампа будет гореть вполовину мощности. Уменьшая или увеличивая это время мы можем заставить лампу гореть ярче или тусклее.
Частота сигнала переменного тока в нашей сети составляет 50 Гц, соответственно, период сигнала равен 1/f =20 миллисекунд. Значит, половина периода будет равна 10 мс. Поэтому мы можем изменять время t1 на приведенном графике для управления яркостью свечения лампы переменного тока в диапазоне от 0 до 10 мс (10000 мкс).
Оптопара
Оптопару (оптрон) также называют оптоизолятором. Она используется для изоляции друг от друга двух электрических цепей постоянного или переменного тока. Принцип ее действия достаточно прост: светодиод внутри нее излучает инфракрасный свет, а фотодатчик обнаруживает его. В нашем проекте мы будем использовать оптопару MOC3021 для управления лампой переменного тока, с помощью платы Arduino, использующей сигналы постоянного тока.
Схема проекта
Схема регулятора силы света (диммера) на Arduino и симисторе представлена на следующем рисунке.
Схема соединения симистора и оптопары показана на следующем рисунке.
Эту схему мы собрали на перфорированной плате, у нас получилась конструкция следующего вида:
Оптопару MCT2E и соединения с ней мы также разместили на перфорированной плате и подсоединили ее к понижающему трансформатору.
Конструкция всего проекта в сборе выглядит следующим образом:
Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу проекта, приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода.
В самом начале программы нам необходимо объявить используемые глобальные переменные. Симистор у нас подключен к контакту 4 платы Arduino. В переменной dim_val мы будем хранить значение шага диммирования (регулирования силы света), который мы далее будем использовать в программе.
Одно из первых заданий, которое выполняет начинающий электротехник-программист, — мигание светодиодом (LED). Чтобы выполнить задачу, нужно не только написать скетч, но и произвести правильное подключение светодиода к Ардуино.
Особенности подключения
Диод — полупроводниковый прибор, обладающий такими особенностями:
Полярность светодиодов
При прямом включении анод светодиода подсоединяют к точке с большим потенциалом, а катод — с меньшим. Конструктивно анод и катод можно различить по длине вывода:
Если перепутать порядок включения, то велика вероятность пробоя диода. Это происходит, когда обратное напряжение превышает напряжение пробоя. В результате чего светодиод просто перегорит.
На вольт-амперной характеристике участок обратного включения находится в левом нижнем квадранте.
Ограничение напряжения
В техпаспорте каждой модели LED указано, что прямое напряжение, при котором прибор зажигается, составляет 2-4 В. Большее напряжение подавать на диод нецелесообразно.
Диод боится силы тока, превышающей 20 мА. Чтобы контролировать показатель, последовательно с источником перед анодом включается токоограничительный резистор (необязательно мощный). Его номинал рассчитывается по закону Ома: сопротивление — это отношение напряжения к силе тока. Напряжение — величина, поступающая на анод. Ток выбирается по наибольшему значению в паспорте прибора.
Схемы подключение к плате
Подключение диода к плате Ардуино Нано, или Уно, или любой другой модели производится следующим образом: питание -> резистор -> светодиод -> общий провод. Для подключения лампы, например, потребуется собрать более сложную схему с преобразователями сигнала.
Чтобы убедиться в необходимости токоограничительного резистора, а также контролировать все параметры соединения, можно установить различные датчики и модули:
- Амперметры. Один прибор включается последовательно до резистора, а другой — между резистором и светодиодом.
- Вольтметр. Включается параллельно диоду. Показывает напряжение, которое падает на диоде (в открытом и запертом состоянии LED оно разное).
Диод можно подключить и к синусоидальному источнику питания. Но гореть он будет только половину от общего времени, потому что отрицательную полуволну он не пропустит. В таком случае нелишним будет подключить последовательно или встречно-параллельно с LED диод, который ограничит амплитуду переменного сигнала.
Пошаговая инструкция по подключению
Подключить LED к Arduino можно двумя методами:
- Через макетную плату.
- Через пайку элементов.
Для работы с макетной платой понадобятся:
Инструкция по подключению:
- Провод одним концом подключается к контакту, с которого будет подаваться питание, а другим — к гнезду на сборочном поле макетной платы.
- Последовательно питанию в гнездо макетного поля подключается резистор (полярность не важна).
- Последовательно с резистором подключается светодиод (анодом к резистору).
- Катод LED заводится на вывод GND платы.
Достоинство первого метода — простота, недостаток — слабый контакт между элементами. Преимущество второго способа подключения — надежный контакт между компонентами, недостаток — необходимость нагрева платы и элементов паяльником, что повышает риск теплового пробоя любого компонента.
Мигать LED на Arduino может и без подключения периферии. В плате есть встроенный светодиод, который можно настроить на любой режим работы.
Все тесты лучше проводить на макетной плате.
Библиотека команд
Чтобы зажечь светодиод, нужно:
- В функции инициализации void setup() обозначить нужный вывод как выход (например: pinMode(13, OUTPUT); ).
- В бесконечном цикле void loop() подать высокий уровень сигнала на выбранный вывод (например: digitalWrite(13, HIGH); ).
Помигать этим элементом можно, если с нужной частотой зажигать и тушить LED. Частоту можно задать либо с помощью задержек [delay(*время в миллисекундах*)], либо с помощью таймера и обработчика прерывания.
Скетчи для управления
Скетчи — коды, который формируют прошивки для процессора Arduino. Они пишутся в среде программирования и загружаются либо через SPI-программатор, либо через USB (есть специальные версии плат с микросхемой CH340, позволяющие загружать код через этот интерфейс).
Код, который зажигает светодиод:
Скетч, который мигает светодиодом светодиод:
На Ардуино плавное включение светодиода организуется при помощи ШИМ. Этим же способом управления можно производить изменение яркости горения LED.
Код для плавного включения светодиода:
Читайте также: