Оглавление:

Светодиодное спиральное дерево: 4 шага (с изображениями)
Светодиодное спиральное дерево: 4 шага (с изображениями)

Видео: Светодиодное спиральное дерево: 4 шага (с изображениями)

Видео: Светодиодное спиральное дерево: 4 шага (с изображениями)
Видео: БОКОВУШЕЧКА У ТУАЛЕТА в плацкарте 2024, Ноябрь
Anonim
Светодиодное спиральное дерево
Светодиодное спиральное дерево
Светодиодное спиральное дерево
Светодиодное спиральное дерево
Светодиодное спиральное дерево
Светодиодное спиральное дерево

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

Шаг 1: Контроллер

Контроллер
Контроллер
Контроллер
Контроллер
Контроллер
Контроллер

Я решил использовать неадресные светодиоды RGB. Это означает, что я могу запрограммировать эффект, но все светодиоды меняют цвет одновременно. Это также означает, что потребуется контроллер. Я мог бы использовать arduino uno и провести начальные тесты с использованием экрана RGB, но в итоге я использовал специальную одиночную плату с голым чипом Atmega328. Просто нужно было переключить целевой программатор и напрямую запрограммировать чип.

У меня было много этих досок, оставшихся от других проектов с лампами. Не стесняйтесь использовать дешевый встроенный предварительно запрограммированный контроллер, как я сделал вместо этого на своем зонтике.

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

/ ** Код для перекрестного затухания 3 светодиодов, красного, зеленого и синего (RGB) * Чтобы создать затухание, вам нужно сделать две вещи: * 1. Опишите цвета, которые вы хотите отображать * 2. Перечислите желаемый порядок они исчезают * * ОПИСАНИЕ ЦВЕТА: * Цвет - это просто массив из трех процентов, 0-100, * управление красным, зеленым и синим светодиодами * * Красный - красный светодиод на полном уровне, синий и зеленый выключены * int красный = {100, 0, 0} * Тусклый белый цвет - все три светодиода на 30% * int dimWhite = {30, 30, 30} * и т.д. ПОРЯДОК: * В основной части программы вам нужно указать порядок *, в котором вы хотите, чтобы цвета отображались, например * crossFade (красный); * crossFade (зеленый); * crossFade (синий); * * Эти цвета будут отображаться в указанном порядке, переходя от * одного цвета к следующему * * Кроме того, вы можете настроить 5 дополнительных параметров: * 1. Исходный цвет установлен на черный (поэтому первый цвет исчезает. in), но * вы можете установить в качестве начального цвета любой другой цвет * 2. Внутренний цикл выполняется для 1020 взаимодействий; переменная 'wait' * устанавливает приблизительную продолжительность одного кроссфейда. Теоретически * "ожидание" в 10 мс должно привести к перекрестному затуханию ~ 10 секунд. На практике другие функции, которые выполняет код, замедляют это * до ~ 11 секунд на моей плате. YMMV. * 3. Если 'repeat' установлен на 0, программа будет повторяться бесконечно. * если установлено число, он будет повторять это количество раз, * затем остановится на последнем цвете в последовательности. (Установите для 'return' значение 1, * и сделайте последний цвет черным, если вы хотите, чтобы он исчез в конце.) * 4. Существует необязательная переменная 'hold', которая передает программе * на 'удержание' миллисекунды, когда цвет завершен, * но до начала следующего цвета. * 5. Установите флаг DEBUG в 1, если вы хотите, чтобы выходные данные отладки отправлялись на монитор последовательного порта. * * Внутренняя часть программы не сложна, но она * немного привередлива - внутренняя работа объясняется * под основным циклом. * * Апрель 2007 г., Клэй Ширки *

/ Выход

int grnPin = 9; // Зеленый светодиод, подключенный к цифровому выводу 10 int redPin = 10; // Красный светодиод, подключенный к цифровому выводу 9 int bluPin = 11; // Синий светодиод, подключенный к цифровому выводу 11

// Цветовые массивы

int black [3] = {0, 0, 0}; int white [3] = {100, 100, 100}; интервал красный [3] = {100, 0, 0}; int зеленый [3] = {0, 100, 0}; int blue [3] = {0, 0, 100}; int yellow [3] = {40, 95, 0}; int dimWhite [3] = {30, 30, 30}; // так далее.

// Устанавливаем начальный цвет

int redVal = черный [0]; int grnVal = черный [1]; int bluVal = черный [2];

интервал ожидания = 3; // внутренняя задержка CrossFade 10 мс; увеличивайте для более медленного затухания

int hold = 0; // Необязательное удержание, когда цвет завершен, перед следующим crossFade int DEBUG = 0; // счетчик ОТЛАДКИ; если установлено в 1, значения будут записываться обратно через последовательный int loopCount = 60; // Как часто следует сообщать DEBUG? интервал повторения = 0; // Сколько раз мы должны зацикливаться перед остановкой? (0 без остановки) int j = 0; // Счетчик циклов для повтора

// Инициализируем переменные цвета

int prevR = redVal; int prevG = grnVal; int prevB = bluVal;

// Настраиваем выходы светодиодов

void setup () {pinMode (redPin, ВЫХОД); // устанавливает выводы как выходные pinMode (grnPin, OUTPUT); pinMode (bluPin, ВЫХОД);

if (DEBUG) {// Если мы хотим увидеть значения для отладки…

Serial.begin (9600); //… настраиваем последовательный выход}}

// Основная программа: перечисляем порядок кроссфейдов

void loop () {crossFade (красный); crossFade (зеленый); crossFade (синий); crossFade (желтый);

if (repeat) {// Зацикливаемся ли мы конечное число раз?

j + = 1; if (j> = repeat) {// Мы уже на месте? выход (j); // Если да, остановимся. }}}

/ * НИЖЕ ЭТОЙ СТРОКИ ЯВЛЯЕТСЯ МАТЕМАТИЧЕСКИМ - ВАМ НЕ СЛЕДУЕТ МЕНЯТЬ ЭТО ДЛЯ ОСНОВ

* * Программа работает следующим образом: * Представьте себе перекрестное затухание, которое перемещает красный светодиод от 0 до 10, * зеленый от 0 до 5 и синий от 10 до 7 за * десять шагов. * Мы хотели бы считать 10 шагов и увеличивать или * уменьшать значения цвета с равномерным шагом. * Представьте, что «+» означает увеличение значения на 1, а «- *» означает его уменьшение. Наше 10-ступенчатое затухание будет выглядеть так: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + * G + + + + + * B - - - * * Красный поднимается из От 0 до 10 за десять шагов, зеленый - от * 0-5 за 5 шагов, синий - от 10 до 7 за три шага. * * В реальной программе процентные значения цвета преобразуются в * 0-255 значений, и есть 1020 шагов (255 * 4). * * Чтобы выяснить, насколько большим должен быть шаг между одним делением вверх или * вниз одного из значений светодиода, мы вызываем calculateStep (), * который вычисляет абсолютный разрыв между начальным и конечным значениями, * а затем делит этот промежуток на 1020, чтобы определить размер шага * между корректировками значения. * /

int calculateStep (int prevValue, int endValue) {

int step = endValue - prevValue; // Каков общий разрыв? if (step) {// Если не ноль, step = 1020 / step; // делим на 1020} return step; }

/ * Следующая функция - calculateVal. Когда значение цикла, i, * достигает размера шага, подходящего для одного из * цветов, он увеличивает или уменьшает значение этого цвета на 1. * (R, G и B рассчитываются отдельно.) * /

int calculateVal (int step, int val, int i) {

if ((step) && i% step == 0) {// Если step отличен от нуля и пора изменить значение, if (step> 0) {// увеличиваем значение, если step положительный… val + = 1; } else if (шаг 255) {val = 255; } иначе, если (значение <0) {значение = 0; } return val; }

/ * crossFade () преобразует процентные цвета в

* 0–255, затем выполняется 1020 циклов, проверяя, * требуется ли * значение обновлять каждый раз, а затем записывать * значения цвета на правильные контакты. * /

void crossFade (int color [3]) {

// Преобразовать в 0-255 int R = (color [0] * 255) / 100; int G = (цвет [1] * 255) / 100; int B = (цвет [2] * 255) / 100;

int stepR = CalculStep (prevR, R);

int stepG = CalculStep (prevG, G); int stepB = CalculStep (prevB, B);

для (int я = 0; я <= 1020; я ++) {redVal = calculateVal (stepR, redVal, i); grnVal = calculateVal (stepG, grnVal, i); bluVal = calculateVal (stepB, bluVal, i);

analogWrite (redPin, redVal); // Записываем текущие значения на выводы светодиода

analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal);

задержка (ждать); // Пауза на миллисекунды ожидания перед возобновлением цикла

if (DEBUG) {// Если нам нужен последовательный вывод, напечатайте его в

if (i == 0 или i% loopCount == 0) {// начало, и каждый цикл loopCount умножается на Serial.print ("Loop / RGB: #"); Serial.print (i); Serial.print ("|"); Serial.print (redVal); Serial.print ("/"); Serial.print (grnVal); Serial.print ("/"); Serial.println (bluVal); } DEBUG + = 1; }} // Обновляем текущие значения для следующего цикла prevR = redVal; prevG = grnVal; prevB = bluVal; задержка (удержание); // Пауза на необязательные миллисекунды ожидания перед возобновлением цикла}

Шаг 2: Обертывание дерева

Обертывание дерева
Обертывание дерева
Обертывание дерева
Обертывание дерева
Обертывание дерева
Обертывание дерева
Обертывание дерева
Обертывание дерева

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

Шаг 3: не забудьте звезду сверху

Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине
Не забудьте звезду на вершине

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

Шаг 4: пробуем

Image
Image

Первая попытка была слишком быстрой….

Как только я успокоился, все выглядело неплохо.

Рекомендуемые: