
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 12:57

Попаднах на безкрайно огледало и открих, че е наистина страхотно. Това ме вдъхнови да направя безкрайно огледало, но имах нужда от него, за да има цел. И така, реших да направя функциониращ безкраен огледален часовник. Това е безкрайно огледало, което ви позволява да променяте режимите, скоростта и цветовете с помощта на потенциометри. (Забележка: За първи път правя нещо подобно)
Консумативи
Нека се потопим в това, от което се нуждаете, за да направите това нещо!
Ще имаш нужда…
1) 1 Arduino Uno
3) 1 Платка
4) 1 Плъзгащ превключвател
5) 3 потенциометра
6) 1 9V батерия
7) 5 -метрова LED лента WS2811
8) Кабелни проводници на джъмпера
9) Часовник (Часовникът, който използвах 12 инчов голям модерен часовник)
10) Гъвкав огледален лист (този, който използвах огледален лист)
11) Филм за поверителност (този, който използвах еднопосочно огледало)
12) Може да се наложи запояване, което зависи от това какви материали имате
Стъпка 1: Окабеляване


Окабеляването е съвсем просто
- Превключвателят SPST включва и изключва светодиодите (A0)
- Левият потенциометър контролира светлината (A1)
- Средният потенциометър контролира режимите (A2)
- Десният потенциометър контролира скоростта (A3)
Стъпка 2: Кодът
#включва
#дефинирайте ПИН 6
#дефинирайте NUM_LEDS 54
#дефинирайте A0 A0
#дефинирайте A1 A1
#дефинирайте A2 A2
#дефинирайте A3 A3
// Параметър 1 = брой пиксели в лентата
// Параметър 2 = пинов номер (повечето са валидни)
// Параметър 3 = флагове тип пиксел, добавете заедно, ако е необходимо:
// NEO_KHZ800 800 KHz битов поток (повечето NeoPixel продукти с WS2812 светодиоди)
// NEO_KHZ400 400 KHz (класически 'v1' (не v2) FLORA пиксели, драйвери WS2811)
// NEO_GRB Пикселите са свързани за GRB битстрийм (повечето NeoPixel продукти)
// NEO_RGB Пиксели са свързани за RGB битов поток (v1 FLORA пиксели, а не 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));
} иначе ако (analogRead (A3)> = 512) {
rainbowCycle (60, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A3)> = 256) {
rainbowCycle (40, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
иначе {
rainbowCycle (20, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
} иначе ако (analogRead (A2)> = 512) {
if (analogRead (A1)> = 768) {
CylonBounce (случаен (255), случаен (255), случаен (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 512) {
CylonBounce (произволен (255), 0, 0, 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 256) {
CylonBounce (0, случаен (255), 0, 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
иначе {
CylonBounce (0, 0, случаен (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
} иначе ако (analogRead (A2)> = 256) {
if (analogRead (A1)> = 768) {
байт r, g, b;
r = случаен (255);
g = случаен (255);
b = случаен (255);
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 512) {
байт r, g, b;
r = случаен (255);
g = 0;
b = 0;
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 256) {
байт r, g, b;
r = 0;
g = случаен (255);
b = 0;
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
иначе {
байт r, g, b;
r = 0;
g = 0;
b = случаен (255);
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
}
else {if (analogRead (A1)> = 768) {
RunningLights (произволен (255), случаен (255), случаен (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 512) {
RunningLights (произволен (255), 1, 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} иначе ако (analogRead (A1)> = 256) {
RunningLights (1, случаен (255), 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
иначе {
RunningLights (1, 1, случаен (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
}
} else {
setAll (0, 0, 0);
}
}
void rainbowCycle (int SpeedDelay, int oldA0, int oldA1, int oldA2, int oldA3) {
байт *c;
uint16_t i, j;
за (j = 0; j <256*5; j ++) {// 5 цикъла на всички цветове на колелото
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
прекъсване;
}
за (i = 0; i <NUM_LEDS; i ++) {
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
прекъсване;
}
c = колело (((i * 256 / NUM_LEDS) + j) & 255);
setPixel (i, *c, *(c+1), *(c+2));
}
showStrip ();
забавяне (SpeedDelay);
}
}
байт * колело (байт WheelPos) {
статичен байт c [3];
if (WheelPos <85) {
c [0] = WheelPos * 3;
c [1] = 255 - WheelPos * 3;
c [2] = 0;
} иначе ако (WheelPos <170) {
WheelPos -= 85;
c [0] = 255 - WheelPos * 3;
c [1] = 0;
c [2] = WheelPos * 3;
} else {
WheelPos -= 170;
c [0] = 0;
c [1] = WheelPos * 3;
c [2] = 255 - WheelPos * 3;
}
връщане 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;}
иначе ако (analogRead (A3)> = 512) {SpeedDelay = 60; ReturnDelay = 100;}
иначе ако (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)) | | ((oldA3+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)) | | ((oldA3+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)) | | ((oldA3+256)
прекъсване;
}
for (int j = 1; j <= EyeSize; j ++) {
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+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 позиция = 0;
int WaveDelay;
if (analogRead (A3)> = 768) {WaveDelay = 80;}
иначе ако (analogRead (A3)> = 512) {WaveDelay = 60;}
иначе ако (analogRead (A3)> = 256) {WaveDelay = 40;}
else {WaveDelay = 20;}
за (int j = 0; j
{
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
прекъсване;
}
Позиция ++; // = 0; // Позиция + курс;
за (int i = 0; i
// синусоида, 3 офсетови вълни правят дъга!
// плаващо ниво = sin (i + позиция) * 127 + 128;
// setPixel (i, ниво, 0, 0);
// плаващо ниво = sin (i + позиция) * 127 + 128;
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
прекъсване;
}
setPixel (i, ((sin (i + Position) * 127 + 128)/255) * червено, ((sin (i + позиция) * 127 + 128)/255) * зелено, ((sin (i + позиция) * 127 + 128)/255) * синьо);
}
showStrip ();
забавяне (WaveDelay);
}
}
void meteorRain (байт червен, байт зелен, байт син, байт метеор Размер, байт метеорTrailDecay, булев метеорRandomDecay, 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;}
за (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)) | | ((oldA3+256)
прекъсване;
}
// избледняване на яркостта на всички светодиоди една стъпка
за (int j = 0; j
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+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)) | | ((oldA3+256)
прекъсване;
}
ако ((i-j = 0)) {
setPixel (i-j, червено, зелено, синьо);
}
}
showStrip ();
забавяне (SpeedDelay);
}
}
void fadeToBlack (int ledNo, байт 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);
r = (r <= 10)? 0: (int) r- (r*fadeValue/256);
g = (g <= 10)? 0: (int) g- (g*fadeValue/256);
b = (b <= 10)? 0: (int) 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 (Pixel, strip. Color (червено, зелено, синьо));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
светодиоди [Pixel].r = червено;
светодиоди [пиксел].g = зелен;
светодиоди [Pixel].b = синьо;
#endif
}
void setAll (байт червен, байт зелен, байт син) {
for (int i = 0; i <NUM_LEDS; i ++) {
setPixel (i, червено, зелено, синьо);
}
showStrip ();
}
Стъпка 3: Създаване на часовника



Бих препоръчал да вземете стъклен часовник, който е плосък от вътрешната страна. Когато прилагах гъвкавото огледало във вътрешността на часовника, възникна проблем поради изскачащите числа в часовника, огледалото се огъна, в резултат на което ефектът на безкрайното огледало не се случи. Трябва да имате гъвкавия огледален лист и филма за поверителност, за да бъдат възможно най -плоски. Ако получавате часовник, уверете се, че можете да поставите светодиода вътре без проблем.
Стъпка 1: Отворете часовника и свалете предното стъкло
Стъпка 2: Поставете филма за поверителност на предното стъкло (Този видеоклип ви показва как да го направите)
Стъпка 3: Нанесете гъвкавото огледало от вътрешната страна на часовника (Махнете стрелките на часовниците, преди да направите това)
Стъпка 4: Направете дупка в средата, за да се върнат стрелките на часовника
Стъпка 5: Поставете LED лентата около вътрешните стени на часовника (използвах пистолет за горещо лепило за тази стъпка)
Стъпка 6: Включете LED лентата и поставете стъклото върху часовника, за да видите дали има ефект на безкрайното огледало
Стъпка 7: След като приключите с всичко, сложете часовника заедно и оставете кабелите да преминат отзад
Стъпка 8: Поздравления, че завършихте проекта и всичко трябва да работи добре
Ако имате въпроси, моля, коментирайте ги по -долу (Знайте, че може да не мога да отговоря, но ще направя всичко възможно)
Препоръчано:
Направете безкраен огледален часовник: 15 стъпки (със снимки)

Направете безкраен огледален часовник: В предишен проект изградих безкрайно огледало, където крайната ми цел беше да го превърна в часовник. (Направете цветно огледало за безкрайност) Не го преследвах, след като го построих, защото макар да изглеждаше готино, имаше няколко неща с
Лесен огледален часовник безкрайност: 3 стъпки

Лесен DIY Infinity огледален часовник: Ако сте отегчени от нормалния си часовник, опитайте да направите този готин DIY Infinity Mirror Clock. За да изравните стаята си
ESP8266 Мрежов часовник без RTC - Nodemcu NTP Часовник Няма RTC - ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: 4 стъпки

ESP8266 Мрежов часовник без RTC | Nodemcu NTP Часовник Няма RTC | ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: В проекта ще се прави часовник проект без RTC, ще отнеме време от интернет с помощта на wifi и ще го покаже на дисплея st7735
Огледален часовник Infinity: 5 стъпки (със снимки)

Огледален часовник Infinity: Това е ръчно изработен часовник предимно за декорация. Има няколко LED светлини в часовника, когато е включен, той е красива декорация за спалня. Когато е изключен, това е малко огледало. Разбира се, това е самият часовник
Огледален часовник Infinity Mirror в IKEA Frame Frame: 4 стъпки

Infinity Mirror Wall Clock в IKEA Frame Frame: Здравейте, винаги съм искал да построя стенен часовник. В магазини като IKEA има много прекрасни стенни часовници. Имах някои проблеми с тези търговски часовници. Те са твърде силни за мен (непрекъснатият тик-так е досаден), не виждам стрелките за часове