Spisu treści:

Lustro nieskończoności z czujnikiem LCD i IR: 5 kroków
Lustro nieskończoności z czujnikiem LCD i IR: 5 kroków

Wideo: Lustro nieskończoności z czujnikiem LCD i IR: 5 kroków

Wideo: Lustro nieskończoności z czujnikiem LCD i IR: 5 kroków
Wideo: Lustro nieskończoności 2024, Listopad
Anonim
Lustro nieskończoności z czujnikiem LCD i IR
Lustro nieskończoności z czujnikiem LCD i IR
Lustro nieskończoności z czujnikiem LCD i IR
Lustro nieskończoności z czujnikiem LCD i IR
Lustro nieskończoności z czujnikiem LCD i IR
Lustro nieskończoności z czujnikiem LCD i IR

Ten projekt pokaże Ci, jak możesz zrobić Lustro Infinity. Podstawowa koncepcja polega na tym, że diody LED na lusterku wytwarzają światło, które odbija się od lusterka wstecznego do lusterka przedniego, gdzie część światła ucieka, dzięki czemu możemy zajrzeć do środka, a niektóre są odbijane z powrotem do lusterka tylnego i dają nieskończony efekt. Jest to oparte na lustrze Infinity z czujnikami ultradźwiękowymi instruktażowymi przez Hacka Sioux Fallsa i sposobie podłączenia wyświetlacza LCD I2C do Arduino Uno autorstwa JunezRiyaz.

Kieszonkowe dzieci

1. Pudełko Cienia (50 USD)

2. Jednokierunkowa folia lustrzana (17 USD)

3. Pasek świetlny LED RGB (30 USD)

4. Arduino (35 USD)

5. Lustro (10 USD)

Opcjonalny:

1. Czujnik podczerwieni i pilot (20 USD)

2. LCD (20 USD)

3. 7 złączy żeńskich na męskie

4. 3 złącza męskie na męskie

Narzędzia

1. Lutownica

2. Przecinak do drutu i ściągacz izolacji

3. Coś do wycięcia lustra

*Uwaga: wszystkie ceny w CAD i rozmiary będą zależeć od używanego pudełka.

Krok 1: instalowanie lustra i folii lustrzanej

Instalowanie lustra i folii lustrzanej
Instalowanie lustra i folii lustrzanej
Instalowanie lustra i folii lustrzanej
Instalowanie lustra i folii lustrzanej

Pierwszą rzeczą do zrobienia jest zainstalowanie lustra, które będzie znajdować się z tyłu pudełka z cieniami. Chcesz mieć taki, który ma odpowiedni rozmiar lub większy, a następnie go przyciąć. Ale w tym celu musisz użyć lustra, a nie folii, ponieważ chcemy, aby całe światło było odbijane z powrotem, folia lustrzana może również przybrać wzór materiału, na którym się znajduje, jeśli nie jest to szkło.

Podczas montażu lustra upewnij się, że jest ono zabezpieczone w pudełku z cieniem, polecam użyć małych kawałków drewna i gwoździ, aby upewnić się, że lustro się nie poruszy. Nie miałem lustra w czasie, kiedy musiałem ukończyć ten projekt, więc użyłem filmu (widać na zdjęciach). Koncepcja działa, ale niezbyt dobrze i daje pod kątem i chaotyczny wygląd, który moim zdaniem nie wygląda dobrze.

Każda folia lustrzana będzie trochę inna, ale ta, o której kazano mi wyczyścić szybę, na którą nakładamy folię, a następnie użyć taśmy do zdjęcia folii ochronnej, która jest po jednej stronie i użyć wody z mydłem w sprayu butelka połóż film na szkle. Następnie użyj karty kredytowej lub ściągaczki, aby pozbyć się pęcherzyków powietrza i nadmiaru wody. Po raz kolejny nie miałem szkła, ale nadal działa tak samo. Następnie pozostaw szkło do wyschnięcia na noc i należy to zrobić.

Krok 2: Konfiguracja taśmy LED

Konfiguracja taśmy LED
Konfiguracja taśmy LED
Konfiguracja taśmy LED
Konfiguracja taśmy LED

W przypadku diod LED po prostu użyłem dołączonej dwustronnej taśmy, aby przykleić ją do ramy i zrobiłem otwór, aby wyszedł drut. W każdym rogu przylutowałem przewody, aby połączyć je z innym paskiem, aby zachować kształt pudełka bez zaokrąglonych krawędzi. Upewnij się, że przecinasz paski tylko w miejscach, w których znajdują się styki, które mogłyby na to pozwolić, i nie zmieniaj kierunku, w którym diody LED łączą się ze sobą, co nazywa się odwróceniem polaryzacji. Pasek, który dostałem, miał strzałki, aby upewnić się, że tak się nie stanie, więc upewnij się, że wszystkie są skierowane w tym samym kierunku.

Zrobiłem mały otwór, aby przełożyć kabel na zewnątrz pudełka, diody LED, które miałem, były adresowalnymi diodami LED 3 pin, więc miałem złącza zasilania, uziemienia i danych. Użyłem Digital Pin 3 do złącza danych, upewnij się, że przetestowałeś swoje paski LED, aby upewnić się, że działają przed przyklejeniem ich do ramy i upewnij się, że używasz tylko zalecanego napięcia dla mojego, które wynosi 5 - 6 V.

Krok 3: Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)

Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)
Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)
Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)
Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)
Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)
Montaż czujnika podczerwieni i wyświetlacza LCD (opcjonalnie)

Zdecydowałem się użyć czujnika podczerwieni i pilota, aby zmienić efekty świetlne i użyć oraz LCD, aby pokazać użytkownikowi opcje, jakie mają dla efektów.

Do zamontowania czujnika LCD i IR użyłbym pistoletu do klejenia na gorąco i przykleiłem je do górnej części ramy i podłączyłem wszystko z tyłu, ale nie chciałem ich naprawiać, bo być może będę musiał je zdjąć po projekcie skończone.

Do podłączenia wyświetlacza LCD i odbiornika podczerwieni użyłem złączy męskich do żeńskich, które podłącza się do Arduino w celu przesyłania danych, a także uziemienia i zasilania. Aby połączyć wszystko, użyłem pinu 12 z rezystorem 2 kΩ na pinie danych czujnika podczerwieni, pinu analogowego A4 dla SDA wyświetlacza LCD i pinu analogowego 5 dla SCL wyświetlacza LCD.

Krok 4: Kod

Do tego projektu używam kilku bibliotek, które musiałbyś pobrać, aby móc korzystać. Umieszczę je tutaj, pamiętaj, że jestem w systemie Windows, więc może to mieć wpływ na Maca lub Linuksa.

Będziesz musiał zmienić liczbę pikseli w zależności od liczby posiadanych diod LED. Wbudowałem również interfejs monitora szeregowego, dzięki czemu możesz się z nim łączyć, jeśli nie używasz czujnika podczerwieni.

// Biblioteki

#include Adafruit_NeoPixel.h> #include #include #include // Piny i wartości stałe // Piny i wartości stałeconst int RECV_PIN = 12; IRrecv nieodwoł.(RECV_PIN); decode_results wyniki; unsigned long key_value = 0; const int LICZBA PIKSELÓW = 27;

Adafruit_NeoPixel piksele = Adafruit_NeoPixel(NUMPIXELS, 3);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, DODATNI);// Zmienne int IRNumb; int IRNumb2; int tęcza = 0; uint32_t rainbowColor = piksele. Color(0, 0, 0); wejście znaków = 0; znak input2 = 0; int r; intg; intb; int warunek_przerwania = 0; void setup() { // Inicjuje elementy, które nie muszą być powtarzane. lcd.begin(16, 2);//Definiowanie 16 kolumn i 2 wierszy wyświetlacza lcd.backlight();//Aby włączyć podświetlenie Serial.begin(9600); piksele.początek(); nieodwoł.enableIRIn(); Serial.println("Wprowadź 0, aby wyłączyć światła"); // Instrukcje początkowe Serial.println("Wprowadź 1, aby diody LED stały się białe"); Serial.println("Wprowadź 2, aby diody LED przełączały się między różnymi kolorami"); Serial.println("Wprowadź 3, aby ręcznie dostosować kolory LED"); } void loop() { IRNumb = 10; IRScan(); mainOpcje(); if (Serial.available() > 0) { // Sprawdza, czy znak jest dostępny? input = (char)Serial.read(); } // Wybiera różne opcje if (input == '1' || IRNumb == 1){ rainbowColor = colourChange(255, 255, 255); // Biały setAll(RainbowColor); // Aktualizuje diody LED } else if (input == '0' || IRNumb == 0){ rainbowColor = colorChange(0, 0, 0); // Off setAll(RainbowColor); // Aktualizuje diody LED } else if (input == '2' || IRNumb == 2){ breakCondition = 0; r = 0; g = 0; b = 0;

Serial.println("Wprowadź wszystko, co nie jest 2, aby wyjść z tego efektu, a następnie dowolną z poprzednich opcji dla nowego efektu.");

lcd.clear(); //Wyczyść ekran lcd.setCursor(0, 0); lcd.print("Zakończ używając dowolnego-"); lcd.setCursor(0, 1); lcd.print("odrzuć to != 2"); for(int i = 0; i = 48 && wejście <= 57) || warunek przerwania == 1 || IRNumb != 2){ // Sprawdza, czy efekt wymaga wyjścia rainbowColor = colorChange(0, 0, 0); setAll(tęczaKolor); warunek przerwania = 1; przerwa; } rainbowColor = colorChange (i, 0, 0); setAll(tęczaKolor); pokażStrip(); opóźnienie (100); } for(int i = 0; i = 48 && wejście <= 57) || warunek przerwania == 1 || IRNumb != 2){ // Sprawdza, czy efekt wymaga wyjścia rainbowColor = colorChange(0, 0, 0); setAll(tęczaKolor); warunek przerwania = 1; przerwa; } g++; rainbowColor = colorChange (i, g, 0); setAll(tęczaKolor); pokażStrip(); opóźnienie (100); } for(int g = 0; g = 48 && wejście <= 57) || warunek przerwania == 1 || IRNumb != 2){ // Sprawdza, czy efekt wymaga wyjścia rainbowColor = colorChange(0, 0, 0); setAll(tęczaKolor); warunek przerwania = 1; przerwa; } r+= 2; rainbowColor = zmiana koloru (r, g, 0); setAll(tęczaKolor); pokażStrip(); opóźnienie (100); } for(int b = 0; b = 48 && wejście <= 57) || warunek przerwania == 1 || IRNumb != 2){ // Sprawdza, czy efekt wymaga wyjścia rainbowColor = colorChange(0, 0, 0); setAll(tęczaKolor); warunek przerwania = 1; przerwa; } r+= 2; g+= 5; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); opóźnienie (100); } mainOpcje(); } else if (wejście == '3' || IRNumb == 3){ r = 0; g = 0; b = 0;

Serial.println("Wprowadź n, aby wyjść");

Serial.println("Użyj w i s, aby zwiększyć lub zmniejszyć kolor czerwony"); Serial.println("Użyj r i f, aby zwiększyć lub zmniejszyć zielony kolor"); Serial.println("Użyj yih, aby zwiększyć lub zmniejszyć kolor niebieski"); lcd.clear();//Wyczyść ekran lcd.setCursor(0, 0); lcd.print("wyjście:0, 4/7:+/-czerwony"); lcd.setCursor(0, 1); lcd.print("5/8:zielony, 6/9:niebieski");

while (input2 != 'n' || IRNumb2 != 0){

if (Serial.available() > 0) { // czy znak jest dostępny? input2 = (char)Serial.read(); } //Serial.println(IRNumb2); IRLiczba2 = 10; IRScan2();

jeśli (IRNumb2 == 0){

przerwa; } if (wejście2 == 'w' ||IRNumb2 == 4){ r+= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); } else if (input2 == 's' || IRNumb2 == 7){ r-= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); } else if (input2 == 'r' || IRNumb2 == 5){ g+= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); } else if (input2 == 'f' || IRNumb2 == 8){ g-= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); }

inaczej if (input2 == 'y' || IRNumb2 == 6){

b+= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); }

inaczej if (input2 == 'h' || IRNumb2 == 9){

b-= 2; rainbowColor = zmiana koloru (r, g, b); setAll(tęczaKolor); pokażStrip(); } } mainOptions(); } setAll(tęczaKolor); pokażStrip(); } void showStrip() { piksele.show(); } void setAll(uint32_t color) { for(int i = 0; i < NUMPIXELS; i++) { piksele.setPixelColor(i, kolor); } } // Wprowadź wartość od 0 do 255, aby uzyskać wartość koloru. uint32_t colorChange (int r, int g, int b) { return pikseli. Color(r, g, b); } void mainOptions (){ // Wyświetla główne opcje efektu lcd.clear();//Wyczyść ekran lcd.setCursor(0, 0); lcd.print("0 dla wyłączonych świateł"); lcd.setCursor(0, 1); lcd.print("1: Światło białe"); opóźnienie (1000); lcd.clear();//Wyczyść ekran lcd.setCursor(0, 0); lcd.print("2: Efekt koloru"); lcd.setCursor(0, 1); lcd.print("3: Instrukcja"); opóźnienie (1000); } void IRScan (){ if (irrecv.decode(&wyniki)){

if (wyniki.wartość == 0XFFFFFFFF)

wyniki.wartość = klucz_wartość; else{ //Serial.println(results.value, HEX); if (wyniki.wartość == 0xFF6897 || wyniki.wartość == 0xC101E57B){ IRNumb = 0; //Serial.println("0"); } else if (results.value == 0x9716BE3F || results.value == 0xFF30CF){ IRNumb = 1; //Serial.println("1"); } else if (results.value == 0x3D9AE3F7 || results.value == 0xFF18E7){ IRNumb = 2; //Serial.println("2"); } else if (results.value == 0xFF7A85 || results.value == 0x6182021B){ IRNumb = 3; // Serial.println("3"); } else if (results.value == 0x8C22657B || results.value == 0xFF10EF){ IRNumb = 4; //Serial.println("4"); } else if (results.value == 0xFF38C7 || results.value == 0x488F3CBB){ IRNumb = 5; // Serial.println("5"); } else if (results.value == 0x449E79F || results.value == 0xFF5AA5){ IRNumb = 6; // Serial.println("6"); } else if (results.value == 0xFF42BD || results.value == 0x32C6FDF7){ IRNumb = 7; //Serial.println("7"); } else if (results.value == 0x1BC0157B || results.value ==0xFF4AB5){ IRNumb = 8; //Serial.println("8"); } else if (results.value == 0xFF52AD || results.value == 0x3EC3FC1B){ IRNumb = 9; // Serial.println("9"); } } klucz_wartość = wyniki.wartość; nieodzysk.wznowienie(); } } void IRScan2 (){ if (irrecv.decode(&wyniki)){

if (wyniki.wartość == 0XFFFFFFFF)

wyniki.wartość = klucz_wartość; else{ // Serial.println(results.value, HEX); if (wyniki.wartość == 0xFF6897 || wyniki.wartość == 0xC101E57B){ IRNumb2 = 0; //Serial.println("0"); } else if (results.value == 0x9716BE3F || results.value == 0xFF30CF){ IRNumb2 = 1; //Serial.println("1"); } else if (results.value == 0x3D9AE3F7 || results.value == 0xFF18E7){ IRNumb2 = 2; //Serial.println("2"); } else if (results.value == 0xFF7A85 || results.value == 0x6182021B){ IRNumb2 = 3; // Serial.println("3"); } else if (results.value == 0x8C22657B || results.value == 0xFF10EF){ IRNumb2 = 4; //Serial.println("4"); } else if (results.value == 0xFF38C7 || results.value == 0x488F3CBB){ IRNumb2 = 5; // Serial.println("5"); } else if (results.value == 0x449E79F || results.value == 0xFF5AA5){ IRNumb2 = 6; // Serial.println("6"); } else if (results.value == 0xFF42BD || results.value == 0x32C6FDF7){ IRNumb2 = 7; //Serial.println("7"); } else if (results.value == 0x1BC0157B || results.value ==0xFF4AB5){ IRNumb2 = 8; //Serial.println("8"); } else if (results.value == 0xFF52AD || results.value == 0x3EC3FC1B){ IRNumb2 = 9; // Serial.println("9"); } } klucz_wartość = wyniki.wartość; nieodzysk.wznowienie(); } }

Krok 5: Montaż

Montowanie
Montowanie

Aby zamontować Arduino do ramy, po prostu przykleiłbym go i płytkę stykową, której użyłem do tylnej części ramy i próbowałem zakryć/ukryć kable, aby wyglądały dobrze.

Zalecana: