Mundarija:

LED spiral daraxti: 4 qadam (rasmlar bilan)
LED spiral daraxti: 4 qadam (rasmlar bilan)

Video: LED spiral daraxti: 4 qadam (rasmlar bilan)

Video: LED spiral daraxti: 4 qadam (rasmlar bilan)
Video: Nilufar Hamidova || Nilufar Xamidova || Nilufar Hamidova rasmlari 2024, Iyul
Anonim
LED spiral daraxti
LED spiral daraxti
LED spiral daraxti
LED spiral daraxti
LED spiral daraxti
LED spiral daraxti

Men har xil LED chiziqlarni yaxshi ko'raman. Men ular bilan kamalakni yaxshi yoritdim. Hatto manzili bo'lmaganlar ham foydalidir. Men ochiq soyabonni tashqi yoritgich qilib qo'ydim, ularni qovurg'alarimga bog'lab qo'ydim, shuning uchun spiral daraxtim uchib ketganda, men uning atrofiga uzun chiziqli lentani o'rashga qaror qildim.

1 -qadam: Nazoratchi

Nazoratchi
Nazoratchi
Nazoratchi
Nazoratchi
Nazoratchi
Nazoratchi

Men manzilsiz RGB LEDlarini ishlatishga qaror qildim. Bu shuni anglatadiki, men dasturlashtirilgan effektga ega bo'lishim mumkin, lekin barcha LEDlar bir vaqtning o'zida rangini o'zgartiradi. Bu shuni anglatadiki, nazoratchi kerak bo'ladi. Men arduino uno -dan foydalangan bo'lardim va RGB qalqoni yordamida dastlabki sinovlarni o'tkazardim, lekin yakka Atmega328 chipli maxsus taxtadan foydalanishni yakunladim. Faqat maqsadli dasturchini almashtirish va chipni to'g'ridan -to'g'ri dasturlash kerak edi.

Menda boshqa lampalar loyihalaridan qolgan bu taxtalar ko'p edi. Men o'rniga soyabonimda bo'lgani kabi, arzonroq, oldindan dasturlashtirilgan boshqaruvchidan foydalaning.

Men daraxtning asosi sifatida sekin crossfade demosidan foydalandim.

/** Qizil, yashil va ko'k rangdagi 3 ta LEDni kesib o'tish kodi (RGB) * Xira qilish uchun siz ikkita narsani qilishingiz kerak: * 1. Ko'rsatmoqchi bo'lgan ranglarni ta'riflang * 2. Kerakli tartibni sanab bering. * * Rangni ta'riflash: * Rang-bu uch foizli 0-100, * qizil, yashil va ko'k LEDlarni boshqaruvchi * * Qizil-qizil LED to'liq, ko'k va yashil o'chirilgan * int qizil = {100, 0, 0} * To'q rangli oq - bu uchta LED, 30% * int dimWhite = {30, 30, 30} * va hokazo * * Ba'zi umumiy ranglar quyida keltirilgan yoki o'zingiz yaratasiz * * Ro'yxatga olish Buyurtma: * Dasturning asosiy qismida siz ranglarning paydo bo'lishini xohlagan tartibni * ko'rsatishingiz kerak, masalan. * crossFade (qizil); * crossFade (yashil); * crossFade (ko'k); * * Bu ranglar shu tartibda paydo bo'ladi, bitta rangdan o'chadi va keyingi rangga o'tadi * * Bundan tashqari, siz sozlashingiz mumkin bo'lgan 5 ta ixtiyoriy sozlamalar mavjud: * 1. Dastlabki rang qora rangga o'rnatiladi (shuning uchun birinchi rang o'chadi) in), lekin * siz boshlang'ich rangni boshqa har qanday rangga o'rnatishingiz mumkin * 2. Ichki tsikl 1020 ta o'zaro ishlash uchun ishlaydi; "kutish" o'zgaruvchisi * bitta o'zaro faoliyat yurishning taxminiy davomiyligini belgilaydi. Nazariy jihatdan, 10 milodiy "kutish" ~ 10 soniya oralig'ida o'tishi kerak. Amalda, kod boshqa funktsiyalarni sekin -asta ~ 11 soniyagacha bajaradi. YMMV. * 3. Agar "Takrorlash" 0 ga o'rnatilgan bo'lsa, dastur abadiy aylanadi. * agar u raqamga o'rnatilgan bo'lsa, u bu sonni aylantiradi, * keyin ketma -ketlikdagi oxirgi rangda to'xtaydi. ("Qaytish" ni 1, * ga qo'ying va oxirgi rangni qora rangga aylantiring.) * 4. Ixtiyoriy "ushlab turish" o'zgaruvchisi mavjud bo'lib, u "ushlab turish" millisekundiga o'tkaziladi. rang tugadi, * lekin keyingi rang boshlanishidan oldin. * 5. Agar siz disk raskadrovka chiqishini ketma -ket monitorga yuborishni xohlasangiz, DEBUG bayrog'ini 1 ga o'rnating. * * Dasturning ichki qismlari murakkab emas, lekin ular biroz chalkash - ichki ishlar asosiy tsikl ostida * tushuntirilgan. * * 2007 yil aprel, Kley Shirkiy *

/ Chiqish

int grnPin = 9; // Yashil LED, raqamli pin 10 int redPin = 10 ga ulangan; // Qizil LED, raqamli pin 9 ulangan bluPin = 11; // Moviy LED, raqamli pin 11 ga ulangan

// Rangli massivlar

int qora [3] = {0, 0, 0}; int oq [3] = {100, 100, 100}; int qizil [3] = {100, 0, 0}; int yashil [3] = {0, 100, 0}; ko'k ko'k [3] = {0, 0, 100}; int sariq [3] = {40, 95, 0}; int dimWhite [3] = {30, 30, 30}; // va boshqalar.

// Boshlang'ich rangni o'rnating

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

int kutish = 3; // 10 ms ichki crossFade kechikishi; sekinroq pasayishi uchun ortadi

int hold = 0; // Rang tugaganda ixtiyoriy ushlab turish, keyingi crossFade int DEBUG = 0gacha; // DEBUG hisoblagichi; agar 1 ga o'rnatilgan bo'lsa, qiymatlarni ketma -ket int yozadi loopCount = 60; // DEBUG qancha tez -tez xabar berishi kerak? int takrorlash = 0; // To'xtashdan oldin necha marta aylanishimiz kerak? (To'xtovsiz 0) int j = 0; // Takrorlash uchun taymer

// Rang o'zgaruvchilarini ishga tushiring

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

// LED chiqishlarini sozlash

void setup () {pinMode (redPin, OUTPUT); // pinlarni chiqish pinMode (grnPin, OUTPUT) sifatida belgilaydi; pinMode (bluPin, OUTPUT);

if (DEBUG) {// Agar biz disk raskadrovka uchun qiymatlarni ko'rishni istasak …

Serial.begin (9600); // … ketma -ket chiqishini o'rnatish}}

// Asosiy dastur: o'zaro faoliyat yurishlar tartibini sanab bering

void loop () {crossFade (qizil); crossFade (yashil); crossFade (ko'k); crossFade (sariq);

if (takrorlash) {// Biz sonli marta aylanamizmi?

j += 1; if (j> = takrorlash) {// Biz hali bormikan? chiqish (j); // Agar shunday bo'lsa, to'xtating. }}}

/* Quyidagi satr matematika - BUNI ASOSIYALAR UCHUN O'zgartirishingiz shart emas.

* * Dastur quyidagicha ishlaydi: * Qizil LEDni 0-10 dan, * yashilni 0-5 dan, ko'kni 10 dan 7 gacha * o'n qadamda siljitadigan xoch chizig'ini tasavvur qiling. * Biz 10 qadamni sanashni va rang qiymatlarini teng qadam bilan oshirishni yoki * kamaytirishni xohlaymiz. * Tasavvur qiling, a + qiymati 1 ga ko'tarilishini bildiradi va a - * uni pasaytirishga teng. Bizning 10 qadamlik pasayishimiz quyidagicha bo'ladi: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + + * G + + + + + * B - - - * * Qizil ko'tariladi O'n qadamda 0 dan 10 gacha, yashil rang 5 qadamda * 0-5dan, ko'k esa uch bosqichda 10 dan 7 gacha tushadi. * * Haqiqiy dasturda rang foizlari * 0-255 qiymatiga aylanadi va 1020 qadam (255 * 4) mavjud. * * LED qiymatlaridan birining yuqoriga yoki * pastiga belgi qo'yish qanchalik katta qadam bo'lishi kerakligini aniqlash uchun, biz startStep () deb nomlaymiz, bu boshlanish va tugash qiymatlari orasidagi mutlaq bo'shliqni hisoblab chiqadi *, keyin qiymatni o'zgartirishlar orasidagi qadam * hajmini aniqlash uchun bu bo'shliqni 1020 ga bo'linadi. */

int hisoblashStep (int prevValue, int endValue) {

int qadam = endValue - prevValue; // Umumiy farq nima? if (qadam) {// Agar u nolga teng bo'lmasa, qadam = 1020/qadam; // 1020 ga bo'linish} qaytarish bosqichi; }

/* Keyingi funksiya calcVal. Qachon loop qiymati, i, * * ranglardan biriga mos keladigan qadam o'lchamiga etadi, bu rangning qiymatini 1 ga oshiradi yoki kamaytiradi. * (R, G va B har biri alohida hisoblanadi.) */

int hisoblashVal (int qadam, int val, int i) {

if ((qadam) && i % step == 0) {// Agar qadam nolga teng bo'lmasa va uning qiymatini o'zgartirish vaqti, if (qadam> 0) {// qadam ijobiy bo'lsa, qiymatni oshiring … val += 1; } if if (255 -qadam) {val = 255; } if if (val <0) {val = 0; } qaytish val; }

/* crossFade () ranglarning foizini a ga o'zgartiradi

* 0-255 oralig'ida, keyin 1020 marta aylantirib, * har safar qiymatni yangilash kerakligini tekshiring, so'ngra rang qiymatlarini * to'g'ri pimlarga yozing. */

void crossFade (int rang [3]) {

// 0-255 ga aylantirish int R = (rang [0] * 255) / 100; int G = (rang [1] * 255) / 100; int B = (rang [2] * 255) / 100;

int stepR = hisoblashStep (oldingiR, R);

int stepG = hisoblashStep (oldingiG, G); int stepB = hisoblashStep (oldingi B, B);

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

analogWrite (redPin, redVal); // LED pinlariga joriy qiymatlarni yozing

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

kechiktirish (kutish); // Davrni davom ettirishdan oldin "kutish" millisekundiga pauza qiling

if (DEBUG) {// Agar biz ketma -ket chiqishni xohlasak, uni chop eting

if (i == 0 yoki i % loopCount == 0) {// boshlanishi va har bir loopCount marta Serial.print ("Loop/RGB: #"); Serial.print (i); Serial.print ("|"); Serial.print (redVal); Serial.print (" /"); Ketma -ket chop etish (grnVal); Serial.print (" /"); Serial.println (bluVal); } DEBUG += 1; }} // Keyingi tsikl uchun joriy qiymatlarni yangilang prevR = redVal; prevG = grnVal; prevB = bluVal; kechiktirish (ushlab turish); // Davrni davom ettirishdan oldin ixtiyoriy "kutish" millisekundiga pauza qiling}

2 -qadam: daraxtni o'rash

Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash
Daraxtni o'rash

Men suv o'tkazmaydigan chiziqlardan foydalanardim, chunki ular ochiq havoda bo'ladi. Ular o'z -o'zidan yopishib olishdi, lekin men tezda ularning o'rnida qolishlari uchun simli rishtalar bilan bog'ladim. Oddiy va oson hack. Chiziqning uzatish qobiliyati quvvat manbaini pastki qismga va yuqori qismdan yulduzga uzatishni osonlashtirdi.

3 -qadam: Yuqoridagi yulduzni unutmang

Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang
Yuqoridagi yulduzni unutmang

Yulduz uchun men bir oz e'tiborni jalb qilish uchun 10 Vtli bir juft chipdan foydalandim. Men ularni sovutgich sifatida mis varaqqa lehimladim. Bir oz qolgani uchun men ko'proq tasma ishlatishim mumkin edi.

4 -qadam: Sinab ko'ring

Image
Image

Birinchi urinish tezligi juda tez edi ….

Bir marta tinchlantirdim, bu juda yaxshi ko'rinardi.

Tavsiya: