Съдържание:

Огледален часовник Infinity с потенциометри: 3 стъпки
Огледален часовник Infinity с потенциометри: 3 стъпки

Видео: Огледален часовник Infinity с потенциометри: 3 стъпки

Видео: Огледален часовник Infinity с потенциометри: 3 стъпки
Видео: Интересные настольные часы DT-6507 2024, Юли
Anonim
Огледален часовник Infinity с потенциометри
Огледален часовник Infinity с потенциометри

Попаднах на безкрайно огледало и открих, че е наистина страхотно. Това ме вдъхнови да направя безкрайно огледало, но имах нужда от него, за да има цел. И така, реших да направя функциониращ безкраен огледален часовник. Това е безкрайно огледало, което ви позволява да променяте режимите, скоростта и цветовете с помощта на потенциометри. (Забележка: За първи път правя нещо подобно)

Консумативи

Нека се потопим в това, от което се нуждаете, за да направите това нещо!

Ще имаш нужда…

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: Поздравления, че завършихте проекта и всичко трябва да работи добре

Ако имате въпроси, моля, коментирайте ги по -долу (Знайте, че може да не мога да отговоря, но ще направя всичко възможно)

Препоръчано: