Obsah:
2025 Autor: John Day | [email protected]. Naposledy zmenené: 2025-01-13 06:58
Tento projekt vám ukáže, ako si môžete vyrobiť zrkadlo Infinity. Základný koncept je, že LED diódy, ktoré sú na zrkadle, vytvárajú svetlo, ktoré sa odráža od zadného zrkadla k prednému zrkadlu, odkiaľ určité množstvo svetla uniká, aby sme videli dovnútra a niektoré sa odrazilo späť do spätného zrkadla a vytvára nekonečný efekt. Je to založené na zrkadle Infinity Mirror s ultra zvukovými senzormi, ktoré môže inštalovať Hack Sioux Falls a ako pripojiť LCD displej I2C k Arduino Uno od JunezRiyaz.
Zásoby
1. Shadow Box (50 dolárov)
2. Jednosmerný zrkadlový film (17 dolárov)
3. RGB LED svetelný pás (30 dolárov)
4. Arduino (35 dolárov)
5. Zrkadlo (10 dolárov)
Voliteľné:
1. IR senzor a diaľkové ovládanie (20 dolárov)
2. LCD (20 dolárov)
3. 7 Konektory žena - muž
4. 3 Konektory muž - muž
Nástroje
1. Spájkovačka
2. Rezačka drôtu a odizolovač
3. Niečím, čím by ste prerezali zrkadlo
*Všetky ceny v CAD a veľkostiach budú závisieť od škatule, ktorú použijete.
Krok 1: Inštalácia zrkadla a zrkadlového filmu
Prvá vec, ktorú musíte urobiť, je nainštalovať zrkadlo, ktoré bude v zadnej časti tieňového poľa. Chcete buď získať takú správnu veľkosť, alebo získať väčšiu, a potom ju znížiť. Na to však musíte použiť zrkadlo a nie film, pretože chceme, aby sa všetko svetlo odrazilo späť. Ak nie je sklo, zrkadlový film môže tiež prevziať vzor materiálu, na ktorom je.
Pri inštalácii zrkadla ho zaistite v tieňovom boxe. Odporúčam vám použiť malé kúsky dreva a klince, aby ste sa presvedčili, že sa zrkadlo nepohybuje. V čase, keď som mal dokončiť tento projekt, som nemal zrkadlo, takže som použil film (Môžete to vidieť na obrázkoch). Koncept funguje, ale nie príliš dobre a poskytuje šikmý a chaotický vzhľad, ktorý podľa môjho názoru nevyzerá dobre.
Každý zrkadlový film bude trochu iný, ale ten, o ktorom som povedal, že má vyčistiť sklo, na ktoré film nanášame, a potom pomocou pásky odstrániť ochrannú fóliu, ktorá je na jednej strane, a pomocou mydlovej vody v spreji. fľaša položte film na sklo. Potom pomocou kreditnej karty alebo stierky odstráňte všetky vzduchové bubliny a prebytočnú vodu. Opäť som nemal sklo, ale stále funguje rovnako. Potom nechajte pohár cez noc zaschnúť a malo by sa to urobiť.
Krok 2: Nastavenie pásky LED
Pri diódach LED som použil priloženú obojstrannú pásku na prilepenie k rámu a urobil som otvor, aby z neho vyšiel drôt. V každom rohu som spájkoval vodiče, aby som ich spojil s iným pásom, aby držal tvar škatule bez zaoblených hrán. Pásy strihajte iba v miestach, kde sú kontakty, ktoré by to umožnili, a neprepínajte smer, v ktorom sa diódy LED navzájom spájajú, známy ako zmena polarity. Pruh, ktorý som dostal, mal šípky, aby sa to nestalo, preto skontrolujte, či všetky smerujú rovnakým smerom.
Vytvoril som malý otvor, ktorým som kábel previedol na vonkajšiu stranu škatule, LED diódy, ktoré som mal, boli 3 pinové adresovateľné LED diódy, takže som mal napájacie, uzemňovacie a dátové konektory. Na dátový konektor som použil digitálny kolík 3, pred prilepením na rámik vyskúšajte svoje pásy LED, aby ste sa presvedčili, že fungujú, a uistite sa, že pre moje napätie používate iba odporúčané napätie 5 - 6 V.
Krok 3: Inštalácia infračerveného senzora a LCD (voliteľné)
Rozhodol som sa použiť IR senzor a diaľkové ovládanie na zmenu svetelných efektov a použiť LCD displej, aby som používateľovi ukázal možnosti, ktoré má s efektmi.
Na montáž LCD a IR senzora by som použil horúcu lepiacu pištoľ a prilepil ich k hornej časti rámu a všetko zapojil dozadu, ale nechcel som, aby boli opravené, pretože ich možno budem musieť po projekte sňať. je hotové.
Na pripojenie LCD a IR prijímača som použil konektory Male to Female, ktoré sa pripájajú k Arduinu pre dáta, ako aj pre uzemnenie a napájanie. Na zapojenie všetkého som použil kolík 12 s odporom 2 kΩ na dátovom kolíku infračerveného senzora, analógový kolík A4 pre SDA LCD a analógový kolík 5 pre SCL LCD.
Krok 4: Kód
Na tento projekt používam niekoľko knižníc, ktoré by ste si museli stiahnuť, aby ste ich mohli používať. Ukážem ich tu. Majte na pamäti, že používam Windows, takže to môže mať vplyv, ak používate Mac alebo Linux.
Budete musieť zmeniť počet pixelov v závislosti od počtu LED, ktoré máte. Vstaval som tiež rozhranie sériového monitora, takže s ním môžete komunikovať, ak nepoužívate IR senzor.
// Knižnice
#include Adafruit_NeoPixel.h> #include #include #include // Pins and Constant values // Pins and Constant valuesconst int RECV_PIN = 12; IRrecv unbcv (RECV_PIN); decode_results výsledky; nepodpísaná dlhá hodnota_kľúča = 0; const int NUMPIXELS = 27;
Pixely Adafruit_NeoPixel = Adafruit_NeoPixel (NUMPIXELS, 3);
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Premenné int IRNumb; int IRNumb2; int dúha = 0; uint32_t rainbowColor = pixely. Color (0, 0, 0); vstup char = 0; char vstup2 = 0; int r; int g; int b; int breakCondition = 0; void setup () {// Inicializuje prvky, ktoré nie je potrebné opakovať. lcd.begin (16, 2); // Definovanie 16 stĺpcov a 2 riadkov displeja lcd.backlight (); // Zapnutie podsvietenia Serial.begin (9600); pixely.begin (); unbcv.enableIRIn (); Serial.println ("Vypnite svetlá zadaním 0"); // Začiatočné pokyny Serial.println ("Zadajte 1, aby sa LED diódy zmenili na biele"); Serial.println ("Zadajte 2, aby LED diódy prechádzali rôznymi farbami"); Serial.println ("Zadajte 3 pre manuálne prispôsobenie farieb LED"); } prázdna slučka () {IRNumb = 10; IRScan (); mainOptions (); if (Serial.available ()> 0) {// Skontroluje, či je k dispozícii znak? vstup = (char) Serial.read (); } // Vyberie rôzne možnosti, ak (vstup == '1' || IRNumb == 1) {rainbowColor = colourChange (255, 255, 255); // Biela sadaAll (rainbowColor); // Aktualizuje LED} else if (vstup == '0' || IRNumb == 0) {rainbowColor = colourChange (0, 0, 0); // Off setAll (rainbowColor); // Aktualizuje LED} else if (vstup == '2' || IRNumb == 2) {breakCondition = 0; r = 0; g = 0; b = 0;
Serial.println („Ak chcete ukončiť tento efekt, zadajte čokoľvek, čo nie je 2, potom ktorúkoľvek z predchádzajúcich možností nového efektu.“);
lcd.clear (); // Čistenie obrazovky lcd.setCursor (0, 0); lcd.print („Ukončiť pomocou ľubovoľného-“); lcd.setCursor (0, 1); lcd.print ("otupiť to! = 2"); pre (int i = 0; i = 48 && vstup <= 57) || breakCondition == 1 || IRNumb! = 2) {// Kontroluje, či je potrebné z efektu vystúpiť rainbowColor = colourChange (0, 0, 0); setAll (rainbowColor); breakCondition = 1; prestávka; } rainbowColor = colourChange (i, 0, 0); setAll (rainbowColor); showStrip (); oneskorenie (100); } pre (int i = 0; i = 48 && vstup <= 57) || breakCondition == 1 || IRNumb! = 2) {// Kontroluje, či je potrebné z efektu vystúpiť rainbowColor = colourChange (0, 0, 0); setAll (rainbowColor); breakCondition = 1; prestávka; } g ++; rainbowColor = colourChange (i, g, 0); setAll (rainbowColor); showStrip (); oneskorenie (100); } pre (int g = 0; g = 48 && vstup <= 57) || breakCondition == 1 || IRNumb! = 2) {// Kontroluje, či je potrebné z efektu vystúpiť rainbowColor = colourChange (0, 0, 0); setAll (rainbowColor); breakCondition = 1; prestávka; } r+= 2; rainbowColor = colorChange (r, g, 0); setAll (rainbowColor); showStrip (); oneskorenie (100); } pre (int b = 0; b = 48 && vstup <= 57) || breakCondition == 1 || IRNumb! = 2) {// Kontroluje, či je potrebné z efektu vystúpiť rainbowColor = colourChange (0, 0, 0); setAll (rainbowColor); breakCondition = 1; prestávka; } r+= 2; g+= 5; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); oneskorenie (100); } mainOptions (); } else if (vstup == '3' || IRNumb == 3) {r = 0; g = 0; b = 0;
Serial.println ("Enter n to exit");
Serial.println („Použitie w a s na zvýšenie alebo zníženie červenej farby“); Serial.println („Použitie r a f na zvýšenie alebo zníženie zelenej farby“); Serial.println („Použite y a h na zvýšenie alebo zníženie modrej farby“); lcd.clear (); // Čistenie obrazovky lcd.setCursor (0, 0); lcd.print ("exit: 0, 4/7: +/- red"); lcd.setCursor (0, 1); lcd.print („5/8: zelená, 6/9: modrá“);
while (input2! = 'n' || IRNumb2! = 0) {
ak (Serial.available ()> 0) {// je k dispozícii znak? input2 = (char) Serial.read (); } //Serial.println(IRNumb2); IRNumb2 = 10; IRScan2 ();
ak (IRNumb2 == 0) {
prestávka; } if (input2 == 'w' || IRNumb2 == 4) {r+= 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); } else if (input2 == 's' || IRNumb2 == 7) {r- = 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); } else if (input2 == 'r' || IRNumb2 == 5) {g+= 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); } else if (input2 == 'f' || IRNumb2 == 8) {g- = 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); }
else if (input2 == 'y' || IRNumb2 == 6) {
b+= 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); }
else if (input2 == 'h' || IRNumb2 == 9) {
b- = 2; rainbowColor = colorChange (r, g, b); setAll (rainbowColor); showStrip (); }} mainOptions (); } setAll (rainbowColor); showStrip (); } void showStrip () {pixely.show (); } void setAll (uint32_t farba) {for (int i = 0; i <NUMPIXELS; i ++) {pixely.setPixelColor (i, farba); }} // Zadajte hodnotu 0 až 255, aby ste získali hodnotu farby. uint32_t colourChange (int r, int g, int b) {návrat pixelov. Color (r, g, b); } void mainOptions () {// Zobrazí hlavné možnosti efektu lcd.clear (); // Vyčistí obrazovku lcd.setCursor (0, 0); lcd.print („0 pre vypnuté svetlá“); lcd.setCursor (0, 1); lcd.print („1: Biele svetlo“); oneskorenie (1000); lcd.clear (); // Čistenie obrazovky lcd.setCursor (0, 0); lcd.print ("2: Farebný efekt"); lcd.setCursor (0, 1); lcd.print („3: manuál“); oneskorenie (1000); } void IRScan () {if (ircv.decode (& results)) {
ak (results.value == 0XFFFFFFFF)
results.value = hodnota_kľúča; else {//Serial.println(results.value, HEX); if (results.value == 0xFF6897 || results.value == 0xC101E57B) {IRNumb = 0; //Serial.println("0 "); } else if (vysledky.hodnota == 0x9716BE3F || vysledky.hodnota == 0xFF30CF) {IRNumb = 1; //Serial.println("1 "); } else if (vysledky.hodnota == 0x3D9AE3F7 || vysledky.hodnota == 0xFF18E7) {IRNumb = 2; //Serial.println("2 "); } else if (vysledky.hodnota == 0xFF7A85 || vysledky.hodnota == 0x6182021B) {IRNumb = 3; // Serial.println ("3"); } else if (vysledky.hodnota == 0x8C22657B || vysledky.hodnota == 0xFF10EF) {IRNumb = 4; //Serial.println("4 "); } else if (vysledky.hodnota == 0xFF38C7 || vysledky.hodnota == 0x488F3CBB) {IRNumb = 5; // Serial.println ("5"); } else if (vysledky.hodnota == 0x449E79F || vysledky.hodnota == 0xFF5AA5) {IRNumb = 6; // Serial.println ("6"); } else if (vysledky.hodnota == 0xFF42BD || vysledky.hodnota == 0x32C6FDF7) {IRNumb = 7; //Serial.println("7 "); } else if (vysledky.hodnota == 0x1BC0157B || vysledky.hodnota == 0xFF4AB5) {IRNumb = 8; //Serial.println("8 "); } else if (vysledky.hodnota == 0xFF52AD || vysledky.hodnota == 0x3EC3FC1B) {IRNumb = 9; // Serial.println ("9"); }} key_value = vysledky.hodnota; unbcv.resume (); }} neplatné IRScan2 () {if (unbcv.decode (& results)) {
ak (results.value == 0XFFFFFFFF)
results.value = hodnota_kľúča; else {// Serial.println (vysledky.hodnota, HEX); if (results.value == 0xFF6897 || results.value == 0xC101E57B) {IRNumb2 = 0; //Serial.println("0 "); } else if (vysledky.hodnota == 0x9716BE3F || vysledky.hodnota == 0xFF30CF) {IRNumb2 = 1; //Serial.println("1 "); } else if (vysledky.hodnota == 0x3D9AE3F7 || vysledky.hodnota == 0xFF18E7) {IRNumb2 = 2; //Serial.println("2 "); } else if (vysledky.hodnota == 0xFF7A85 || vysledky.hodnota == 0x6182021B) {IRNumb2 = 3; // Serial.println ("3"); } else if (vysledky.hodnota == 0x8C22657B || vysledky.hodnota == 0xFF10EF) {IRNumb2 = 4; //Serial.println("4 "); } else if (vysledky.hodnota == 0xFF38C7 || vysledky.hodnota == 0x488F3CBB) {IRNumb2 = 5; // Serial.println ("5"); } else if (vysledky.hodnota == 0x449E79F || vysledky.hodnota == 0xFF5AA5) {IRNumb2 = 6; // Serial.println ("6"); } else if (vysledky.hodnota == 0xFF42BD || vysledky.hodnota == 0x32C6FDF7) {IRNumb2 = 7; //Serial.println("7 "); } else if (vysledky.hodnota == 0x1BC0157B || vysledky.hodnota == 0xFF4AB5) {IRNumb2 = 8; //Serial.println("8 "); } else if (vysledky.hodnota == 0xFF52AD || vysledky.hodnota == 0x3EC3FC1B) {IRNumb2 = 9; // Serial.println ("9"); }} key_value = vysledky.hodnota; unbcv.resume (); }}
Krok 5: Montáž
Na pripevnenie Arduina k rámu by som ho jednoducho prilepil a dosku na chlieb, ktorú som použil, k zadnej časti rámu a pokúsil sa zakryť/skryť káble, aby vyzeral dobre.