İçindekiler:

Potansiyometreli Sonsuz Ayna Saati: 3 Adım
Potansiyometreli Sonsuz Ayna Saati: 3 Adım

Video: Potansiyometreli Sonsuz Ayna Saati: 3 Adım

Video: Potansiyometreli Sonsuz Ayna Saati: 3 Adım
Video: Dwin Ekranlar ile 3 farklı Proje 2024, Kasım
Anonim
Potansiyometreli Sonsuz Ayna Saati
Potansiyometreli Sonsuz Ayna Saati

Sonsuzluk aynasına rastladım ve gerçekten harika olduğunu gördüm. Bu bana bir sonsuzluk aynası yapmak için ilham verdi ama bir amacım olması gerekiyordu. Bu yüzden, çalışan bir sonsuzluk aynalı saat yapmaya karar verdim. Bu, potansiyometre kullanarak modları, hızı ve renkleri değiştirmenize izin veren bir sonsuzluk aynasıdır. (Not: İlk defa böyle bir şey yapıyorum)

Gereçler

Bu şeyi yapmak için neye ihtiyacınız olduğuna bakalım!

İhtiyacın olacak…

1) 1 Arduino Uno

3) 1 Ekmek Tahtası

4) 1 Sürgülü Anahtar

5) 3 Potansiyometre

6) 1 9V pil

7) 5 metre WS2811 LED Şerit

8) Jumper Kablo Telleri

9) Bir Saat (12 inç Büyük Modern Saat kullandığım Saat)

10) Esnek Ayna Levhası (Ayna Levha kullandığım)

11) Gizlilik Filmi (Tek Yönlü Ayna kullandığım)

12) Lehimleme gerekli olabilir, bu, sahip olduğunuz malzemelere bağlıdır.

Adım 1: Kablolama

kablolama
kablolama
kablolama
kablolama

Kablolama oldukça basit

- SPST Anahtarı LED'leri açar ve kapatır (A0)

- Sol potansiyometre ışığı kontrol eder (A1)

- Orta potansiyometre, modları kontrol eder (A2)

- Sağ potansiyometre hızı kontrol eder (A3)

2. Adım: Kod

#Dahil etmek

#define PIN 6

#define NUM_LEDS 54

#define A0 A0

#define A1 A1

#define A2 A2

#define A3 A3

// Parametre 1 = şeritteki piksel sayısı

// Parametre 2 = pin numarası (çoğu geçerlidir)

// Parametre 3 = piksel tipi bayraklar, gerektiği gibi ekleyin:

// NEO_KHZ800 800 KHz bit akışı (çoğu NeoPixel ürünü, WS2812 LED'li)

// NEO_KHZ400 400 KHz (klasik 'v1' (v2 değil) FLORA pikselleri, WS2811 sürücüleri)

// NEO_GRB Pikselleri, GRB bit akışı için kablolanmıştır (çoğu NeoPixel ürünü)

// NEO_RGB Pikseller RGB bit akışı için kablolanmıştır (v2 değil v1 FLORA pikselleri)

Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

geçersiz kurulum() {

strip.begin();

şerit.göster(); // Tüm pikselleri 'kapalı' olarak başlat

}

boşluk döngüsü () {

if(analogRead(A0)>=512){

if(analogRead(A2)>=768){

if(analogRead(A3)>=768){

gökkuşağıCycle(80, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));

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

gökkuşağıCycle(60, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));

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

gökkuşağıCycle(40, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));

}

Başka{

gökkuşağıCycle(20, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));

}

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

if(analogRead(A1)>=768){

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

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

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

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

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

}

Başka{

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

}

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

if(analogRead(A1)>=768){

bayt r, g, b;

r = rastgele(255);

g = rastgele(255);

b = rastgele(255);

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

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

bayt r, g, b;

r = rastgele(255);

g = 0;

b = 0;

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

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

bayt r, g, b;

r = 0;

g = rastgele(255);

b = 0;

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

}

Başka{

bayt r, g, b;

r = 0;

g = 0;

b = rastgele(255);

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

}

}

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

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

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

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

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

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

}

Başka{

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

}

}

}Başka{

setAll(0, 0, 0);

}

}

void gökkuşağıCycle(int SpeedDelay, int eskiA0, int eskiA1, int eskiA2, int eskiA3) {

bayt *c;

uint16_t ben, j;

for(j=0; j<256*5; j++) { // çarkta tüm renklerden 5 döngü

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

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

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

c=Çark(((i * 256 / NUM_LEDS) + j) & 255);

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

}

showStrip();

gecikme (Hız Gecikmesi);

}

}

bayt * Tekerlek(bayt WheelPos) {

statik bayt c[3];

if(WheelPos < 85) {

c[0]=WheelPos * 3;

c[1]=255 - WheelPos * 3;

c[2]=0;

} else if(WheelPos < 170) {

TekerlekPos -= 85;

c[0]=255 - WheelPos * 3;

c[1]=0;

c[2]=WheelPos * 3;

} Başka {

TekerlekPos -= 170;

c[0]=0;

c[1]=WheelPos * 3;

c[2]=255 - WheelPos * 3;

}

dönüş c;

}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int eskiA0, int eskiA1, int eskiA2, int eskiA3){

int SpeedDelay;

int ReturnDelay;

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

else if(analogRead(A3)>=512){SpeedDelay=60;ReturnDelay=100;}

else 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))| |((eskiA3+256)

kırmak;

}

setAll(0, 0, 0);

setPixel(i, kırmızı/10, yeşil/10, mavi/10);

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

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

setPixel(i+j, kırmızı, yeşil, mavi);

}

setPixel(i+EyeSize+1, kırmızı/10, yeşil/10, mavi/10);

showStrip();

gecikme (Hız Gecikmesi);

}

gecikme (Dönüş Gecikmesi);

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

setAll(0, 0, 0);

setPixel(i, kırmızı/10, yeşil/10, mavi/10);

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

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

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

setPixel(i+j, kırmızı, yeşil, mavi);

}

setPixel(i+EyeSize+1, kırmızı/10, yeşil/10, mavi/10);

showStrip();

gecikme (Hız Gecikmesi);

}

gecikme (DönüşGecikmesi);

}

void RunningLights(byte red, byte green, byte blue, int oldA0, int oldA1, int oldA2, int oldA3) {

int Konum=0;

int WaveDelay;

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

else if(analogRead(A3)>=512){WaveDelay=60;}

else if(analogRead(A3)>=256){WaveDelay=40;}

başka{WaveDelay=20;}

for(int j=0; j

{

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

Pozisyon++; // = 0; //Konum + Oran;

for(int i=0; ben

// sinüs dalgası, 3 ofset dalga gökkuşağı yapar!

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

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

//yüzer seviye = sin(i+Konum) * 127 + 128;

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

setPixel(i, ((günah(i+Konum) * 127 + 128)/255)*kırmızı, ((sin(i+Konum) * 127 + 128)/255)*yeşil, ((sin(i+Konum) * 127 + 128)/255)*mavi);

}

showStrip();

gecikme (Dalga Gecikmesi);

}

}

void meteorRain(byte red, byte green, byte blue, byte meteorSize, byte meteorTrailDecay, boolean meteorRandomDecay, int oldA0, int oldA1, int oldA2, int oldA3) {

setAll(0, 0, 0);

int SpeedDelay;

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

else if(analogRead(A3)>=512){SpeedDelay=60;}

else if(analogRead(A3)>=256){SpeedDelay=40;}

başka{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))| |((eskiA3+256)

kırmak;

}

// tüm LED'ler bir adımda parlaklığı azaltır

for(int j=0; j

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

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

fadeToBlack(j, meteorTrailDecay);

}

}

// meteor çiz

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

if(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((eskiA3+256)

kırmak;

}

if((i-j =0)) {

setPixel(i-j, kırmızı, yeşil, mavi);

}

}

showStrip();

gecikme (Hız Gecikmesi);

}

}

void fadeToBlack(int ledNo, byte fadeValue) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPiksel

uint32_t eskiRenk;

uint8_t r, g, b;

int değeri;

oldColor = strip.getPixelColor(ledNo);

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

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

b = (eskiRenk & 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

// HızlıLED

ledler[ledNo].fadeToBlackBy(fadeValue);

#endif

}

// *** BURAYA DEĞİŞTİR ***

geçersiz showStrip() {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPiksel

şerit.göster();

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// HızlıLED

FastLED.show();

#endif

}

void setPixel(int Pixel, bayt kırmızı, bayt yeşil, bayt mavi) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPiksel

strip.setPixelColor(Pixel, strip. Color(kırmızı, yeşil, mavi));

#endif

#ifndef ADAFRUIT_NEOPIXEL_H

// HızlıLED

ledler[Piksel].r = kırmızı;

ledler[Piksel].g = yeşil;

ledler[Piksel].b = mavi;

#endif

}

void setAll(bayt kırmızı, bayt yeşil, bayt mavi) {

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

setPixel(i, kırmızı, yeşil, mavi);

}

showStrip();

}

Adım 3: Saati Oluşturma

Saati Oluşturmak
Saati Oluşturmak
Saati Oluşturmak
Saati Oluşturmak
Saati Oluşturmak
Saati Oluşturmak

İçi düz bir cam saat almanızı tavsiye ederim. Esnek aynayı saatin içine uygularken saatin içindeki sayıların dışarı çıkması nedeniyle bir sorun vardı, ayna bükülüyordu ve sonsuzluk aynası efekti olmuyordu. Olabildiğince düz olması için esnek ayna tabakasına ve Gizlilik Filmine sahip olmanız gerekir. Bir saat alıyorsanız, LED'i sorunsuz bir şekilde yerleştirebildiğinizden emin olun.

Adım 1: Saati açın ve ön camı çıkarın

2. Adım: Gizlilik Filmini ön cama yerleştirin (Bu video size nasıl yapılacağını gösterir)

Adım 3: Esnek aynayı saatin iç tarafına uygulayın (Bunu yapmadan önce saat kollarını çıkarın)

Adım 4: Saat ibrelerinin geri yerleştirilmesi için ortada bir delik açın

Adım 5: LED şeridi saatin iç duvarlarının etrafına yerleştirin (Bu adım için sıcak tutkal tabancası kullandım)

Adım 6: Sonsuzluk aynası efektinin orada olup olmadığını görmek için LED şeridi açın ve camı saatin üstüne yerleştirin.

7. Adım: Her şey bittiğinde saati bir araya getirin ve kabloların arkaya geçmesine izin verin.

8. Adım: Tebrikler projeyi tamamladınız ve her şey yolunda gitmeli

Herhangi bir sorunuz varsa lütfen aşağıya yorum yapın (Bilin ki cevap veremeyebilirim ama elimden geleni yapacağım)

Önerilen: