İçindekiler:

LED Sarmal Ağaç: 4 Adım (Resimlerle)
LED Sarmal Ağaç: 4 Adım (Resimlerle)

Video: LED Sarmal Ağaç: 4 Adım (Resimlerle)

Video: LED Sarmal Ağaç: 4 Adım (Resimlerle)
Video: BUNU YAŞAMAYAN YOKTUR 😂 #emirbeşli #shorts 2024, Temmuz
Anonim
LED Spiral Ağaç
LED Spiral Ağaç
LED Spiral Ağaç
LED Spiral Ağaç
LED Spiral Ağaç
LED Spiral Ağaç

Her türlü LED şeridi seviyorum. Onlarla güzel bir gökkuşağı ışığı yaptım. Adreslenemeyenler bile faydalıdır. Onları unbrella kaburgalarına bağlayarak parlak bir pazar şemsiyesi dış mekan ışığı yaptım, bu yüzden sarmal ağacım patladığında etrafına uzun bir led şerit sarmaya karar verdim.

Adım 1: Denetleyici

Denetleyici
Denetleyici
Denetleyici
Denetleyici
Denetleyici
Denetleyici

Adreslenemeyen RGB ledleri kullanmaya karar verdim. Bu, programlanmış bir etkiye sahip olabileceğim anlamına gelir, ancak tüm ledler aynı anda renk değiştirir. Bu aynı zamanda bir denetleyiciye ihtiyaç duyulacağı anlamına gelir. Bir arduino uno kullanabilir ve ilk testleri bir RGB kalkanı kullanarak yapabilirdim, ancak sonunda çıplak bir Atmega328 yongası olan özel bir tek kart kullandım. Sadece hedef programlayıcıyı değiştirmek ve çipi doğrudan programlamak zorunda kaldım.

Diğer lamba projelerinden kalan bu panolardan bolca vardı. Şemsiyemde yaptığım gibi bir ucuz satır içi önceden programlanmış denetleyici kullanmaktan çekinmeyin.

Ağacın temeli olarak yavaş bir çapraz geçiş demosu kullandım.

/** Çapraz sönümleme kodu 3 LED, kırmızı, yeşil ve mavi (RGB) * Soldurma oluşturmak için iki şey yapmanız gerekir: * 1. Görüntülenmesini istediğiniz renkleri tanımlayın * 2. İstediğiniz sırayı listeleyin * * BİR RENK AÇIKLAMASI: * Bir renk sadece üç yüzdelik bir dizidir, 0-100, * kırmızı, yeşil ve mavi LED'leri kontrol eder * * Kırmızı LED tam, mavi ve yeşil kapalıdır * int kırmızı = { 100, 0, 0 } * Loş beyaz, üç LED'in tümü %30'da * int dimWhite = {30, 30, 30} * vb. * * Bazı genel renkler aşağıda verilmiştir veya kendinizinkini yapın * * LİSTE SİPARİŞ: * Programın ana bölümünde, renklerin görünmesini istediğiniz * sırayı listelemelisiniz, örn. * crossFade(kırmızı); * crossFade(yeşil); * crossFade(mavi); * * Bu renkler, bir renkten solarak * bir renkten diğerine geçerek bu sırayla görünür * * Ek olarak, ayarlayabileceğiniz 5 isteğe bağlı ayar vardır: * 1. İlk renk siyah olarak ayarlanır (böylece ilk renk kaybolur in), ancak * başlangıç rengini başka bir renk olarak ayarlayabilirsiniz * 2. Dahili döngü 1020 etkileşim için çalışır; 'wait' değişkeni *, tek bir çapraz geçişin yaklaşık süresini ayarlar. Teoride, * 10 ms'lik bir 'bekleme', ~10 saniyelik bir crossFade yapmalıdır. * uygulamasında, kodun gerçekleştirdiği diğer işlevler, bu * yavaş yavaş benim panomda ~ 11 saniyeye kadar. YMMV. * 3. Eğer 'tekrar' 0'a ayarlanırsa program süresiz olarak döngüye girer. * bir sayıya ayarlanırsa, o sayıda döngüye girer, * ardından dizideki son renkte durur. ('Dönüş'ü 1'e ayarlayın, * ve sonunda solmasını istiyorsanız son rengi siyah yapın.) * 4. İsteğe bağlı bir 'tutma' değişkeni vardır, bu durumda * programını 'tutma' milisaniyesi için duraklatır. bir renk tamamlandı, * ancak bir sonraki renk başlamadan önce. * 5. Hata ayıklama çıktısının seri monitöre * gönderilmesini istiyorsanız, DEBUG bayrağını 1 olarak ayarlayın. * * Programın içindekiler karmaşık değil, ancak * biraz telaşlı -- iç işleyiş ana döngünün altında * açıklanıyor. * * Nisan 2007, Clay Shirky *

/ Çıktı

int grnPin = 9; // Yeşil LED, dijital pin 10'a bağlı int redPin = 10; // Kırmızı LED, dijital pin 9'a bağlı int bluPin = 11; // Mavi LED, dijital pin 11'e bağlı

// Renk dizileri

int siyah[3] = { 0, 0, 0 }; int beyaz[3] = { 100, 100, 100 }; int kırmızı[3] = { 100, 0, 0 }; int yeşil[3] = { 0, 100, 0 }; int mavi[3] = { 0, 0, 100 }; int sarı[3] = { 40, 95, 0 }; int dimWhite[3] = { 30, 30, 30 }; // vesaire.

// Başlangıç rengini ayarla

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

int bekle = 3; // 10ms dahili crossFade gecikmesi; daha yavaş solma için artış

int bekletme = 0; // Bir renk tamamlandığında, sonraki crossFade'den önce isteğe bağlı bekletme int DEBUG = 0; // DEBUG sayacı; 1'e ayarlanırsa, değerleri serial int loopCount = 60 aracılığıyla geri yazar; // DEBUG ne sıklıkla rapor vermeli? int tekrar = 0; // Durmadan önce kaç kez döngü yapmalıyız? (duraksız için 0) int j = 0; // Tekrar için döngü sayacı

// Renk değişkenlerini başlat

int öncekiR = redVal; int prevG = grnVal; int öncekiB = bluVal;

// LED çıkışlarını ayarla

void setup() { pinMode(redPin, OUTPUT); // pinleri çıkış pinMode olarak ayarlar(grnPin, OUTPUT); pinMode(bluPin, ÇIKIŞ);

if (DEBUG) { // Hata ayıklama için değerler görmek istiyorsak…

Seri.başla(9600); // …seri çıktıyı ayarla } }

// Ana program: çapraz geçişlerin sırasını listele

void loop() { crossFade(kırmızı); crossFade(yeşil); crossFade(mavi); crossFade(sarı);

if (repeat) { // Sonlu sayıda döngü mü yapıyoruz?

j += 1; if (j >= tekrarla) { // Hâlâ orada mıyız? çıkış(j); // Eğer öyleyse, dur. } } }

/* MATEMATİK BU SATIRIN ALTINDADIR -- TEMEL BİLGİLER İÇİN BUNU DEĞİŞTİRMEYE GEREK YOKTUR

* * Program şu şekilde çalışır: * Kırmızı LED'i 0-10'dan, * yeşili 0-5'ten ve maviyi 10'dan 7'ye * on adımda hareket ettiren bir çapraz geçiş düşünün. * 10 adımı saymak ve eşit kademeli artışlarla renk değerlerini artırmak veya * azaltmak isteriz. * Bir + öğesinin bir değeri 1 artırmayı ve - * değerini düşürmeyi gösterdiğini hayal edin. 10 adımlık solmamız şöyle görünür: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + * G + + + + + * B - - - * * Kırmızı, 0'dan 10'a on adımda, yeşil * 0-5'ten 5'e, mavi ise üç adımda 10'dan 7'ye düşüyor. * * Gerçek programda renk yüzdeleri * 0-255 değerlerine çevrilir ve 1020 adım (255*4) vardır. * * LED değerlerinden birinin yukarı veya * aşağı işareti arasında ne kadar büyük bir adım olması gerektiğini bulmak için, başlangıç ve bitiş değerleri arasındaki mutlak boşluğu hesaplayan hesapla Adım()'ı * ve ardından * olarak adlandırırız. değerdeki ayarlamalar arasındaki adımın * boyutunu belirlemek için bu boşluğu 1020'ye böler. */

int hesaplaStep(int prevValue, int endValue) {

int adım = endValue - prevValue; // Genel boşluk nedir? if (adım) { // Sıfır değilse, adım = 1020/adım; // 1020'ye böl } dönüş adımı; }

/* Sonraki fonksiyon hesaplaVal. Döngü değeri, i olduğunda, * renklerden biri için uygun adım boyutuna ulaşır, o rengin değerini 1 artırır veya azaltır. * (R, G ve B ayrı ayrı hesaplanır.) */

int hesaplaDeğer(int adım, int val, int i) {

if ((adım) && i % adım == 0) { // Adım sıfırdan farklıysa ve bir değeri değiştirme zamanı geldiyse, if (adım > 0) { // adım pozitifse değeri artır… val += 1; } else if (adım 255) { val = 255; } else if (val < 0) { val = 0; } dönüş değeri; }

/* crossFade() yüzde renklerini bir

* 0-255 aralığında, ardından 1020 kez döngü yapar, her seferinde * değerin güncellenmesi gerekip gerekmediğini kontrol eder, ardından renk değerlerini doğru pinlere * yazar. */

void crossFade(int color[3]) {

// 0-255'e dönüştür int R = (renk[0] * 255) / 100; int G = (renk[1] * 255) / 100; int B = (renk[2] * 255) / 100;

int stepR = hesaplaStep(öncekiR, R);

int stepG = hesaplaStep(önceki, G); int stepB = hesaplaStep(öncekiB, B);

for (int i = 0; i <= 1020; i++) { redVal = hesaplaDeğer(stepR, redVal, i); grnVal = hesaplaVal(adımG, grnVal, i); bluVal = hesaplaVal(adımB, bluVal, i);

analogWrite(redPin, redVal); // Mevcut değerleri LED pinlerine yaz

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

gecikme(bekle); // Döngüye devam etmeden önce milisaniye 'bekle' için duraklat

if (DEBUG) { // Seri çıktı istiyorsak

if (i == 0 veya i % loopCount == 0) { // başlangıç ve her loopCount kez Serial.print("Loop/RGB: #"); Seri.baskı(i); Seri.print(" | "); Serial.print(kırmızıVal); Seri.print(" / "); Serial.print(grnVal); Seri.print(" / "); Serial.println(bluVal); } HATA AYIKLAMA += 1; } } // Bir sonraki döngü için mevcut değerleri güncelle prevR = redVal; önceki = grnVal; öncekiB = bluVal; gecikme(tut); // Döngüye devam etmeden önce isteğe bağlı 'bekle' milisaniye için duraklat }

Adım 2: Ağacı Sarmak

Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak
Ağacı Sarmak

Açık havada olacağı için su geçirmez şeritler kullandım. Kendi başlarına yapıştılar ama yerlerinde kaldıklarından emin olmak için hemen tel bağları takip ettim. Basit ve kolay hack. Şeridin geçiş gücü yeteneği, güç kaynağını alttan beslemeyi ve üstten yıldıza güç almayı kolaylaştırdı.

3. Adım: Üstteki Yıldızı Unutma

Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma
Üstteki Yıldızı Unutma

Yıldız için biraz dikkat çekmek için bir çift 10W çip kullandım. Soğutucu olarak bakır levhaya lehimledim. Biraz fazla kaldığı için daha fazla şerit kullanabilirdim.

Adım 4: Denemek

Image
Image

İlk denemede hız çok hızlıydı….

Sakinleştirdiğimde oldukça iyi görünüyordu.

Önerilen: