Оглавление:

Зеркальные часы Infinity с потенциометрами: 3 ступени
Зеркальные часы Infinity с потенциометрами: 3 ступени

Видео: Зеркальные часы Infinity с потенциометрами: 3 ступени

Видео: Зеркальные часы Infinity с потенциометрами: 3 ступени
Видео: 100грамм КОНТАКТОВ с ПОТЕНЦИОМЕТРА СТОИТ 398 ТЫС 2024, Июль
Anonim
Зеркальные часы бесконечности с потенциометрами
Зеркальные часы бесконечности с потенциометрами

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

Запасы

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

Тебе понадобится…

1) 1 Arduino Uno

3) 1 макетная плата

4) 1 ползунковый переключатель

5) 3 потенциометра

6) 1 батарея 9 В

7) 5-метровая светодиодная лента WS2811

8) Провода соединительного кабеля

9) Часы (Я использовал большие современные часы с диагональю 12 дюймов)

10) Гибкий зеркальный лист (тот, который я использовал для зеркального листа)

11) Пленка для конфиденциальности (та, что я использовал One Way Mirror)

12) Может потребоваться пайка, это зависит от ваших материалов.

Шаг 1. Подключение

Проводка
Проводка
Проводка
Проводка

Электропроводка довольно проста

- Переключатель SPST включает и выключает светодиоды (A0)

- Левый потенциометр управляет светом (A1)

- Средний потенциометр контролирует режимы (A2)

- Правый потенциометр контролирует скорость (A3)

Шаг 2: Код

#включают

#define PIN 6

#define NUM_LEDS 54

#define A0 A0

#define A1 A1

#define A2 A2

#define A3 A3

// Параметр 1 = количество пикселей в полосе

// Параметр 2 = номер контакта (большинство из них действительны)

// Параметр 3 = флаги типа пикселя, при необходимости сложите вместе:

// NEO_KHZ800 800 кГц битовый поток (большинство продуктов NeoPixel со светодиодами WS2812)

// NEO_KHZ400 400 кГц (классические пиксели FLORA 'v1' (не v2), драйверы WS2811)

// NEO_GRB Пиксели привязаны к битовому потоку GRB (большинство продуктов NeoPixel)

// Пиксели NEO_RGB связаны для битового потока RGB (пиксели FLORA v1, а не v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup () {

strip.begin ();

strip.show (); // Инициализируем все пиксели в положение "выключено"

}

void loop () {

if (analogRead (A0)> = 512) {

if (analogRead (A2)> = 768) {

if (analogRead (A3)> = 768) {

rainbowCycle (80, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A3)> = 512) {

rainbowCycle (60, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A3)> = 256) {

rainbowCycle (40, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

еще{

rainbowCycle (20, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

} else if (analogRead (A2)> = 512) {

if (analogRead (A1)> = 768) {

CylonBounce (случайный (255), случайный (255), случайный (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 512) {

CylonBounce (случайный (255), 0, 0, 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 256) {

CylonBounce (0, random (255), 0, 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

еще{

CylonBounce (0, 0, random (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

} else if (analogRead (A2)> = 256) {

if (analogRead (A1)> = 768) {

байт r, g, b;

г = случайный (255);

г = случайный (255);

b = случайный (255);

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 512) {

байт r, g, b;

г = случайный (255);

г = 0;

b = 0;

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 256) {

байт r, g, b;

г = 0;

г = случайный (255);

b = 0;

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

еще{

байт r, g, b;

г = 0;

г = 0;

b = случайный (255);

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

}

else {if (analogRead (A1)> = 768) {

RunningLights (random (255), random (255), random (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 512) {

RunningLights (random (255), 1, 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 256) {

RunningLights (1, random (255), 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

еще{

RunningLights (1, 1, random (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

}

}еще{

setAll (0, 0, 0);

}

}

void rainbowCycle (int SpeedDelay, int oldA0, int oldA1, int oldA2, int oldA3) {

байт * c;

uint16_t i, j;

for (j = 0; j <256 * 5; j ++) {// 5 циклов всех цветов на колесе

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

for (i = 0; i <NUM_LEDS; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

c = Колесо (((i * 256 / NUM_LEDS) + j) & 255);

setPixel (i, * c, * (c + 1), * (c + 2));

}

showStrip ();

задержка (SpeedDelay);

}

}

byte * Wheel (byte WheelPos) {

статический байт c [3];

if (WheelPos <85) {

c [0] = WheelPos * 3;

c [1] = 255 - WheelPos * 3;

c [2] = 0;

} else if (WheelPos <170) {

WheelPos - = 85;

c [0] = 255 - WheelPos * 3;

c [1] = 0;

c [2] = WheelPos * 3;

} еще {

WheelPos - = 170;

c [0] = 0;

c [1] = WheelPos * 3;

c [2] = 255 - WheelPos * 3;

}

return c;

}

void CylonBounce (красный байт, зеленый байт, синий байт, int EyeSize, int oldA0, int oldA1, int oldA2, int oldA3) {

int SpeedDelay;

int ReturnDelay;

if (analogRead (A3)> = 768) {SpeedDelay = 80; ReturnDelay = 120;}

иначе if (analogRead (A3)> = 512) {SpeedDelay = 60; ReturnDelay = 100;}

иначе if (analogRead (A3)> = 256) {SpeedDelay = 40; ReturnDelay = 80;}

else {SpeedDelay = 20; ReturnDelay = 60;}

for (int i = 0; i <NUM_LEDS-EyeSize-2; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

setAll (0, 0, 0);

setPixel (i, красный / 10, зеленый / 10, синий / 10);

for (int j = 1; j <= EyeSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

setPixel (i + j, красный, зеленый, синий);

}

setPixel (i + EyeSize + 1, красный / 10, зеленый / 10, синий / 10);

showStrip ();

задержка (SpeedDelay);

}

задержка (ReturnDelay);

for (int i = NUM_LEDS-EyeSize-2; i> 0; i--) {

setAll (0, 0, 0);

setPixel (i, красный / 10, зеленый / 10, синий / 10);

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

for (int j = 1; j <= EyeSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

setPixel (i + j, красный, зеленый, синий);

}

setPixel (i + EyeSize + 1, красный / 10, зеленый / 10, синий / 10);

showStrip ();

задержка (SpeedDelay);

}

задержка (ReturnDelay);

}

void RunningLights (байт красный, байт зеленый, байт синий, int oldA0, int oldA1, int oldA2, int oldA3) {

int Position = 0;

int WaveDelay;

if (analogRead (A3)> = 768) {WaveDelay = 80;}

иначе, если (analogRead (A3)> = 512) {WaveDelay = 60;}

иначе, если (analogRead (A3)> = 256) {WaveDelay = 40;}

иначе {WaveDelay = 20;}

для (int j = 0; j

{

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

Позиция ++; // = 0; // Позиция + Ставка;

для (int i = 0; i

// синусоида, 3 волны смещения создают радугу!

// float level = sin (i + Position) * 127 + 128;

// setPixel (i, level, 0, 0);

// float level = sin (i + Position) * 127 + 128;

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

setPixel (i, ((sin (i + Position) * 127 + 128) / 255) * красный, ((sin (i + Position) * 127 + 128) / 255) * зеленый, ((sin (i + Position) * 127 + 128) / 255) * синий);

}

showStrip ();

задержка (WaveDelay);

}

}

void meteorRain (байт красный, байт зеленый, байт синий, байт meteorSize, байт meteorTrailDecay, логическое meteorRandomDecay, int oldA0, int oldA1, int oldA2, int oldA3) {

setAll (0, 0, 0);

int SpeedDelay;

if (analogRead (A3)> = 768) {SpeedDelay = 80;}

иначе, если (analogRead (A3)> = 512) {SpeedDelay = 60;}

иначе, если (analogRead (A3)> = 256) {SpeedDelay = 40;}

else {SpeedDelay = 20;}

for (int i = 0; i <NUM_LEDS + NUM_LEDS; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

// уменьшение яркости всех светодиодов на один шаг

для (int j = 0; j

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

if ((! meteorRandomDecay) || (random (10)> 5)) {

fadeToBlack (j, meteorTrailDecay);

}

}

// рисуем метеор

for (int j = 0; j <meteorSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1 + 256) analogRead (A2)) || ((oldA2 + 256) analogRead (A3)) | | ((старыйA3 + 256)

перерыв;

}

if ((i-j = 0)) {

setPixel (i-j, красный, зеленый, синий);

}

}

showStrip ();

задержка (SpeedDelay);

}

}

void fadeToBlack (int ledNo, byte fadeValue) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

uint32_t oldColor;

uint8_t r, g, b;

значение int;

oldColor = strip.getPixelColor (ledNo);

r = (oldColor & 0x00ff0000UL) >> 16;

g = (oldColor & 0x0000ff00UL) >> 8;

b = (oldColor & 0x000000ffUL);

г = (г <= 10)? 0: (число) r- (r * fadeValue / 256);

г = (г <= 10)? 0: (число) g- (g * fadeValue / 256);

b = (b <= 10)? 0: (число) b- (b * fadeValue / 256);

strip.setPixelColor (ledNo, r, g, b);

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

светодиоды [ledNo].fadeToBlackBy (fadeValue);

#endif

}

// *** ЗАМЕНИТЬ ЗДЕСЬ ***

void showStrip () {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.show ();

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

FastLED.show ();

#endif

}

void setPixel (int Pixel, байт красный, байт зеленый, байт синий) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.setPixelColor (Пиксель, strip. Color (красный, зеленый, синий));

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

светодиоды [пиксель].r = красный;

светодиоды [пиксель].g = зеленый;

светодиоды [пиксель].b = синий;

#endif

}

void setAll (байт красный, байт зеленый, байт синий) {

for (int i = 0; i <NUM_LEDS; i ++) {

setPixel (i, красный, зеленый, синий);

}

showStrip ();

}

Шаг 3: Создание часов

Создание часов
Создание часов
Создание часов
Создание часов
Создание часов
Создание часов

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

Шаг 1. Откройте часы и снимите переднее стекло.

Шаг 2. Наденьте защитную пленку на переднее стекло (в этом видео показано, как это сделать).

Шаг 3: Прикрепите гибкое зеркало к внутренней части часов (перед этим снимите стрелки часов).

Шаг 4: Сделайте отверстие посередине, чтобы стрелки часов можно было вставить обратно.

Шаг 5: Поместите светодиодную ленту вокруг внутренних стенок часов (для этого шага я использовал пистолет для горячего клея).

Шаг 6: Включите светодиодную ленту и поместите стекло поверх часов, чтобы увидеть, есть ли эффект бесконечного зеркала.

Шаг 7: Как только вы закончите со всем, соедините часы и пропустите провода к задней части.

Шаг 8: Поздравляем, вы завершили проект, и все должно работать нормально

Если у вас есть какие-либо вопросы, прокомментируйте их ниже (знайте, что я не смогу ответить, но я сделаю все возможное)

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