Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:04
Я наткнулся на бесконечное зеркало и нашел его действительно крутым. Это вдохновило меня на создание бесконечного зеркала, но мне нужно, чтобы у него была цель. Итак, я решил сделать работающие зеркальные часы на бесконечность. Это зеркало бесконечности, которое позволяет изменять режимы, скорость и цвета с помощью потенциометров. (Примечание: я впервые делаю что-то подобное)
Запасы
Давайте погрузимся в то, что вам нужно, чтобы сделать эту вещь!
Тебе понадобится…
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: Поздравляем, вы завершили проект, и все должно работать нормально
Если у вас есть какие-либо вопросы, прокомментируйте их ниже (знайте, что я не смогу ответить, но я сделаю все возможное)
Рекомендуемые:
Часы Vortex: наручные часы с зеркалом бесконечности: 10 шагов (с изображениями)
Часы Vortex: наручные часы с зеркалом бесконечности: целью этого проекта было создание носимой версии зеркальных часов бесконечности. Он использует свои светодиоды RGB для индикации времени, назначая часы, минуты и секунды красным, зеленым и синим светам соответственно и перекрывая эти оттенки t
Часы для измерения расстояния: 4 ступени
Часы для измерения расстояния: в этом проекте я сжал и установил систему измерения расстояния Arduino на часы. Проект классный, простой и полезный. Система измерения расстояния основана на простой физике расстояния, скорости и времени
Светодиодные матричные часы: 3 ступени
Светодиодные матричные часы: это руководство показывает, как мы можем создать матричные часы с красными светодиодами, которые могут получать дату / время из Интернета и отображать их с помощью светодиодной матрицы также шаги f
Зеркальные часы бесконечности: 5 шагов (с изображениями)
Бесконечные зеркальные часы: это часы ручной работы в основном для украшения. В часах есть несколько светодиодных ламп, при включении это красивое украшение для спальни. В выключенном состоянии это маленькое зеркало. Конечно, это сами часы
Миниатюрные солнечные часы: 4 ступени
Миниатюрные солнечные часы: в этом руководстве я покажу вам, как сделать миниатюрные солнечные часы. Основные вещи, которые вам понадобятся: - Деревянная доска (например, 15 мм x 10 мм: часы будут достаточно большими, чтобы видеть время, и достаточно маленькими, чтобы их можно было увидеть). легко перемещается, но выбор за вами