Оглавление:

Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch: 6 шагов (с изображениями)
Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch: 6 шагов (с изображениями)

Видео: Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch: 6 шагов (с изображениями)

Видео: Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch: 6 шагов (с изображениями)
Видео: 💡Делаем RGB контроллер и крутой свет для видео 2024, Июль
Anonim
Image
Image
Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch
Потяните свет - световой модуль с помощью Neopixel & Pull Up Switch

Особенности светового модуля

  • Ардуино Уно
  • Аппаратное обеспечение и корпус, приобретенные в Интернете
  • Neopixel и блок питания позаимствованы из Школы информатики и дизайна продуктов
  • Световой модуль, управляемый источником питания
  • Все функции контролируются через взаимодействие с пользователем
  • Типы анимации полосы Neopixel: тип дождя, тип душа, тип искры молнии, тип поп, нестандартный тип
  • Переключатель подтягивания подключен к полосе Neopixel, и анимация изменяется при вытягивании полосы Neopixel.

Шаг 1. Прежде чем мы начнем

Прежде, чем мы начнем
Прежде, чем мы начнем

Привет, Instructables и Makers.

Мы начали интерактивный дизайн-проект с точки зрения того, что было бы, если бы мы могли почувствовать эмоции дождя через анимацию света. Я думал, что чувствительность пользователя будет максимально увеличена за счет интерфейса, который напрямую направляет свет.

Чтобы не приступить к работе

Шаг 2: Необходимые детали

Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали

На базе одного светового модуля

*** Неопиксели и блок питания использовались при поддержке нашего отдела. ***

Электроника:

  1. Ардуино Уно
  2. 3-х цветный провод (черный, красный, любой цвет)
  3. Разъем 3pin (Ссылка на покупку)
  4. Вытяните переключатель 1 (ссылка на покупку)
  5. усадочная трубка
  6. Адресная светодиодная лента WS2812b с 74 светодиодами (неопиксельная лента) * 2
  7. Электропитание (5В 350А) 1

*** Для Arduino, Pull Switch и NeoPixels требуется 50 комплектов. ***

Аппаратное обеспечение:

  1. Акриловый брус 2т (10мм * 1000мм) 1
  2. Акриловая плита 5т (60мм * 60мм) 1
  3. Foemax 10т (1200мм * 1800мм) 1
  4. Черный спрей
  5. Кабельные стяжки
  6. Нить
  7. Оргалит
  8. Сетка

Шаг 3: подключение и сборка оборудования

Связь и сборка оборудования
Связь и сборка оборудования
Связь и сборка оборудования
Связь и сборка оборудования
Связь и сборка оборудования
Связь и сборка оборудования

Во-первых, нам понадобится Acrylic Cutting, чтобы сделать один модуль освещения.

  • Чтобы испытать анимацию света, создайте осветительный модуль, который фиксируется путем прикрепления 74 светодиодов в виде неопиксельной полосы к акриловой планке толщиной 2 мм с площадью 1M. Мы изготовили световые модули двух типов: линейные и спиральные.
  • Для линейных типов существующие неопиксельные полоски можно удерживать и закреплять, но спиральные типы требуют ручного управления. Каждый из 74 светодиодов разделен на части, прикреплен к спиральному акрилу и скреплен свинцом.

Прикрепите полоску Neopixel к акрилу и закрепите каждую полоску, чтобы она не растекалась под воздействием тепла, или свяжите тонкой леской. В случае линейного типа, сфера, которую нужно было натянуть на конец модуля, была установлена для создания эстетичного вида, и мы закончили мяч для пинг-понга черным спреем. Затем они просверлили небольшое отверстие в шарике для пинг-понга и связали его веревкой. Следующая по важности часть, переключатель и неопиксель, подключены, как показано на рисунке. Затем выключатель крепится к потолочной полке.

В случае спирального типа существует риск того, что прямое вытягивание спирального модуля может сломать акрил под давлением, поэтому тяговая секция (вход) и модуль (выход) были разделены. Для максимального падения света модули устанавливали вертикально на потолок, линейные модули крепили к воздуху, спирали крепили непосредственно к потолку. И мы соединили мяч для пинг-понга и переключатель с леской, чтобы им можно было управлять.

Акриловый вырез, как показано на рисунке выше, необходим для закрепления переключателя на полке. Переключатель квадратной формы 6 см имеет толщину примерно 5 мм, переключатель расположен по центру, а кабельная стяжка вставлена в отверстия с обеих сторон для надежной фиксации переключателя. Круглое отверстие в нижней части центра открывает доступ к переключателю, ниже которого вытаскивается трехжильный кабель и подсоединяется к кабельному зажиму модуля. Точно так же через отверстие в четырех углах полка и акрил крепятся стяжками. Как описано выше, линейный модуль подключается непосредственно к вытяжке, а спиральный модуль соединяет штифт и переключатель отдельно.

Шаг 4: Создайте из 50 световых модулей

Создание с использованием 50 световых модулей
Создание с использованием 50 световых модулей
Создание с использованием 50 световых модулей
Создание с использованием 50 световых модулей
Создание с использованием 50 световых модулей
Создание с использованием 50 световых модулей

Мы разработали пользовательский интерфейс для более насыщенного света, развернув в общей сложности 50 модулей

У нас была полка шириной 1,800 мм и длиной 1,200 мм, и мы соединили каждый переключатель и модуль, чтобы вы могли испытать дождь и дождь, которые мы изначально планировали, и у нас был каждый модуль отдельно, чтобы обеспечить многозадачность..

В зависимости от чертежа, в foemax просверливается круглое отверстие, чтобы скрыть установку и убедиться, что область подключения светодиодного модуля не видна. Поскольку расстояние от акриловой платы до разъема светодиодного модуля, где прикреплен переключатель, составляет около 1 см, использовался foemax толщиной 1 см.

Металлическая квадратная рама использовалась для удержания установки вместе с помощью винтов и кабельных стяжек, сохраняя при этом общий вес и баланс. Если длина открытых соединений больше, чем при попытке производителя, более толстая плата неэффективна, и рекомендуется использовать другие конструкции.

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

Самая важная часть всего этого процесса - убедиться, что работа выполняется надежно и полностью защищено, чтобы гарантировать, что опыт станет возможным в безопасной среде

Всего использовалось 10 модулей Arduino и 50 светодиодных модулей, а к каждой Arduino было подключено пять светодиодных модулей для более эффективной и бесперебойной многозадачности. См. Прилагаемый план для деталей. Неопиксельное многозадачное кодирование с использованием полного переключателя в соответствии с проектной схемой будет подробно рассмотрено на следующем этапе.

Шаг 5: Кодирование и подключение Arduino

Кодирование и подключение Arduino
Кодирование и подключение Arduino
Кодирование и подключение Arduino
Кодирование и подключение Arduino

Проводка

  • 50 модулей были подключены по схеме шага 4.
  • Каждый модуль был разделен на 10 наборов по 50 модулей, чтобы обеспечить многозадачность и четкое соединение.
  • Как показано на изображении набора 1 выше, пять модулей были подключены к одному Arduino, а контакты 5V neopixel были связаны вместе сразу для подключения источника питания.
  • GND неопикселей и переключателей также были связаны вместе, и для облегчения восприятия переключатели были подключены к контактам 2, 3, 4, 5, 6, а неопиксели были подключены к контактам 9, 10, 11, 12, 13..
  • Коммутаторы и неопиксели были подключены 2–9, 3–10, 4–11, 5–12, 6–13 способами соответственно.
  • Следует отметить, что, поскольку соединения линий сложны и существует риск возгорания из-за короткого замыкания, термоусадочную трубку нагревали, чтобы гарантировать, что слабые части не сломаются.

Многозадачное кодирование Neopixel с подтягивающим переключателем

5 световых анимаций (тип дождя, тип душа, тип искры, тип поп, нестандартный тип)

#включают

/ * 사용 하고자 하는 패턴 을 추가 함 * /

шаблон перечисления {NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, TWINKLE, STAR, RAINBOWSPARKLE, METEOR, LIGHT, BLOSSOM}; / * 네오 픽셀 을 방향 을 설정 함 * / enum direction {FORWARD, REVERSE};

/ * 패턴 의 클래스 를 입력 함 * /

class NeoPatterns: public Adafruit_NeoPixel {/ * 패턴 을 추가 하고 업데이트 하기 위한 함수 * / public: pattern ActivePattern; / * 클레스 함수 에 패턴 의 방향 을 입력 * / direction Direction;

/ * 변수 Interval 을 추가 * / unsigned long Interval; / * 변수 lastUpdate 를 추가 * / unsigned long lastUpdate; / * 변수 Color1, Color2 를 추가 * / uint32_t Color1, Color2; / * 변수 TotalSteps 를 추가 * / uint16_t TotalSteps; / * 변수 Индекс 를 추가 * / uint16_t Индекс;

/ * 패턴 을 완료 했을 시 다시 불러오는 함수 * / void (* OnComplete) (); / * 네오 패턴 에서 네오 픽샐 의 갯수, 핀 번호, 타입, 콜백 을 불러오는 함수 * / NeoPatterns (uint16_t pixels, uint8_t pin, uint8_t type, void (* callback) ()): Adafruit_NeoPixel (пикселей, pin, type) { OnComplete = обратный вызов; }

/ * 패턴 을 업데이트 하기 위한 케이스 구문 * /

void Update () {/ * 패턴 의 시간 설정. 멀티 태스킹 을 구현 하는 구문 * / if ((millis () - lastUpdate)> Interval) {lastUpdate = millis (); / * ActivePattern 의 스위치 구문 * / switch (ActivePattern) {/ * case RAINBOW_CYCLE 에서는 RainbowCycleUpdate 를 실행 하라 * / case RAINBOW_CYCLE: RainbowCycleUpdate (); / * case RAINBOW_CYCLE 에서 나와라 * / break;

/ * case THEATER_CHASE 에서는 TheaterChaseUpdate 를 실행 하라 * /

case THEATER_CHASE: TheaterChaseUpdate (); / * case THEATER_CHASE 에서 나와라 * / break;

/ * case COLOR_WIPE 에서는 ColorWipeUpdate 를 실행 하라 * /

case COLOR_WIPE: ColorWipeUpdate (); / * case COLOR_WIPE 에서 나와라 * / break; / * case SCANNER 에서는 ScannerUpdate 를 실행 하라 * / case SCANNER: ScannerUpdate (); / * case SCANNER 에서 나와라 * / break;

/ * case FADE 에서는 FadeUpdate 를 실행 하라 * /

case FADE: FadeUpdate (); / * case FADE 에서 나와라 * / break;

/ * case TWINKLE 에서는 TwinkleUpdate 를 실행 하라 * /

case TWINKLE: TwinkleUpdate (); / * case TWINKLE 에서 나와라 * / break;

/ * case STAR 에서는 StarUpdate 를 실행 하라 * /

case STAR: StarUpdate (); / * case STAR 에서 나와라 * / break;

/ * case RAINBOWSPARKLE 에서는 RainbowsparkleUpdate 를 실행 하라 * /

case RAINBOWSPARKLE: RainbowsparkleUpdate (); / * case RAINBOWSPARKLE 에서 나와라 * / break; / * case METEOR 에서는 MeteorUpdate 를 실행 하라 * / case METEOR: MeteorUpdate (); / * case METEOR 에서 나와라 * / break;

/ * case LIGHT 에서는 LightUpdate 를 실행 하라 * /

case LIGHT: LightUpdate (); / * case LIGHT 에서 나와라 * / break;

/ * case BLOSSOM 에서는 BlossomUpdate 를 실행 하라 * /

case BLOSSOM: BlossomUpdate (); / * case BLOSSOM 에서 나와라 * / break; }}}

/ * 패턴 의 방향 을 설정 하는 구문 * /

/ * Индекс 를 증가 시키고 초기화 하는 함수 * /

void Increment () {/ * 만약 정방향 이면 인덱스 를 증가 시켜라 * / if (Direction == FORWARD) {Index ++; / * 만약 인덱스 가 전체 네오 픽셀 구동 갯수 같 거나 많다 면 0 으로 초기화 시켜라 * / if (Index> = TotalSteps) {Index = 0; / * 패턴 을 완료 시키는 함수 * / if (OnComplete! = NULL) {OnComplete (); }}}

/ * 만약 정방향 이 아니면 인덱스 를 감소 시켜라 * / else {--Index; / * 만약 인덱스 가 전체 네오 픽셀 구동 갯수 같 적 다면 전체 구동 갯수 에서 1 을 빼라 * / if (Index <= 0) {Index = TotalSteps - 1; / * 패턴 을 완료 시키는 함수 * / if (OnComplete! = NULL) {OnComplete (); }}}}

/ * 반대 방향 으로 움직이게 하는 함수 * /

void Reverse () {/ * 애니메이션 함수 에 Reverse 를 썼을 시, 만약 방향 이 정방향 이면 * / if (Direction == FORWARD) {/ * 방향 은 그 반대 구동 갯수 에서 1 일 빼라 * / Direction = REVERSE; Индекс = TotalSteps - 1; } / * 그 외의 방향 이 정방향 이면 인덱스 를 0 으로 설정 해라 * / else {Direction = FORWARD; Индекс = 0; }}

/ * 애니메이션 을 설정 하는 함수 들 *

* RainbowCycle 의 시간 과 방향 을 입력 * /

void RainbowCycle (интервал uint8_t, направление dir = FORWARD) {/ * 실행 되는 패턴 은 RainbowCycle 임 * / ActivePattern = RAINBOW_CYCLE; / * 시간 은 void RainbowCycle () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 총 구동 갯수 는 255 임 * / TotalSteps = 255; / * 인덱스 는 0 으로 설정 함 * / Индекс = 0; / * 방향 은 void RainbowCycle () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir; }

/ * RainbowCycle 를 업데이트 했을 경우 * /

void RainbowCycleUpdate () {/ * 변수 i 가 네오 픽셀 개수 보다 작 으면 i 를 증가 시켜라 * / for (int i = 0; i <numPixels (); i ++) {/ * 변수 i 가 증가 함 과 동시에 RGB 의 무지개 컬러 로 변화 하면서 작동 해라 * / setPixelColor (i, Wheel (((i * 256 / numPixels ()) + Index) & 255)); } / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * TheaterChase 의 컬러 와 시간 방향 을 입력 * /

void TheaterChase (uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD) {/ * 실행 되는 패턴 은 RTHEATER_CHASE * / ActivePattern = THEATER_CHASE; / * 시간 은 void TheaterChase () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels (); / * 컬러 1, 2 를 설정 * / Color1 = color1; Color2 = color2; / * 인덱스 는 0 으로 설정 함 * / Индекс = 0; / * 방향 은 void TheaterChase () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir; }

/ * TheaterChase 를 업데이트 했을 경우 * /

void TheaterChaseUpdate () {/ * 변수 i 가 네오 픽셀 개수 보다 작 으면 i 를 증가 시켜라 * / for (int i = 0; i <numPixels (); i ++) {/ * 만약 변수 i 에 인덱스 를 더해서 3 으로 나눈 것이 0 과 같다 면 i 를 Color 로 변환 시켜라 * / if ((i + Index)% 3 == 0) {setPixelColor (i, Color1); } / * 그렇지 않다면 i 를 Color 로 변환 시켜라 * / else {setPixelColor (i, Color2); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * ColorWipe 의 컬러 와 시간 방향 을 입력 * /

void ColorWipe (цвет uint32_t, интервал uint8_t, направление dir = FORWARD) {/ * 실행 되는 패턴 은 COLOR_WIPE * / ActivePattern = COLOR_WIPE; / * 시간 은 void ColorWipe () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels (); / * 컬러 1 을 설정 * / Color1 = color; / * 인덱스 는 0 으로 설정 함 * / Индекс = 0; / * 방향 은 void ColorWipe () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir; }

/ * ColorWipeUpdate 를 업데이트 했을 경우 * /

void ColorWipeUpdate () {/ * index 를 컬러 1 로 변환 시켜라 * / setPixelColor (Index, Color1); / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * Сканер 의 컬러 와 시간 을 입력 * /

void Scanner (uint32_t color1, uint8_t interval) {/ * 실행 되는 패턴 은 СКАНЕР * / ActivePattern = СКАНЕР; / * 시간 은 void Scanner () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 구동 갯수 는 총 갯수 에서 1 을 빼고 2 를 곱 해라 * / TotalSteps = (numPixels () - 1) * 2; / * 컬러 1 을 설정 * / Color1 = color1; / * 인덱스 는 0 으로 설정 함 * / Индекс = 0; }

/ * ScannerUpdate 를 업데이트 했을 경우 * /

void ScannerUpdate () {/ * 변수 i 는 영 이고 총 갯수 보다 작을 경우 i 를 증가 시켜라 * / for (int i = 0; i <numPixels (); i ++) {/ * 만약 변수 i 가 인덱스 와 같다 면 i 를 color1 로 변환 시켜라 * / if (i == Index) {setPixelColor (i, Color1); } / * 그렇지 않다면 변수 i 를 전체 구동 갯수 에서 인덱스 를 뺀값 과 같다 * / else if (i == TotalSteps - Index) {setPixelColor (i, Color1); } / * 그 밖에는 я 를 디밍 시켜라 я 의 값 만큼 * / else {setPixelColor (i, DimColor (getPixelColor (i))); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * Сканер 의 컬러 1, 2 와 스텝, 시간, 방향 을 입력 * /

void Fade (uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD) {/ * 실행 되는 패턴 은 FADE * / ActivePattern = FADE; / * 시간 은 void Fade () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 구동 갯수 는 스텝 값임 * / TotalSteps = шаги; / * 컬러 1, 2 를 설정 * / Color1 = color1; Color2 = color2; / * 인덱스 는 0 으로 설정 함 * / Индекс = 0; / * 방향 은 void Fade () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir; } / * FadeUpdate 를 업데이트 했을 경우 * / void FadeUpdate () {/ * 변수 red 값 은 다음 과 같음 * / uint8_t red = ((Red (Color1) * (TotalSteps - Index)) + (Red (Color2) * Index)) / TotalSteps; / * 변수 зеленый 값 은 다음 과 같음 * / uint8_t green = ((Green (Color1) * (TotalSteps - Index)) + (Green (Color2) * Index)) / TotalSteps; / * 변수 синий 값 은 다음 과 같음 * / uint8_t blue = ((Blue (Color1) * (TotalSteps - Index)) + (Blue (Color2) * Index)) / TotalSteps; / * 위 красный, зеленый, синий 값 으로 컬러 를 셋팅 함 * / ColorSet (Color (красный, зеленый, синий)); / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * 모든 네오 픽셀 을 끄는 구문 * /

void alloff () {/ * 총 네오 픽셀 갯수 는 74 개 이며 * / int NPIXEL = 74; / * 변수 я 가 증가 하며 모든 네오 픽셀 의 컬러 값 을 0 으로 변환 함 * / for (int i = 0; i <NPIXEL; i ++) {setPixelColor (i, 0, 0, 0); }}

/ * Мерцание 의 컬러 1 와 시간 을 입력 * /

void Twinkle (uint32_t color1, uint8_t interval) {/ * 실행 되는 패턴 은 TWINKLE * / ActivePattern = TWINKLE; / * 시간 은 void Twinkle () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 컬러 1 를 설정 * / Color1 = color1; / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels (); Индекс = 0; }

/ * TwinkleUpdate 를 업데이트 했을 경우 * /

void TwinkleUpdate () {/ * 모든 네오 픽셀 의 를 0 으로 셋팅 * / setAll (0, 0, 0); / * 변수 Pixel 은 random 74 * / int Pixel = random (74); / * случайный 74 개 에서 2 로나 눈 수 를 랜덤 하게 켜라 * / setPixelColor (Pixel / 2, 50, 100, 255); setPixelColor (Пиксель, 250, 255, 250); setPixelColor (Пиксель / 2, 200, 250, 255); setPixelColor (Пиксель, 255, 255, 255); setPixelColor (Пиксель, 250, 230, 250); setPixelColor (Пиксель / 2, 150, 200, 255); / * 애니메이션 을 보여주는 함수 * / show (); / * 랜덤 하게 끄는 함수 * / setPixelColor (Pixel, 0, 0, 0); / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * Звезда 의 컬러 1 값 을 입력 * /

void Star (uint32_t color1) {/ * 실행 되는 패턴 은 STAR * / ActivePattern = STAR; / * 시간 은 void Star () 안에 입력 되는 interval 과 같음 * / Interval = Interval; / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels (); / * 컬러 1 을 설정 * / Color1 = color1; Индекс = 0; }

/ * StarUpdate 를 업데이트 했을 경우 * /

void StarUpdate () {/ * 인덱스 와 컬러 를 셋팅 * / setPixelColor (Index, Color1); Показать(); / * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 를 감소 시킴 = 한칸 씩 이동 하는 애니메이션 * / for (int i = 0; i <numPixels (); i--) {setPixelColor (i, Color (0, 0, 0)); } / * 애니메이션 을 보여주는 함수 * / Increment (); }

/ * Радужная искра 의 시간 과 방향 을 입력 * /

void Rainbowsparkle (интервал uint8_t, направление dir = FORWARD) {/ * 실행 되는 패턴 은 RAINBOWSPARKLE * / ActivePattern = RAINBOWSPARKLE; / * 시간 은 void Rainbowsparkle () 안에 입력 되는 interval 과 같음 * / Interval = interval; / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels (); Индекс = 0; / * 방향 은 void Rainbowsparkle () 안에 입력 되는 direction 과 같음 * / Direction = dir; }

/ * RainbowsparkleUpdate 를 업데이트 했을 경우 * /

void RainbowsparkleUpdate () {/ * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 값 을 증가 하는데 * / for (int i = 0; i <numPixels (); i ++) {/ * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 값 을 증가 하는데 * / if ((i + Index)% 2 == 0) {uint32_t c = random (255); setPixelColor (i, c); } else {setPixelColor (я, случайный (255)); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); } / * Метеор 의 시간 과 방향 을 입력 * / void Meteor (uint32_t color1) {/ * 실행 되는 패턴 은 METEOR * / ActivePattern = METEOR; / * 시간 설정 * / Interval = Interval; / * 총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2; / * 컬러 1 을 설정 * / Color1 = color1; Индекс = 0; }

/ * MeteorUpdate 를 업데이트 했을 경우 * /

void MeteorUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == Index) {setPixelColor (i, 100, random (255), 255); } else {setPixelColor (i, DimColor (getPixelColor (i))); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * Свет 의 시간 과 방향 을 입력 * /

void Light (uint32_t color1) {/ * 실행 되는 패턴 은 LIGHT * / ActivePattern = LIGHT; / * 시간 설정 * / Interval = Interval; / * 총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2; / * 컬러 1 을 설정 * / Color1 = color1; Индекс = 0; }

/ * LightUpdate 를 업데이트 했을 경우 * /

void LightUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == TotalSteps - Index) {setPixelColor (i, 150, random (200), 40); } else {setPixelColor (i, DimColor (getPixelColor (i))); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

/ * Цветение 의 시간 과 방향 을 입력 * /

void Blossom (uint32_t color1) {/ * 실행 되는 패턴 은 ЦВЕТ * / ActivePattern = ЦВЕТ; / * 시간 설정 * / Interval = Interval; / * 총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2; / * 컬러 1 을 설정 * / Color1 = color1; Индекс = 0; }

/ * BlossomUpdate 를 업데이트 했을 경우 * /

void BlossomUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == TotalSteps - Index) {setPixelColor (i, 255, random (255), 100); } else {setPixelColor (i, DimColor (getPixelColor (i))); }} / * 애니메이션 을 보여주는 함수 * / show (); Приращение (); }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/ * 네오 픽셀 의 켜지 는 위치 와 색 을 지정 함수 * / void setAll (байт красный, байт зеленый, байт синий) {for (int i = 0; i <numPixels (); i ++) {setPixelColor (i, red, Зеленый, голубой); } Показать(); }

/ * 네오 픽셀 의 디밍, 즉 밝기 를 조절 하는 함수 * /

uint32_t DimColor (uint32_t color) {// Сдвинуть компоненты R, G и B на один бит вправо uint32_t dimColor = Color (Красный (цвет) >> 1, Зеленый (цвет) >> 1, Синий (цвет) >> 1); return dimColor; }

/ * 모든 네오 픽셀 의 칼라 를 조절 * /

void ColorSet (uint32_t color) {для (int я = 0; я <numPixels (); я ++) {setPixelColor (я, цвет); } Показать(); }

/ * 레드 값 을 불러 옴 * /

uint8_t красный (цвет uint32_t) {возврат (цвет >> 16) & 0xFF; } / * 그린 값 을 불러 옴 * / uint8_t Green (uint32_t color) {return (color >> 8) & 0xFF; } / * 블루 값 을 불러 옴 * / uint8_t Blue (uint32_t color) {return color & 0xFF; }

/ * Радуга 컬러 를 불러 옴 * /

uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return Color (255 - WheelPos * 3, 0, WheelPos * 3); } else if (WheelPos <170) {WheelPos - = 85; return Color (0, WheelPos * 3, 255 - WheelPos * 3); } else {WheelPos - = 170; вернуть Color (WheelPos * 3, 255 - WheelPos * 3, 0); }}};

/ * полоса 을 불러 오기 위한 함수 / * 사용 하는 스트립 별로 모두 지정 해주어야 함 * /

пустота strip1Complete (); пустота strip2Complete (); пустота strip3Complete (); пустота strip4Complete (); пустота strip5Complete ();

/ * 네오 픽셀 의 갯수 설정 * /

#define NUMPIXELS 74 / * 사용 하는 버튼 의 갯수 설정 * / #define B_NUM 5 / * Импортировать strip1 ~ 5 까지, 갯수 는 74 개 스트립 연결 핀 은 strip1 은 8 ~ strip5 까지 12 * / NeoPatterns strip1 (74, 8, NEO_GRB + NEO_KHZ800, & strip1Complete); NeoPatterns strip2 (74, 9, NEO_GRB + NEO_KHZ800, & strip2Complete); NeoPatterns strip3 (74, 10, NEO_GRB + NEO_KHZ800, & strip3Complete); NeoPatterns strip4 (74, 11, NEO_GRB + NEO_KHZ800, & strip4Complete); NeoPatterns strip5 (74, 12, NEO_GRB + NEO_KHZ800, & strip5Complete); / * 배열 을 사용한 연결 버튼 핀 설정 * / const int buttonPin [B_NUM] = {2, 3, 4, 5, 6}; / * 배열 을 사용 하여 버튼 상태 를 지정 해줌 * / int buttonState [B_NUM]; / * 2 번핀 부터 6 번핀 까지 상태 는 순서 대로 LOW 임 * / int lastButtonState [B_NUM] = {LOW, LOW, LOW, LOW, LOW}; / * 2 번핀 부터 6 번핀 까지 버튼 카운터 를 초기화 시킴 * / int buttonCounter [B_NUM] = {0, 0, 0, 0, 0}; / * 2 번핀 부터 6 번핀 까지 최대 버튼 카운터 는 5 임 * / int buttonCounterMax = 5; / * 모든 버튼 핀 을 읽 일수 있도록 변수 추가 * / int чтение [B_NUM]; беззнаковое длинное время lastDebounceTime [B_NUM] = {0, 0, 0, 0, 0}; / * 모든 버튼 핀 을 읽는 시간 간격 은 delay50 과 같음 * / unsigned long debounceDelay = 50;

void setup () {

/ * 복잡 하게 저항 연결 이 필요 없도록 인풋 풀업 방식 의 버튼 설정: GND - 5V (подключение к номеру контакта) * / for (int i = 0; i <B_NUM; i ++) {pinMode (buttonPin , INPUT_PULLUP); } Serial.begin (9600); / * 1 ~ 5 셋팅 * / strip1.begin (); strip2.begin (); strip3.begin (); strip4.begin (); strip5.begin ();

//strip1. TheaterChase(strip1. Color(255, 0, 255), strip1. Color (255, 50, 0), 20, ВПЕРЕД);

}

/ * 버튼 카운터 변수 값 은 5 임 * /

int counter = 5; void loop () {/ * 버튼 수 보다 i 가 작 으면 i 를 증가 시키고 * / for (int i = 0; i debounceDelay) {if (чтение ! = buttonState ) {buttonState = чтение ; buttonCounter ++; / * 버튼 카운팅 이 위에서 설정 한 Макс 값 5 를 넘으면 0 으로 초기화 시켜라. * / If (buttonCounter > buttonCounterMax) buttonCounter = 0; }} lastButtonState = чтение ; } / * 모든 스트립 을 업데이트 함. * / Strip1. Update (); strip2. Update (); strip3. Update (); strip4. Update (); strip5. Update ();

///// ПЕРЕКЛЮЧАТЕЛЬ_2 //////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////

/ * 버튼 배열 의 0 번째 즉. 2 번핀 에 연결된 버튼 을 활용 하여 애니메이션 이 구동 되도록 하는 스위치 케이스 구문 * / переключатель (buttonCounter [0]) {

/ * 첫번째 버튼 을 활동 시키면 구동 되는 애니메이션 * /

case 0: strip1. ActivePattern = ЦВЕТОК; / * 해당 애니메이션 의 시간 을 설정 * / strip1. Interval = 20; / * 구동 되는 네오 픽셀 의 갯수 를 설정 * / strip1. TotalSteps = strip1.numPixels (); перерыв; / * 두번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / case 1: strip1. ActivePattern = RAINBOWSPARKLE; strip1. Interval = 50; strip1. TotalSteps = strip1.numPixels (); перерыв; / * 세번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / case 2: strip1. ActivePattern = SCANNER; strip1. Interval = 10; strip1. TotalSteps = (strip1.numPixels () - 1) * 2; перерыв; / * 네번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / case 3: strip1. ActivePattern = TWINKLE; strip1. Interval = 1; strip1. TotalSteps = strip1.numPixels (); перерыв; / * 다섯 번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / case 4: strip1. ActivePattern = METEOR; strip1. Interval = 10; strip1. TotalSteps = strip1.numPixels (); перерыв; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);

///// SWITCH_3 //////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////

переключатель (buttonCounter [1]) {case 0: strip2. ActivePattern = STAR; strip2. Interval = 50; strip2. TotalSteps = strip2.numPixels (); перерыв; case 1: strip2. ActivePattern = RAINBOWSPARKLE; strip2. Interval = 100; strip2. TotalSteps = strip2.numPixels (); перерыв; случай 2: strip2. ActivePattern = СКАНЕР; strip2. Interval = 20; strip2. TotalSteps = (strip2.numPixels () - 1) * 2; перерыв; case 3: strip2. ActivePattern = TWINKLE; strip2. Interval = 5; strip2. TotalSteps = strip2.numPixels (); перерыв; случай 4: strip2. ActivePattern = METEOR; strip2. Interval = 40; strip2. TotalSteps = strip2.numPixels (); перерыв; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);

///// SWITCH_4 //////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////

переключатель (buttonCounter [2]) {case 0: strip3. ActivePattern = STAR; strip3. Interval = 50; strip3. TotalSteps = strip3.numPixels (); перерыв; case 1: strip3. ActivePattern = RAINBOWSPARKLE; strip3. Interval = 100; strip3. TotalSteps = strip3.numPixels (); перерыв; случай 2: strip3. ActivePattern = СКАНЕР; strip3. Interval = 20; strip3. TotalSteps = (strip3.numPixels () - 1) * 2; перерыв; case 3: strip3. ActivePattern = TWINKLE; strip3. Interval = 5; strip3. TotalSteps = strip3.numPixels (); перерыв; случай 4: strip3. ActivePattern = METEOR; strip3. Interval = 25; strip3. TotalSteps = strip3.numPixels (); перерыв; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);

///// SWITCH_5 //////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////

переключатель (buttonCounter [3]) {case 0: strip4. ActivePattern = STAR; strip4. Interval = 50; strip4. TotalSteps = strip4.numPixels (); перерыв; case 1: strip4. ActivePattern = RAINBOWSPARKLE; strip4. Interval = 100; strip4. TotalSteps = strip4.numPixels (); перерыв; случай 2: strip4. ActivePattern = СКАНЕР; strip4. Interval = 20; strip4. TotalSteps = (strip4.numPixels () - 1) * 2; перерыв; case 3: strip4. ActivePattern = TWINKLE; strip4. Interval = 5; strip4. TotalSteps = strip4.numPixels (); перерыв; case 4: strip4. ActivePattern = METEOR; strip4. Interval = 25; strip4. TotalSteps = strip4.numPixels (); перерыв; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);

///// SWITCH_6 //////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////

переключатель (buttonCounter [4]) {case 0: strip5. ActivePattern = STAR; strip5. Interval = 50; strip5. TotalSteps = strip5.numPixels (); перерыв; case 1: strip5. ActivePattern = RAINBOWSPARKLE; strip5. Interval = 100; strip5. TotalSteps = strip5.numPixels (); перерыв; случай 2: strip5. ActivePattern = СКАНЕР; strip5. Interval = 20; strip5. TotalSteps = (strip5.numPixels () - 1) * 2; перерыв; case 3: strip5. ActivePattern = TWINKLE; strip5. Interval = 5; strip5. TotalSteps = strip5.numPixels (); перерыв; случай 4: strip5. ActivePattern = METEOR; strip5. Interval = 25; strip5. TotalSteps = strip5.numPixels (); перерыв; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]); }

// Обратный вызов завершения strip1

void strip1Complete () {strip1. Color1 = strip1. Wheel (случайный (255)); strip1. Color2 = strip1. Wheel (случайный (255)); strip1. Index = 0; }

// Обратный вызов завершения strip2

void strip2Complete () {strip2. Color1 = strip2. Wheel (случайный (255)); strip2. Color2 = strip2. Wheel (случайный (255)); strip2. Index = 0; }

// Обратный вызов завершения strip3

void strip3Complete () {strip3. Color1 = strip3. Wheel (случайный (255)); strip3. Color2 = strip3. Wheel (случайный (255)); strip3. Index = 0; }

// Обратный вызов завершения strip4

пустота strip4Complete () {strip4. Color1 = strip4. Wheel (случайный (255)); strip4. Color2 = strip4. Wheel (случайный (255)); strip4. Index = 0; }

// Обратный вызов завершения strip5

void strip5Complete () {strip5. Color1 = strip5. Wheel (случайный (255)); strip5. Color2 = strip5. Wheel (случайный (255)); strip5. Index = 0; }

Шаг 6: Результат и создание фильма

Image
Image
Результат и создание фильма
Результат и создание фильма

Спасибо за интерес к нашему проекту, хотя этого недостаточно.

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