Mündəricat:

Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir): 4 Addım
Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir): 4 Addım

Video: Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir): 4 Addım

Video: Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir): 4 Addım
Video: Make your own LED Mood Lamp | Arduino + WS2812 2024, Iyul
Anonim
Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir)
Arduino LED Mood Cube -un təkmilləşdirilməsi (Sadə) (Video Daxildir)

'Earl tərəfindən yaradılmış bir LED kiçik əhval -ruhiyyə layihəsi gördükdən sonra LED Mood Cube -un təkmilləşdirilmiş bir versiyasını etmək qərarına gəldim. Mənim versiyam orijinaldan bir qədər böyük olacağı üçün orijinaldan bir qədər böyük olacaq, orijinal kubla müqayisədə iki rəng daha çox olacaq (əlavə olaraq sarı və ağ), rənglərin sonsuz miqdarda fırlanması və s. LED işıqlarını tellərlə birləşdirmək konsepsiyasını başa düşənlər üçün LED işıqlarının daha da istifadəsi üzrə təcrübə aparmaq üçün yaxşı bir layihə olmalıdır.

Addım 1: Materiallar

Materiallar
Materiallar
Materiallar
Materiallar

Bu Mood Cube hazırlamaq üçün lazım olacaq bəzi materiallar:

  • Çörək lövhəsi
  • Arduino - (burada Leonardo var)
  • Arduino enerji təchizatı / USB kabeli
  • Çörək lövhəsi
  • Jumper Telləri (Çoxu 29 tel istifadə etdim)
  • Qırmızı LED x 2
  • Mavi LED x 2
  • Yaşıl LED x 2
  • Sarı LED x 2
  • Ağ LED x 1
  • 9 rezistor
  • Çörək taxtasına sığacaq qədər böyük qutu (ayaqqabı qutusu istifadə etdim)
  • Kommunal bıçaq
  • Kağız

Addım 2: Kod

Burada verilən kod üçün bəzi izahatlar:

Layihənin redaktoru bu kodları yaratdıqca kodların krediti layihəmin orijinal mənbəyinə gedir. Sadəcə bəzilərini daha mürəkkəb hala gətirərək təkmilləşdirdim. Bəzi kodlarda sonda // 改 görə bilərsiniz. Bu o deməkdir ki, bu kod mənim redaktəmdədir, ona görə də orijinal mənbəyimdən fərqlənir.

Arduino Creator -da kodun bir versiyası da var.

/* Qırmızı, yaşıl və mavi rəngli 3 LEDin sönməsi üçün kod (RGB) Solğunluq yaratmaq üçün iki şeyi etməlisiniz: 1. Göstərilməsini istədiyiniz rəngləri təsvir edin 2. Solmasını istədiyiniz sıranı sadalayın.

RENK AÇIQLAMA:

Bir rəng, qırmızı, yaşıl və mavi LED-ləri idarə edən 0-100 nisbətində üç faizlik bir sıradır

Qırmızı tam qırmızı, mavi və yaşıl sönən qırmızı LEDdir

int red = {100, 0, 0} Qaranlıq ağ, 30% int dimWhite = {30, 30, 30} və s.

Bəzi ümumi rənglər aşağıda verilmişdir və ya özünüz edin

SİFARİŞİN SİSTEMİ:

Proqramın əsas hissəsində rənglərin görünməsini istədiyiniz sıranı siyahıya salmalısınız, məsələn. crossFade (qırmızı); crossFade (yaşıl); crossFade (mavi);

Bu rənglər sırayla görünəcək, sönəcək

bir rəngdə və digərində

Əlavə olaraq, tənzimləyə biləcəyiniz 5 əlavə parametr var:

1. Başlanğıc rəng qara rəngdədir (buna görə də ilk rəng solur), ancaq ilkin rəngi hər hansı digər rəngə 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 bir 'gözləmə' ~ 10 saniyəlik bir crossFade etməlidir. Praktikada, kodun yerinə yetirdiyi digər funksiyalar lövhəmdə ~ 11 saniyəyə qədər yavaşlayır. YMMV. 3. 'Təkrar' 0 olaraq təyin olunarsa, proqram sonsuza qədər dönər. bir rəqəmə təyin olunarsa, o dövrəni döndərəcək, sonra ardıcıllığın son rəngində dayanacaq. ('Qayıdış' ı 1 olaraq təyin edin və sonda solmasını istəsəniz son rəngi qara edin.) 4. İstənilən bir 'tut' dəyişəni var ki, bir rəng olduqda 'tut' millisaniyəsini saxlayır. tamamlandı, ancaq növbəti rəng başlamazdan əvvəl. 5. Hata ayıklama çıxışının serial monitora göndərilməsini istəyirsinizsə, DEBUG bayrağını 1 olaraq təyin edin.

Proqramın daxili hissələri çətin deyil, amma

bir az təlaşlıdır - daxili işlər əsas döngənin altında izah olunur.

Aprel 2007, Clay Shirky

*

/ Çıxış

int ylwPin = 5; // Sarı LED, rəqəmsal pin 5 -ə bağlıdır // 改 int redPin = 6; // Qırmızı LED, rəqəmsal pin 6 -ya bağlıdır // 改 int grnPin = 7; // Yaşıl LED, rəqəmsal pin 7 -yə qoşulub // 改 int bluPin = 8; // Mavi LED, rəqəmsal pin 8 -ə bağlıdır // 改 int whiPin = 9; // Ağ LED, rəqəmsal pin 9 -a bağlıdır // 改 int ylwPin2 = 10; // Sarı LED, rəqəmsal pin 10 -a bağlıdır // 改 int redPin2 = 11; // Qırmızı LED, rəqəmsal pin 11 -ə bağlıdır // 改 int grnPin2 = 12; // Yaşıl LED, rəqəmsal pin 12 -yə bağlıdır // 改 int bluPin2 = 13; // Mavi LED, rəqəmsal pin 13 -ə qoşulub // 改

// Rəng massivləri

int qara [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // 改 int ağ [9] = {100, 100, 100, 100, 100, 100, 100, 100, 100}; // 改 int qırmızı [9] = {0, 0, 100, 0, 0, 0, 100, 0, 0}; // 改 int yaşıl [9] = {0, 100, 0, 0, 0, 0, 0, 100, 0}; // 改 int mavi [9] = {0, 0, 0, 100, 0, 0, 0, 0, 100}; // 改 int sarı [9] = {100, 0, 0, 0, 0, 100, 0, 0, 0}; // purple int bənövşəyi [9] = {0, 50, 0, 50, 0, 0, 50, 0, 50}; // 改 int narıncı [9] = {50, 50, 0, 0, 0, 50, 50, 0, 0}; // pink int pink [9] = {0, 50, 0, 0, 50, 0, 0, 50, 0,}; // 改 // və s.

// İlkin rəngi təyin edin

int redVal = qara [0]; int grnVal = qara [1]; int bluVal = qara [2]; int ylwVal = qara [3]; // wh int whiVal = qara [4]; // 改

int wait = 15; // 10 ms daxili crossFade gecikməsi; daha yavaş solğunlaşma üçün artım // 改

int hold = 1; // Bir rəng tamamlandıqda, növbəti crossFade -dən əvvəl isteğe bağlı tutma // 改 int DEBUG = 1; // 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; int prevY = ylwVal; int prevW = whiVal; // 改

// 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ış); pinMode (ylwPin, ÇIXIŞ); // 改 pinMode (whiPin, ÇIXIŞ); // 改 pinMode (grnPin2, ÇIXIŞ); // 改 pinMode (bluPin2, ÇIXIŞ); // 改 pinMode (ylwPin2, ÇIXIŞ); // 改 pinMode (redPin2, ÇIXIŞ); // 改

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ı); crossFade (ağ); crossFade (çəhrayı); crossFade (bənövşəyi); crossFade (narıncı);

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-ə, 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ə rəng dəyərlərini bərabər addımlarla artırmaq və ya azaltmaq istərdik. Təsəvvür edin ki, + işarəsi dəyərin 1 -ə yüksəldilməsini, a -nın isə aşağı salınmasına bərabər olduğunu göstərir. 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ı on addımda 0 -dan 10 -a yüksəlir, yaşıl

5 addımda 0-5, mavi isə üç addımda 10-dan 7-ə düşür.

Həqiqi proqramda rəng faizləri çevrilir

0-255 dəyər və 1020 addım var (255*4).

Bir və ya yuxarı arasında nə qədər böyük bir addım olduğunu başa düşmək üçün

LED dəyərlərindən birini aşağıya vurduqda, başlanğıc və bitiş dəyərləri arasındakı mütləq boşluğu hesablayan və sonra dəyərdəki düzəlişlər arasındakı addımın ölçüsünü təyin etmək üçün bu boşluğu 1020-ə bölən calcStep () adlandırırıq. */

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 birinə uyğun olan addım ölçüsünə çatır, bu 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ə salı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əng ) {// 改

// 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 Y = (rəng [3] * 255) / 100; // 改 int W = (rəng [4] * 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); int stepY = hesablama Adımı (əvvəlki Y, Y); // 改 int stepW = hesablama Addımı (əvvəlki W, W); // 改

for (int i = 0; i <= 1020; i ++) {redVal = calcVal (stepR, redVal, i); grnVal = calcVal (stepG, grnVal, i); bluVal = calcVal (stepB, bluVal, i); ylwVal = calcVal (stepY, ylwVal, i); // 改 whiVal = calcVal (stepW, whiVal, i); // 改

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

analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal); analogWrite (ylwPin, ylwVal); // 改 analogWrite (whiPin, whiVal); // 改 analogWrite (grnPin2, grnVal); // 改 analogWrite (bluPin2, bluVal); // 改 analogWrite (ylwPin2, ylwVal); // 改 analogWrite (redPin2, redVal); // 改

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/RGBYW: #"); Serial. çap (i); Serial.print ("|"); Serial. çap (redVal); Serial.print (" /"); Serial. çap (grnVal); Serial.print (" /"); Serial.println (bluVal); Serial.print (" /"); Serial.println (ylwVal); // 改 Serial.print (" /"); // 改 Serial.println (whiVal); // 改 Serial.print (" /"); // 改} DEBUG += 1; }} // Növbəti döngə üçün cari dəyərləri yeniləyin prevR = redVal; prevG = grnVal; prevB = bluVal; prevY = ylwVal; // 改 əvvəlki W = bütün dəyər; // 改 gecikdirmək (tutmaq); // Döngəyə davam etməzdən əvvəl isteğe bağlı 'gözləmə' millisaniyələri üçün fasilə verin}

Addım 3: Quraşdırın

Qurmaq
Qurmaq
Qurmaq
Qurmaq
Qurmaq
Qurmaq
  1. Çörək taxtasını alın.
  2. Bir LED işığının parlaya bilməsi üçün telləri birləşdirmə demosu:

    1. LED -i çörək taxtasına qoyun. Uzun ucunu sola, qısa ucunu sağa qoyun.
    2. Bir telin bir ucunu LED -in daha uzun ucu ilə eyni cərgədə olan bir yerə qoyun. Digər ucunu Rəqəmsal PWM hissəsinə yerləşdirin. Kod, sarı LED -lərin 10 və 5 -ə, qırmızıların 6 -ya və 11 -ə, mavi rənglərin 8 -ə və 13 -ə, yaşılların 7 -yə və 12 -yə və nəhayət ağ LED -in 9 -a bağlanacağını göstərdi.
    3. Bir rezistorun bir ucunu LEDin qısa ucu ilə eyni sıraya qoyun. Digər ucunu yaxın bir yerə qoyun.
    4. LEDin qısa ucu ilə eyni cərgədə olmayan rezistorun ucu ilə eyni sıraya malik başqa bir keçid telinin ucunu yerləşdirin. Telin digər ucunu mənfi yükləmə cərgəsinə qoyun.
    5. Mənfi yükləmə cərgəsinə başqa bir keçid telinin ucunu qoyun və digər ucunu GND -ə qoyun.
  3. 9 LED -in parlaması üçün 2 -ci addımı 8 dəfə təkrarlayın
  4. Çörək taxtasını qutunun içinə qoyun. Burada bir neçə xatırlatma:

    1. Bir enerji təchizatı istifadə etdim. Qutudan keçmək və çörək taxtasına qoşulmaq üçün bir bıçaq istifadə edərək telləriniz üçün kiçik bir çuxur yaradın.
    2. Qutunun bir tərəfi açıq olduğundan əmin olun. Ayaqqabı qutusunun artıq bir tərəfi açıqdır. Qutu tamamilə bağlanarsa, açıq bir yer yaratmaq üçün qutunun bir tərəfini kəsin.
    3. Yan tərəfi kağız ilə heç bir şeylə örtməyin. Bu, LED işıqlarının kağızdan parlaması üçündür.

Tövsiyə: