Spisu treści:

Drzewo spiralne LED: 4 kroki (ze zdjęciami)
Drzewo spiralne LED: 4 kroki (ze zdjęciami)

Wideo: Drzewo spiralne LED: 4 kroki (ze zdjęciami)

Wideo: Drzewo spiralne LED: 4 kroki (ze zdjęciami)
Wideo: WOW 🤯 YouTuberzy przesadzili z siłownią! 💪 @Wojan #shorts 2024, Lipiec
Anonim
Drzewo spiralne LED
Drzewo spiralne LED
Drzewo spiralne LED
Drzewo spiralne LED
Drzewo spiralne LED
Drzewo spiralne LED

Uwielbiam wszelkiego rodzaju taśmy LED. Zrobiłem z nich ładne tęczowe światło. Nawet te nieadresowalne są przydatne. Zrobiłem jasną zewnętrzną lampkę parasolową, mocując je do żeber unbrella, więc kiedy moje spiralne drzewo wybuchło, zdecydowałem się owinąć wokół niego pasek ledowy.

Krok 1: Kontroler

Kontroler
Kontroler
Kontroler
Kontroler
Kontroler
Kontroler

Postanowiłem zastosować nieadresowalne diody RGB. Oznacza to, że mogę mieć zaprogramowany efekt, ale wszystkie diody zmieniają kolor jednocześnie. Oznacza to również, że potrzebny będzie kontroler. Mogłem użyć arduino uno i zrobić wstępne testy przy użyciu osłony RGB, ale skończyło się na użyciu niestandardowej pojedynczej płyty z gołym chipem Atmega328. Wystarczyło przełączyć programator docelowy i bezpośrednio zaprogramować układ.

Miałem mnóstwo tych desek, które zostały z innych projektów lamp. Zamiast tego możesz użyć taniego, wstępnie zaprogramowanego kontrolera wbudowanego, tak jak zrobiłem to na moim parasolu.

Skończyło się na użyciu demo powolnego przejścia jako podstawy dla drzewa.

/** Kod dla cross-fadingu 3 diody LED, czerwony, zielony i niebieski (RGB) * Aby stworzyć zanikanie, musisz zrobić dwie rzeczy: * 1. Opisz kolory, które chcesz wyświetlić * 2. Wymień kolejność, w jakiej chcesz ich zanikanie * * OPIS KOLORU: * Kolor to tylko tablica trzech wartości procentowych, 0-100, * kontrolowanie czerwonej, zielonej i niebieskiej diody LED * * Czerwony to czerwona dioda w pełni, niebieska i zielona wyłączona * int czerwony = { 100, 0, 0 } * Przyciemniony biały to wszystkie trzy diody LED na poziomie 30% * int dimWhite = {30, 30, 30} * itd. * * Niektóre popularne kolory są podane poniżej lub stwórz własne * * WYKAZ ZAMÓWIENIE: * W głównej części programu należy podać kolejność * w jakiej kolory mają się pojawiać np. * crossFade (czerwony); * crossFade (zielony); * crossFade (niebieski); * * Te kolory pojawią się w tej kolejności, znikając z * jednego koloru do następnego * * Dodatkowo istnieje 5 opcjonalnych ustawień, które możesz dostosować: * 1. Początkowy kolor jest ustawiony na czarny (więc pierwszy kolor zanika in), ale * możesz ustawić początkowy kolor na dowolny inny kolor * 2. Wewnętrzna pętla działa na 1020 interakcjach; zmienna 'wait' * określa przybliżony czas trwania pojedynczego przejścia. Teoretycznie * 'czekanie' 10 ms powinno spowodować crossFade ~10 sekund. W praktyce * inne funkcje wykonywane przez kod spowalniają * do ~11 sekund na mojej tablicy. YMMV. * 3. Jeśli 'repeat' jest ustawione na 0, program będzie zapętlał się w nieskończoność. * jeśli jest ustawiony na liczbę, zapętli tę liczbę razy, * następnie zatrzyma się na ostatnim kolorze w sekwencji. (Ustaw 'return' na 1, * i ustaw ostatni kolor na czarny, jeśli chcesz, aby wyblakł na końcu.) * 4. Istnieje opcjonalna zmienna 'hold', która zatrzymuje * program na milisekundy 'hold', gdy kolor jest kompletny, * ale przed rozpoczęciem następnego koloru. * 5. Ustaw flagę DEBUG na 1, jeśli chcesz, aby wyjście debugowania * było wysyłane do monitora szeregowego. * * Wewnętrzne elementy programu nie są skomplikowane, ale * są trochę wybredne -- wewnętrzne działanie programu jest wyjaśnione * poniżej głównej pętli. * * Kwiecień 2007, Clay Shirky *

/ Wyjście

int grnPin = 9; // Zielona dioda LED podłączona do cyfrowego pinu 10 int redPin = 10; // Czerwona dioda LED, podłączona do cyfrowego pinu 9 int bluPin = 11; // Niebieska dioda LED, podłączona do cyfrowego pinu 11

// Tablice kolorów

int czarny [3] = { 0, 0, 0 }; int biały[3] = { 100, 100, 100 }; int czerwony[3] = { 100, 0, 0 }; int zielony[3] = { 0, 100, 0 }; int niebieski [3] = { 0, 0, 100 }; int żółty[3] = { 40, 95, 0 }; int dimWhite[3] = { 30, 30, 30 }; // itd.

// Ustaw początkowy kolor

int redVal = czarny[0]; int grnVal = czarny[1]; int bluVal = czarny[2];

int czekaj = 3; // 10ms wewnętrzne opóźnienie crossFade; wzrost dla wolniejszych zaników

int przytrzymaj = 0; // Opcjonalne wstrzymanie po zakończeniu koloru, przed następnym crossFade int DEBUG = 0; // licznik DEBUGÓW; jeśli ustawione na 1, zapisze wartości z powrotem przez port szeregowy int loopCount = 60; // Jak często należy zgłaszać DEBUG? int powtórz = 0; // Ile razy powinniśmy wykonać pętlę przed zatrzymaniem? (0 oznacza brak zatrzymania) int j = 0; // Licznik pętli do powtórzenia

// Zainicjuj zmienne kolorów

int prevR = redVal; int prevG = grnVal; int prevB = bluVal;

// Skonfiguruj wyjścia LED

void setup() { pinMode(redPin, OUTPUT); // ustawia piny jako wyjście pinMode(grnPin, OUTPUT); pinMode(bluPin, WYJŚCIE);

if (DEBUG) { // Jeśli chcemy zobaczyć wartości do debugowania…

Serial.początek(9600); // …skonfiguruj wyjście szeregowe } }

// Program główny: podaj kolejność przenikania

void loop() { crossFade(czerwony); crossFade(zielony); crossFade (niebieski); crossFade(żółty);

if (repeat) { // Czy wykonujemy pętlę skończoną liczbę razy?

j += 1; if (j >= powtórz) { // Czy już tam jesteśmy? wyjście(j); // Jeśli tak, przestań. } } }

/* PONIŻEJ TEJ LINII ZNAJDUJE SIĘ MATEMATYKA - NIE POWINIEN BYĆ TEGO ZMIENIAĆ ZE WZGLĘDU NA PODSTAWY

* * Program działa w następujący sposób: * Wyobraź sobie przejście, które przesuwa czerwoną diodę LED z 0-10, * zieloną z 0-5, a niebieską z 10 na 7, w * dziesięciu krokach. * Chcielibyśmy policzyć 10 kroków i zwiększyć lub * zmniejszyć wartości kolorów w równych krokach. * Wyobraź sobie, że + oznacza podniesienie wartości o 1, a - * oznacza jej obniżenie. Nasze 10-stopniowe zanikanie wyglądałoby następująco: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + * G + + + + + * B - - - * * Od 0 do 10 w dziesięciu krokach, zielony od * 0-5 w 5 krokach, a niebieski od 10 do 7 w trzech krokach. * * W rzeczywistym programie procenty kolorów są konwertowane na * wartości 0-255 i jest 1020 kroków (255*4). * * Aby dowiedzieć się, jak duży powinien być krok między jednym zaznaczeniem w górę lub * w dół jednej z wartości diod LED, wywołujemy metodę obliczaniaStep(), * która oblicza bezwzględną lukę między wartościami początkowymi i końcowymi, * a następnie dzieli tę lukę przez 1020, aby określić rozmiar kroku * między korektami wartości. */

int obliczKrok(int prevValue, int endValue) {

int step = endValue - prevValue; // Jaka jest ogólna luka? if (krok) { // Jeśli jest niezerowe, krok = 1020/krok; // podziel przez 1020 } return step; }

/* Następna funkcja to obliczWartość. Gdy wartość pętli, i, * osiąga wielkość kroku odpowiednią dla jednego z * kolorów, zwiększa lub zmniejsza wartość tego koloru o 1. * (R, G i B są obliczane osobno.) */

int obliczVal(int step, int val, int i) {

if ((step) && i % step == 0) { // Jeżeli step jest niezerowy i czas na zmianę wartości, if (step > 0) { // zwiększ wartość, jeśli step jest dodatni… val += 1; } else if (etap 255) {val = 255; } else if (val < 0) { val = 0; } return val; }

/* crossFade() konwertuje kolory procentowe na a

* Zakres 0-255, następnie pętla 1020 razy, sprawdzając, czy * wartość musi być aktualizowana za każdym razem, * następnie zapisz wartości kolorów do właściwych pinów. */

void crossFade(int kolor [3]) {

// Konwertuj na 0-255 int R = (color[0] * 255) / 100; int G = (kolor[1] * 255) / 100; int B = (kolor[2] * 255) / 100;

int stepR = obliczKrok(prevR, R);

int stepG = obliczKrok(prevG, G); int stepB = obliczKrok(prevB, B);

for (int i = 0; i <= 1020; i++) { redVal = obliczVal(krokR, redVal, i); grnVal = obliczVal(krokG, grnVal, i); bluVal = oblicz Val(krok B, bluVal, i);

zapis analogowy(redPin, redVal); // Zapisz aktualne wartości do pinów LED

analogWrite(grnPin, grnVal); zapis analogowy(bluPin, bluVal);

opóźnienie (czekaj); // Pauza na „czekaj” milisekundy przed wznowieniem pętli

if (DEBUG) { // Jeśli chcemy uzyskać wyjście szeregowe, wypisz je na

if (i == 0 lub i % loopCount == 0) { // początek i co loopCount razy Serial.print("Loop/RGB: #"); druk.seryjny(i); Serial.print(" | "); Serial.print(redVal); Serial.print(" / "); Serial.print(grnVal); Serial.print(" / "); Serial.println(bluVal); } DEBUGUJ += 1; } } // Aktualizacja bieżących wartości dla następnej pętli prevR = redVal; prevG = grnVal; prevB = bluVal; opóźnienie(przytrzymaj); // Pauza na opcjonalne „czekaj” milisekundy przed wznowieniem pętli }

Krok 2: Zawijanie drzewa

Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa
Zawijanie drzewa

Użyłem wodoodpornych pasków, ponieważ będą na zewnątrz. Trzymały się same, ale szybko podążyłem za drutami, aby upewnić się, że pozostaną na swoim miejscu. Prosty i łatwy hack. Zdolność przepuszczania mocy listwy ułatwiała doprowadzenie zasilania do dołu i doprowadzenie zasilania od góry do gwiazdy.

Krok 3: Nie zapomnij o gwieździe na górze

Nie zapomnij o gwieździe na górze
Nie zapomnij o gwieździe na górze
Nie zapomnij o gwiazdce na górze
Nie zapomnij o gwiazdce na górze
Nie zapomnij o gwieździe na górze
Nie zapomnij o gwieździe na górze
Nie zapomnij o gwiazdce na górze
Nie zapomnij o gwiazdce na górze

W przypadku gwiazdy użyłem pary chipów 10W, aby zwrócić na siebie uwagę. Przylutowałem je do blachy miedzianej jako radiator. Mogłem użyć więcej paska, ponieważ trochę zostało.

Krok 4: Wypróbowanie

Image
Image

Pierwsza próba była zbyt szybka….

Kiedy go uspokoiłem, wyglądało to całkiem nieźle.

Zalecana: