Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Увидев проект маленького светодиодного куба настроения, созданный Эрлом, я решил сделать улучшенную версию светодиодного куба настроения. Моя версия будет более сложной, чем исходная, так как она будет немного больше исходной, будет иметь на два цвета больше по сравнению с исходным кубом (добавлены желтый и белый), иметь бесконечное количество вращений цветов и т. Д. Это хороший проект по дальнейшему использованию светодиодных фонарей для тех, кто понимает концепцию соединения светодиодных фонарей с помощью проводов.
Шаг 1: материалы
Вот некоторые материалы, которые вам понадобятся для изготовления этого куба настроения:
- Макетная плата
- Ардуино - (у меня здесь Леонардо)
- Блок питания Arduino / USB-кабель
- Макетная плата
- Провода перемычки (их много, я использовал 29 проводов)
- Красный светодиод x 2
- Синий светодиод x 2
- Зеленый светодиод x 2
- Желтый светодиод x 2
- Белый светодиод x 1
- 9 резисторов
- Коробка достаточно большая, чтобы уместить макет (я использовал коробку из-под обуви)
- Универсальный нож
- Бумага
Шаг 2: Код
Некоторое объяснение приведенного здесь кода:
Кредит кодов принадлежит первоисточнику моего проекта, поскольку редактор проекта создал эти коды. Я просто улучшил некоторые из них, сделав их более сложными. В некоторых кодах вы можете увидеть // 改 в конце. Это означает, что этот код редактируется мной, поэтому он отличается от моего исходного кода.
У меня также есть версия кода на Arduino Creator.
/ * Код для перекрестного затухания 3 светодиода, красный, зеленый и синий (RGB) Чтобы создать затухание, вам нужно сделать две вещи: 1. Описать цвета, которые вы хотите отобразить 2. Перечислить порядок, в котором вы хотите, чтобы они затухали
ОПИСАНИЕ ЦВЕТА:
Цвет - это просто набор из трех процентов, 0-100, управляющий красным, зеленым и синим светодиодами.
Красный - красный светодиод полностью, синий и зеленый - выключены.
int red = {100, 0, 0} Тусклый белый цвет - все три светодиода на 30% int dimWhite = {30, 30, 30} и т. д.
Некоторые распространенные цвета указаны ниже, или сделайте свой собственный
ПЕРЕЧЕНЬ ЗАКАЗА:
В основной части программы вам нужно указать порядок, в котором вы хотите, чтобы цвета отображались, например crossFade (красный); crossFade (зеленый); crossFade (синий);
Эти цвета появятся в указанном порядке, постепенно исчезая.
один цвет и в другой
Кроме того, вы можете настроить 5 дополнительных параметров:
1. Первоначальный цвет установлен на черный (так что первый цвет исчезает), но вы можете установить начальным цветом любой другой цвет. 2. Внутренний цикл выполняется для 1020 взаимодействий; переменная 'wait' устанавливает приблизительную продолжительность одного кроссфейда. Теоретически "ожидание" в 10 мс должно привести к переходу на ~ 10 секунд. На практике другие функции, которые выполняет код, на моей плате замедляют это до ~ 11 секунд. YMMV. 3. Если «повтор» установлен на 0, программа будет повторяться бесконечно. если он установлен на число, он будет повторять это количество раз, а затем остановится на последнем цвете в последовательности. (Установите 'return' в 1 и сделайте последний цвет черным, если вы хотите, чтобы он исчез в конце.) 4. Существует необязательная переменная 'hold', которая передает программе 'удерживать' миллисекунды, когда цвет завершено, но до начала следующего цвета. 5. Установите флаг DEBUG в 1, если вы хотите, чтобы выходные данные отладки отправлялись на монитор последовательного порта.
Внутренности программы несложные, но они
немного привередливы - внутренняя работа объясняется ниже основного цикла.
Апрель 2007, Клэй Ширки
*
/ Выход
int ylwPin = 5; // Желтый светодиод, подключенный к цифровому выводу 5 // 改 int redPin = 6; // Красный светодиод, подключенный к цифровому выводу 6 // 改 int grnPin = 7; // Зеленый светодиод, подключенный к цифровому выводу 7 // 改 int bluPin = 8; // Синий светодиод, подключенный к цифровому выводу 8 // 改 int whiPin = 9; // Белый светодиод, подключенный к цифровому выводу 9 // 改 int ylwPin2 = 10; // Желтый светодиод, подключенный к цифровому выводу 10 // 改 int redPin2 = 11; // Красный светодиод, подключенный к цифровому выводу 11 // 改 int grnPin2 = 12; // Зеленый светодиод, подключенный к цифровому выводу 12 // 改 int bluPin2 = 13; // Синий светодиод, подключенный к цифровому выводу 13 // 改
// Цветовые массивы
int black [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // 改 int white [9] = {100, 100, 100, 100, 100, 100, 100, 100, 100}; // 改 int red [9] = {0, 0, 100, 0, 0, 0, 100, 0, 0}; // 改 int green [9] = {0, 100, 0, 0, 0, 0, 0, 100, 0}; // 改 int blue [9] = {0, 0, 0, 100, 0, 0, 0, 0, 100}; // 改 int yellow [9] = {100, 0, 0, 0, 0, 100, 0, 0, 0}; // 改 int purple [9] = {0, 50, 0, 50, 0, 0, 50, 0, 50}; // 改 int orange [9] = {50, 50, 0, 0, 0, 50, 50, 0, 0}; // 改 int pink [9] = {0, 50, 0, 0, 50, 0, 0, 50, 0,}; // 改 // и т. Д.
// Устанавливаем начальный цвет
int redVal = черный [0]; int grnVal = черный [1]; int bluVal = черный [2]; int ylwVal = черный [3]; // 改 int whiVal = black [4]; // 改
интервал ожидания = 15; // внутренняя задержка CrossFade 10 мс; увеличение для более медленных затуханий // 改
int hold = 1; // Необязательное удержание, когда цвет завершен, перед следующим перекрестным затуханием // 改 int DEBUG = 1; // счетчик ОТЛАДКИ; если установлено в 1, значения будут записываться обратно через последовательный int loopCount = 60; // Как часто следует сообщать DEBUG? интервал повторения = 0; // Сколько раз мы должны зацикливаться перед остановкой? (0 без остановки) // 改 int j = 0; // Счетчик циклов для повтора
// Инициализируем переменные цвета
int prevR = redVal; int prevG = grnVal; int prevB = bluVal; int prevY = ylwVal; int prevW = whiVal; // 改
// Настраиваем выходы светодиодов
void setup () {pinMode (redPin, ВЫХОД); // устанавливает выводы как выходные pinMode (grnPin, OUTPUT); pinMode (bluPin, ВЫХОД); pinMode (ylwPin, ВЫХОД); // 改 pinMode (whiPin, OUTPUT); // 改 pinMode (grnPin2, OUTPUT); // 改 pinMode (bluPin2, OUTPUT); // 改 pinMode (ylwPin2, OUTPUT); // 改 pinMode (redPin2, OUTPUT); // 改
if (DEBUG) {// Если мы хотим увидеть значения для отладки…
Serial.begin (9600); //… настраиваем последовательный выход}}
// Основная программа: перечисляем порядок кроссфейдов
void loop () {crossFade (красный); crossFade (зеленый); crossFade (синий); crossFade (желтый); 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 ) {// 改
// Преобразовать в 0-255 int R = (color [0] * 255) / 100; int G = (цвет [1] * 255) / 100; int B = (цвет [2] * 255) / 100; int Y = (цвет [3] * 255) / 100; // 改 int W = (color [4] * 255) / 100; // 改
int stepR = CalculStep (prevR, R);
int stepG = CalculStep (prevG, G); int stepB = CalculStep (prevB, B); int stepY = calculateStep (предыдущий, Y); // 改 int stepW = calculateStep (prevW, W); // 改
для (int я = 0; я <= 1020; я ++) {redVal = calculateVal (stepR, redVal, i); grnVal = calculateVal (stepG, grnVal, i); bluVal = calculateVal (stepB, bluVal, i); ylwVal = calculateVal (stepY, ylwVal, i); // 改 whiVal = calculateVal (stepW, whiVal, i); // 改
analogWrite (redPin, redVal); // Записываем текущие значения на выводы светодиода
analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal); analogWrite (ylwPin, ylwVal); // 改 analogWrite (whiPin, whiVal); // 改 analogWrite (grnPin2, grnVal); // 改 analogWrite (bluPin2, bluVal); // 改 analogWrite (ylwPin2, ylwVal); // 改 analogWrite (redPin2, redVal); // 改
задержка (ждать); // Пауза на миллисекунды ожидания перед возобновлением цикла
if (DEBUG) {// Если нам нужен последовательный вывод, напечатайте его в
if (i == 0 или i% loopCount == 0) {// начало, и каждый цикл loopCount умножается на Serial.print ("Loop / RGBYW: #"); Serial.print (i); Serial.print ("|"); Serial.print (redVal); Serial.print ("/"); Serial.print (grnVal); Serial.print ("/"); Serial.println (bluVal); Serial.print ("/"); Serial.println (ylwVal); // 改 Serial.print ("/"); // 改 Serial.println (whiVal); // 改 Serial.print ("/"); // 改} DEBUG + = 1; }} // Обновляем текущие значения для следующего цикла prevR = redVal; prevG = grnVal; prevB = bluVal; prevY = ylwVal; // 改 prevW = whiVal; // 改 задержка (удерживать); // Пауза на необязательные миллисекунды ожидания перед возобновлением цикла}
Шаг 3. Настройка
- Получите макет.
-
Демонстрация подключения проводов для включения светодиодной лампы:
- Поместите светодиод на макетную плату. Расположите более длинный конец слева, а более короткий - справа.
- Поместите один конец перемычки в точку, которая находится в одном ряду с более длинным концом светодиода. Другой конец вставьте в секцию цифрового ШИМ. В коде указано, что желтые светодиоды должны быть подключены к 10 и 5, красные - к 6 и 11, синие - к 8 и 13, зеленые - к 7 и 12 и, наконец, белый светодиод - к 9.
- Поместите один конец резистора в один ряд с более коротким концом светодиода. Другой конец разместите где-нибудь рядом.
- Поместите конец другой перемычки в том же ряду с концом резистора, который не находится в одном ряду с более коротким концом светодиода. Поместите другой конец провода в ряд отрицательного заряда.
- Поместите конец еще одной перемычки в ряд с отрицательным зарядом, а другой конец - на GND.
- Повторите шаг 2 8 раз, чтобы загорелись 9 светодиодов.
-
Поместите макет в коробку. Несколько напоминаний здесь:
- Я использовал блок питания. Сделайте небольшое отверстие для проводов с помощью канцелярского ножа, чтобы пропустить его через коробку и подсоединить к макетной плате.
- Убедитесь, что коробка открыта с одной стороны. Одна сторона обувной коробки уже открыта. Если коробка полностью закрыта, отрежьте одну сторону коробки, чтобы освободить место.
- Боковую сторону ничем не накройте бумагой. Это для того, чтобы светодиодные фонари светили сквозь бумагу.