Sadržaj:
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:05
Naišao sam na beskonačno ogledalo i otkrio da je zaista kul. Ovo me inspirisalo da napravim ogledalo u beskonačnosti, ali trebalo mi je da ima svrhu. Odlučio sam napraviti funkcionalni beskonačni ogledalni sat. Ovo je beskonačno ogledalo koje vam omogućuje promjenu načina rada, brzine i boja pomoću potenciometara. (Napomena: Ovo je prvi put da radim ovako nešto)
Supplies
Zaronimo u ono što vam je potrebno da napravite ovu stvar!
Trebat će vam…
1) 1 Arduino Uno
3) 1 Oglasna ploča
4) 1 Klizni prekidač
5) 3 potenciometra
6) 1 9V baterija
7) LED traka od 5 metara WS2811
8) Žice kabela kratkospojnika
9) Sat (Sat koji sam koristio 12 -inčni veliki moderni sat)
10) Fleksibilni zrcalni list (onaj koji sam koristio zrcalni list)
11) Film o privatnosti (onaj koji sam koristio jednosmjerno ogledalo)
12) Možda će biti potrebno lemljenje, ovisno o materijalu koji imate
Korak 1: Ožičenje
Ožičenje je vrlo jednostavno
- SPST prekidač uključuje i isključuje LED diode (A0)
- Lijevi potenciometar kontrolira svjetlo (A1)
- Srednji potenciometar kontrolira načine rada (A2)
- Desni potenciometar kontrolira brzinu (A3)
Korak 2: Kodeks
#include
#define PIN 6
#define NUM_LEDS 54
#define A0 A0
#define A1 A1
#define A2 A2
#define A3 A3
// Parametar 1 = broj piksela u traci
// Parametar 2 = pin broj (većina je ispravna)
// Parametar 3 = zastavice tipa piksela, zbrajajte po potrebi:
// NEO_KHZ800 800 kHz bitstream (većina NeoPixel proizvoda sa LED diodama WS2812)
// NEO_KHZ400 400 KHz (klasični 'v1' (ne v2) FLORA pikseli, upravljački programi WS2811)
// NEO_GRB Pikseli su ožičeni za GRB bitstream (većina NeoPixel proizvoda)
// NEO_RGB Pikseli su ožičeni za RGB bitstream (v1 FLORA piksela, ne v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup () {
strip.begin ();
strip.show (); // Pokretanje svih piksela na "isključeno"
}
void loop () {{100} {101}
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));
}
else {
rainbowCycle (20, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
} else if (analogRead (A2)> = 512) {
if (analogRead (A1)> = 768) {
CylonBounce (nasumično (255), slučajno (255), slučajno (255), 4, analogno čitanje (A0), analogno čitanje (A1), analogno čitanje (A2), analogno čitanje (A3));
} else if (analogRead (A1)> = 512) {
CylonBounce (nasumično (255), 0, 0, 4, analogno čitanje (A0), analogno čitanje (A1), analogno čitanje (A2), analogno čitanje (A3));
} else if (analogRead (A1)> = 256) {
CylonBounce (0, slučajno (255), 0, 4, analogno čitanje (A0), analogno čitanje (A1), analogno čitanje (A2), analogno čitanje (A3));
}
else {
CylonBounce (0, 0, random (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
} else if (analogRead (A2)> = 256) {
if (analogRead (A1)> = 768) {
bajt r, g, b;
r = slučajno (255);
g = slučajno (255);
b = slučajno (255);
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
} else if (analogRead (A1)> = 512) {
bajt r, g, b;
r = slučajno (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) {
bajt r, g, b;
r = 0;
g = slučajno (255);
b = 0;
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
else {
bajt r, g, b;
r = 0;
g = 0;
b = slučajno (255);
meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
}
else {if (analogRead (A1)> = 768) {
RunningLights (nasumično (255), slučajno (255), slučajno (255), analogno čitanje (A0), analogno čitanje (A1), analogno čitanje (A2), analogno čitanje (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));
}
else {
RunningLights (1, 1, random (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) {
bajt *c;
uint16_t i, j;
za (j = 0; j <256*5; j ++) {// 5 ciklusa svih boja na kotaču
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
za (i = 0; i <NUM_LEDS; i ++) {
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
c = Točak (((i * 256 / NUM_LEDS) + j) & 255);
setPixel (i, *c, *(c+1), *(c+2));
}
showStrip ();
kašnjenje (SpeedDelay);
}
}
byte * Wheel (byte WheelPos) {
statički bajt 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;
} else {
WheelPos -= 170;
c [0] = 0;
c [1] = WheelPos * 3;
c [2] = 255 - WheelPos * 3;
}
return c;
}
void CylonBounce (bajt crvena, bajt zelena, bajt plava, int EyeSize, int oldA0, int oldA1, int oldA2, int oldA3) {
int SpeedDelay;
int ReturnDelay;
if (analogRead (A3)> = 768) {SpeedDelay = 80; ReturnDelay = 120;}
inače if (analogRead (A3)> = 512) {SpeedDelay = 60; ReturnDelay = 100;}
inace 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)) | | ((oldA3+256)
break;
}
setAll (0, 0, 0);
setPixel (i, crveno/10, zeleno/10, plavo/10);
for (int j = 1; j <= Veličina oka; j ++) {
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
setPixel (i+j, crvena, zelena, plava);
}
setPixel (i+EyeSize+1, crveno/10, zeleno/10, plavo/10);
showStrip ();
kašnjenje (SpeedDelay);
}
kašnjenje (ReturnDelay);
for (int i = NUM_LEDS-EyeSize-2; i> 0; i--) {
setAll (0, 0, 0);
setPixel (i, crveno/10, zeleno/10, plavo/10);
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
for (int j = 1; j <= Veličina oka; j ++) {
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
setPixel (i+j, crvena, zelena, plava);
}
setPixel (i+EyeSize+1, crvena/10, zelena/10, plava/10);
showStrip ();
kašnjenje (SpeedDelay);
}
kašnjenje (ReturnDelay);
}
void RunningLights (bajt crveno, bajt zeleno, bajt plavo, int oldA0, int oldA1, int oldA2, int oldA3) {
int Pozicija = 0;
int WaveDelay;
if (analogRead (A3)> = 768) {WaveDelay = 80;}
inace if (analogRead (A3)> = 512) {WaveDelay = 60;}
inace if (analogRead (A3)> = 256) {WaveDelay = 40;}
else {WaveDelay = 20;}
za (int j = 0; j
{
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
Pozicija ++; // = 0; // Pozicija + stopa;
za (int i = 0; i
// sinusni val, 3 ofsetna vala čine dugu!
// plivajući nivo = sin (i + položaj) * 127 + 128;
// setPixel (i, nivo, 0, 0);
// plivajući nivo = sin (i + položaj) * 127 + 128;
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
setPixel (i, ((sin (i + Pozicija) * 127 + 128)/255) * crveno, ((sin (i + Pozicija) * 127 + 128)/255) * zelena, ((sin (i + položaj) * 127 + 128)/255) * plavo);
}
showStrip ();
kašnjenje (WaveDelay);
}
}
void meteorRain (bajt crvena, bajt zelena, bajt plava, bajt meteorSize, bajt meteorTrailDecay, boolean meteorRandomDecay, int oldA0, int oldA1, int oldA2, int oldA3) {
setAll (0, 0, 0);
int SpeedDelay;
if (analogRead (A3)> = 768) {SpeedDelay = 80;}
inace if (analogRead (A3)> = 512) {SpeedDelay = 60;}
inace if (analogRead (A3)> = 256) {SpeedDelay = 40;}
else {SpeedDelay = 20;}
za (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)
break;
}
// smanjivanje svjetline svih LED dioda u jednom koraku
za (int j = 0; j
if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((oldA3+256)
break;
}
if ((! meteorRandomDecay) || (slučajno (10)> 5)) {
fadeToBlack (j, meteorTrailDecay);
}
}
// nacrtati meteor
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)
break;
}
if ((i-j = 0)) {
setPixel (i-j, crvena, zelena, plava);
}
}
showStrip ();
kašnjenje (SpeedDelay);
}
}
void fadeToBlack (int ledNo, bajt fadeValue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
uint32_t oldColor;
uint8_t r, g, b;
int vrijednost;
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
LED diode [ledNo].fadeToBlackBy (fadeValue);
#endif
}
// *** ZAMJENITE OVDJE ***
void showStrip () {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show ();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show ();
#endif
}
void setPixel (int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor (Pixel, strip. Color (crvena, zelena, plava));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
LED diode [Pixel].r = crveno;
LED diode [Pixel].g = zelena;
LED diode [Pixel].b = plava;
#endif
}
void setAll (bajt crveno, bajt zeleno, bajt plavo) {
za (int i = 0; i <NUM_LEDS; i ++) {
setPixel (i, crveno, zeleno, plavo);
}
showStrip ();
}
Korak 3: Kreiranje sata
Preporučio bih da nabavite stakleni sat koji je iznutra ravan. Kada sam nanosio fleksibilno ogledalo na unutrašnjost sata, došlo je do problema jer su brojevi unutar sata iskočili, ogledalo se savijalo pa se efekat beskonačnog ogledala nije dogodio. Morate imati fleksibilni zrcalni list i film za privatnost da budu što ravniji. Ako dobijate sat, uverite se da možete bez problema postaviti LED diodu unutra.
Korak 1: Otvorite sat i uklonite prednje staklo
Korak 2: Stavite film o privatnosti na prednje staklo (ovaj video prikazuje kako to učiniti)
Korak 3: Nanesite fleksibilno ogledalo na unutrašnjost sata (prije nego što to učinite, uklonite kazaljke na satovima)
Korak 4: Napravite rupu u sredini za vraćanje kazaljki na satu
Korak 5: Postavite LED traku oko unutrašnjih zidova sata (za ovaj korak sam upotrijebio pištolj za vruće ljepilo)
Korak 6: Uključite LED traku i stavite staklo na vrh sata da vidite postoji li efekat beskonačnog ogledala
Korak 7: Kad završite sa svime, spojite sat i pustite žice da prođu do stražnje strane
Korak 8: Čestitamo, završili ste projekt i sve bi trebalo funkcionirati
Ako imate bilo kakvih pitanja, komentirajte ih u nastavku (znajte da možda neću moći odgovoriti, ali potrudit ću se)
Preporučuje se:
Napravite beskonačni ogledalni sat: 15 koraka (sa slikama)
Napravite beskonačni ogledalni sat: U prethodnom projektu izgradio sam beskonačno ogledalo, gde mi je krajnji cilj bio da napravim sat. (Napravite šareno beskonačno ogledalo) Nisam se time bavio nakon izgradnje jer, iako je izgledalo super, bilo je nekoliko stvari s tim
Beskonačni sat kontroliran pametnim telefonom: 5 koraka (sa slikama)
Beskonačni sat kontroliran pametnim telefonom: Vidio sam mnoge projekte beskonačnih ogledala i beskonačnih satova na instrukcijama, pa sam odlučio napraviti svoj. Možda se ne razlikuje mnogo od ostalih … ali ja sam to uradio, tako je! U slučaju da to već ne znate: šta je beskonačnost
3D štampani beskonačni sat: 3 koraka (sa slikama)
3D štampani beskonačni sat: Dakle, ideja sa ovim satom je da ga napravimo u obliku simbola beskonačnosti na kojoj će jedna strana oblika prikazivati kazaljke sata, a druga će prikazivati minute. Ako imate bilo kakvih prijedloga ili pitanja za dizajn ili bakalar
Jednostavan DIY Infinity ogledalni sat: 3 koraka
Jednostavan DIY Infinity ogledalni sat: Ako vam je dosadio vaš uobičajeni sat, pokušajte napraviti ovaj cool DIY Infinity ogledalni sat. Da poravnate sobu
Beskonačni ogledalni sat: 5 koraka (sa slikama)
Beskonačni ogledalni sat: Ovo je ručno izrađen sat uglavnom za dekoraciju. U satu ima nekoliko LED svjetiljki, kada je uključen, to je prekrasan ukras za spavaću sobu. Kad se isključi, to je malo ogledalo. Naravno, to je sam sat