Mündəricat:

LED Spiral Ağacı: 4 Adım (Şəkillərlə birlikdə)
LED Spiral Ağacı: 4 Adım (Şəkillərlə birlikdə)

Video: LED Spiral Ağacı: 4 Adım (Şəkillərlə birlikdə)

Video: LED Spiral Ağacı: 4 Adım (Şəkillərlə birlikdə)
Video: Kim nə başa düşdü ❓ 2024, Noyabr
Anonim
LED spiral ağacı
LED spiral ağacı
LED spiral ağacı
LED spiral ağacı
LED spiral ağacı
LED spiral ağacı

Hər növ LED şeridi sevirəm. Onlarla gözəl bir göy qurşağı işığı yaratdım. Hətta ünvanlandırılmayanlar da faydalıdır. Açıq qabırğaları bağlayaraq parlaq bir bazar çətiri açıq işığı yaratdım, buna görə də spiral ağacım uçduqda ətrafına uzun bir şerit sarımaq qərarına gəldim.

Addım 1: Nəzarətçi

Nəzarətçi
Nəzarətçi
Nəzarətçi
Nəzarətçi
Nəzarətçi
Nəzarətçi

Mən ünvanlı olmayan RGB LED-lərindən istifadə etmək qərarına gəldim. Bu, proqramlaşdırılmış bir effekt verə biləcəyim deməkdir, ancaq bütün LEDlər eyni anda rəngini dəyişir. Bu da bir nəzarətçiyə ehtiyac olacağı deməkdir. Bir arduino uno istifadə edə bilərdim və RGB qalxanı ilə ilkin testləri edə bilərdim, ancaq çılpaq Atmega328 çipi olan xüsusi bir lövhə istifadə edərək sona çatdım. Sadəcə hədəf proqramçını dəyişdirmək və çipi birbaşa proqramlaşdırmaq lazım idi.

Digər lampa layihələrindən qalan çoxlu lövhələrim vardı. Əvəzində çətirimi düzəltdiyim kimi, ucuz proqramlaşdırılmış inline proqramlaşdırıcıdan istifadə etməkdən çekinmeyin.

Ağacın əsası olaraq yavaş bir çarpaz demo istifadə etdim.

/** Qırmızı, yaşıl və mavi rəngli 3 LED (RGB) keçmək üçün kod * Solğunluq yaratmaq üçün iki şeyi etməlisiniz: * 1. Göstərilməsini istədiyiniz rəngləri təsvir edin * 2. İstədiyiniz sıranı sadalayın. * * RENK AÇIQLAMA: * Bir rəng yalnız üç faizlik bir sıra, 0-100, * qırmızı, yaşıl və mavi LEDləri idarə etmək * * Qırmızı tam, mavi və yaşıl sönmüş qırmızı LEDdir * int qırmızı = {100, 0, 0} * Qaranlıq ağ 30% -də olan üç LED -dir * int dimWhite = {30, 30, 30} * və s. * * Bəzi ümumi rənglər aşağıda verilmişdir və ya özünüz edə bilərsiniz * * SİYAHI SİFARİŞ: * Proqramın əsas hissəsində rənglərin görünməsini istədiyiniz * sırasını qeyd etməlisiniz, məsələn. * crossFade (qırmızı); * crossFade (yaşıl); * crossFade (mavi); * * Bu rənglər * bir rəngdən sönərək digər rəngə keçərək sırayla görünəcək * * Əlavə olaraq tənzimləyə biləcəyiniz 5 əlavə parametr var: * 1. Başlanğıc rəng qara rəngdədir (ilk rəng solur) in), lakin * ilkin rəngi hər hansı digər rəng olaraq təyin edə bilərsiniz * 2. Daxili döngə 1020 qarşılıqlı əlaqə üçün çalışır; 'gözləmə' dəyişəni * tək bir çarpaz vuruşun təxmini müddətini təyin edir. Teorik olaraq, * 10 ms -lik 'gözləmə' ~ 10 saniyəlik bir crossFade etməlidir. * Təcrübədə, kodun yerinə yetirdiyi digər funksiyalar lövhəmdə ~ 11 saniyəyə qədər yavaşlayır. YMMV. * 3. 'Təkrarlama' 0 olaraq təyin olunarsa, proqram qeyri -müəyyən olaraq dönər. * bir rəqəmə təyin olunarsa, o dövrəni döndərəcək, * sonra ardıcıllıqla son rəngdə dayanacaq. ('Qayıdış' ı 1, * olaraq təyin edin və sonda solmasını istəsəniz son rəngi qara edin.) * 4. İsteğe bağlı 'tut' dəyişən var, bu zaman 'tut' millisaniyəsini * saxlayır. bir rəng tamamlandı, * lakin növbəti rəng başlamazdan əvvəl. * 5. Hata ayıklama çıxışının * seriyalı monitora göndərilməsini istəyirsinizsə, DEBUG bayrağını 1 olaraq təyin edin. * * Proqramın daxili hissələri mürəkkəb deyil, ancaq bir az qarışıqdır - daxili işləmə əsas döngənin altında * izah edilmişdir. * * Aprel 2007, Clay Shirky *

/ Çıxış

int grnPin = 9; // Yaşıl LED, rəqəmsal pin 10 int redPin = 10 -a bağlıdır; // Qırmızı LED, rəqəmsal pin 9 int bluPin = 11 -ə bağlıdır; // Mavi LED, rəqəmsal pin 11 -ə bağlıdır

// Rəng massivləri

int qara [3] = {0, 0, 0}; int ağ [3] = {100, 100, 100}; int qırmızı [3] = {100, 0, 0}; int yaşıl [3] = {0, 100, 0}; int mavi [3] = {0, 0, 100}; int sarı [3] = {40, 95, 0}; int dimWhite [3] = {30, 30, 30}; // və s.

// İlkin rəngi təyin edin

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

int wait = 3; // 10 ms daxili crossFade gecikməsi; daha yavaş solması üçün artırın

int hold = 0; // Rəng tamamlandıqda, növbəti crossFade int DEBUG = 0 -a qədər isteğe bağlı tutma; // DEBUG sayğacı; 1 olaraq təyin olunarsa, dəyərləri serial int vasitəsilə yazacaq int loopCount = 60; // DEBUG nə qədər tez -tez hesabat verməlidir? int təkrar = 0; // Dayanmadan əvvəl neçə dəfə dönməliyik? (Dayanmadan 0) int j = 0; // Təkrar etmək üçün döngə sayğacı

// Rəng dəyişənlərini işə salın

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

// LED çıxışlarını qurun

boş quraşdırma () {pinMode (redPin, ÇIXIŞ); // pinləri çıxış pinMode (grnPin, ÇIXIŞ) olaraq təyin edir; pinMode (bluPin, Çıxış);

if (DEBUG) {// Hata ayıklama üçün dəyərlər görmək istəyiriksə…

Serial.begin (9600); //… serial çıxışı qurun}}

// Əsas proqram: çarpaz vuruşların sırasını sadalayın

void loop () {crossFade (qırmızı); crossFade (yaşıl); crossFade (mavi); crossFade (sarı);

if (təkrar) {// Sonlu dəfə döngə edirikmi?

j += 1; if (j> = təkrar) {// Hələ oradayıq? çıxış (j); // Əgər belədirsə, dayan. }}}

/* AŞAĞIDA BU XƏTƏBAT MATİYADIR - BUNU ƏSASLAR ÜÇÜN DƏYİŞTİRMƏYƏ Gərək YOXDUR

* * Proqram belə işləyir: * Qırmızı LED-i 0-10-dan, yaşıl rəngdən 0-5-dən, mavini 10-dan 7-yə * on addımda hərəkət etdirən bir çarpaz təsəvvür edin. * 10 addımı saymaq və bərabər addımlarla rəng dəyərlərini artırmaq və ya azaltmaq istərdik. * Təsəvvür edin ki, + işarəsi dəyərin 1 -ə yüksəldilməsini göstərir və a - * onu aşağı salmağa bərabərdir. 10 addımlıq solğunluğumuz belə görünür: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + + * G + + + + + * B - - - * * Qırmızıdan yuxarı qalxır. On addımda 0 ilə 10, yaşıl 5 addımda * 0-5, mavi isə üç addımda 10-dan 7-yə düşür. * * Həqiqi proqramda rəng faizləri * 0-255 dəyərlərinə çevrilir və 1020 addım (255 * 4) var. * * LED dəyərlərindən birinin yuxarı və ya * aşağı işarəsi arasında nə qədər böyük bir addımın olacağını anlamaq üçün, başlanğıc və bitiş dəyərləri arasındakı mütləq boşluğu hesablayan calcStep () adlandırırıq. addımın ölçüsünü təyin etmək üçün bu boşluğu 1020 -ə bölür. */

int calcStep (int prevValue, int endValue) {

int addım = endValue - prevValue; // Ümumi fərq nədir? if (addım) {// Sıfır deyilsə, addım = 1020/addım; // 1020 ilə bölün} geri dönmə addımı; }

/* Növbəti funksiya calcVal -dır. Döngə dəyəri olduqda, i, * * rənglərdən biri üçün uyğun olan addım ölçüsünə çatır, o rəngin dəyərini 1 artırır və ya azaldır. * (R, G və B hər biri ayrıca hesablanır.) */

int calcVal (int addım, int val, int i) {

if ((addım) && i % addım == 0) {// Addım sıfır deyilsə və bir dəyəri dəyişdirmə vaxtıdırsa, if (addım> 0) {// addım müsbət olarsa dəyəri artırın… val += 1; } başqa əgər (addım 255) {val = 255; } başqa əgər (val <0) {val = 0; } qaytarma dəyəri; }

/* crossFade () faiz rənglərini a -ya çevirir

* 0-255 aralığında, sonra 1020 dəfə döngələr aparın, dəyərin hər dəfə yenilənməsinin lazım olub olmadığını yoxlayın, sonra rəng dəyərlərini düzgün sancaqlara yazın. */

boş crossFade (int rəngi [3]) {

// 0-255-ə çevirmək int R = (rəng [0] * 255) / 100; int G = (rəng [1] * 255) / 100; int B = (rəng [2] * 255) / 100;

int stepR = hesablama Addım (əvvəlkiR, R);

int stepG = hesablama Addım (əvvəlkiG, G); int stepB = hesablama Adımı (əvvəlki B, B);

for (int i = 0; i <= 1020; i ++) {redVal = calcVal (stepR, redVal, i); grnVal = calcVal (stepG, grnVal, i); bluVal = calcVal (stepB, bluVal, i);

analogWrite (redPin, redVal); // LED pinlərinə cari dəyərləri yazın

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

gecikmə (gözləmək); // Döngəyə davam etməzdən əvvəl 'gözləmə' milisaniyələrini dayandırın

if (DEBUG) {// Serial çıxışı istəyiriksə, onu çap edin

if (i == 0 və ya i % loopCount == 0) {// başlanğıc və hər loopCount dəfə Serial.print ("Loop/RGB: #"); Serial. çap (i); Serial.print ("|"); Serial. çap (redVal); Serial.print (" /"); Serial. çap (grnVal); Serial.print (" /"); Serial.println (bluVal); } DEBUG += 1; }} // Növbəti döngə üçün cari dəyərləri yeniləyin prevR = redVal; prevG = grnVal; prevB = bluVal; gecikmə (tutma); // Döngəyə davam etməzdən əvvəl isteğe bağlı 'gözləmə' millisaniyələri üçün fasilə verin}

Addım 2: Ağacın sarılması

Ağacın sarılması
Ağacın sarılması
Ağacın sarılması
Ağacın sarılması
Ağacın sarılması
Ağacın sarılması
Ağacın sarılması
Ağacın sarılması

Suya davamlı zolaqlar istifadə etdim, çünki bunlar açıq havada olacaq. Öz -özünə yapışdılar, amma qaldıqlarından əmin olmaq üçün tezliklə tel bağlarını izlədim. Sadə və asan hack. Şeridin güc qabiliyyəti, enerji təchizatını aşağıya və yuxarıdan ulduza çıxarmağı asanlaşdırdı.

Addım 3: Üstündəki Ulduzu Unutmayın

Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın
Üstündəki Ulduzu Unutmayın

Ulduz üçün bir az diqqət çəkmək üçün bir cüt 10W fiş istifadə etdim. Soyuducu olaraq onları mis təbəqəyə lehimlədim. Bir az qaldığı üçün daha çox zolaqdan istifadə edə bilərdim.

Addım 4: Bunu sınayın

Image
Image

İlk cəhd çox sürətli idi ….

Bir dəfə sakitləşdirsəm çox gözəl görünürdü.

Tövsiyə: