İçindekiler:

Neopiksel ve Pull Up Switch Kullanarak Işık - Işık Modülünü Çekin: 6 Adım (Resimli)
Neopiksel ve Pull Up Switch Kullanarak Işık - Işık Modülünü Çekin: 6 Adım (Resimli)

Video: Neopiksel ve Pull Up Switch Kullanarak Işık - Işık Modülünü Çekin: 6 Adım (Resimli)

Video: Neopiksel ve Pull Up Switch Kullanarak Işık - Işık Modülünü Çekin: 6 Adım (Resimli)
Video: Arduino Buton İle Led Yakma #3 2024, Aralık
Anonim
Image
Image
Neopiksel ve Yukarı Çekme Anahtarını Kullanan Işık - Işık Modülünü Çekin
Neopiksel ve Yukarı Çekme Anahtarını Kullanan Işık - Işık Modülünü Çekin

Işık modülünün özellikleri

  • Arduino Uno'su
  • İnternetten satın alınan donanım ve muhafaza
  • Enformatik ve Ürün Tasarımı Okulu'ndan ödünç alınan Neopiksel ve Güç kaynağı
  • Güç kaynağı tarafından kontrol edilen ışık modülü
  • Kullanıcı etkileşimi ile kontrol edilen tüm fonksiyonlar
  • Neopiksel şeridin animasyon türleri: Yağmur tipi, Duş tipi, Kıvılcım şimşek tipi, Pop tipi, Düzensiz tip
  • Yukarı çekme anahtarı Neopiksel şeridine bağlanır ve Neopiksel şeridi çekildiğinde animasyon değişir

1. Adım: Başlamadan Önce

Başlamadan Önce
Başlamadan Önce

Merhaba Eğitilebilirler ve Yapıcılar.

Yağmurun hissini ışık animasyonu ile hissedebilseydik neler olacağı konusunda interaktif bir tasarım projesi başlattık. Işığı doğrudan çeken bir arayüz ile kullanıcının duyarlılığının en üst düzeye çıkarılacağını düşündüm.

hadi işe koyulalım

2. Adım: Gerekli Parçalar

Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar

Bir Işık Modülüne dayalı

***Departmanımız desteği ile Neopiksel ve Güç kaynağı kullanılmıştır.***

Elektronik:

  1. Arduino Uno'su
  2. 3 renkli tel (Siyah, Kırmızı, herhangi bir Renk)
  3. 3pin konektör (Satın almak için bağlantı)
  4. Anahtar 1'i yukarı çekin (Satın almak için bağlantı)
  5. küçülen tüp
  6. WS2812b adreslenebilir LED şerit, 74 LED'li (Neopiksel şerit)*2
  7. Güç kaynağı (5V 350A) 1

***Arduino, Pull Switch ve NeoPixels için 50 set gereklidir.***

Donanım:

  1. Akrilik çubuk 2t (10mm*1000mm) 1
  2. Akrilik levha 5t(60mm*60mm) 1
  3. Foemax 10t (1200mm*1800mm) 1
  4. siyah sprey
  5. Kablo bağı
  6. Sicim
  7. Sunta
  8. ızgara tahtası

3. Adım: Bağlantı ve Donanımı Oluşturma

Bağlantı ve Donanımı Oluşturma
Bağlantı ve Donanımı Oluşturma
Bağlantı ve Donanımı Oluşturma
Bağlantı ve Donanımı Oluşturma
Bağlantı ve Donanımı Oluşturma
Bağlantı ve Donanımı Oluşturma

İlk olarak, bir aydınlatma modülü yapmak için Akrilik Kesim'e ihtiyacımız var.

  • Işık animasyonunu deneyimlemenin bir yolu olarak, 1M alana sahip 2 mm kalınlığında bir akrilik çubuk üzerine neopiksel şerit şeklinde 74 LED takılarak sabitlenen bir aydınlatma modülü tasarlayın. İki tip aydınlatma modülü ürettik: tipik lineer ve spiral.
  • Doğrusal türler için, mevcut neopiksel şeritleri tutulabilir ve sabitlenebilir, ancak spiral türler manuel işlem gerektirir. 74 LED'in her biri parçalara ayrılır, bir spiral akrilik üzerine takılır ve kurşunla birbirine bağlanır.

Neopiksel şeridi akriliğe takın ve her şeridi ısıyla yayılmasını önlemek için sabitleyin veya ince bir misina ile bağlayın. Lineer tipte ise, estetik görünümü tasarlamak için modülün ucuna çekilmesi gereken küre takıldı ve pinpon topunu siyah bir spreyle bitirdik. Daha sonra pinpon topuna küçük bir delik açıp onu bir iple bağladılar. Sonraki en önemli kısım olan anahtar ve neopiksel gösterildiği gibi bağlanır. Anahtar daha sonra tavan rafına sabitlenir.

Spiral tip olması durumunda, spiral modülün doğrudan çekilmesinin basınç altında akriliği kırma riski vardır, bu nedenle çekme bölümü (Giriş) ve modül (Çıkış) ayrılmıştır. Işık düşüşünü en üst düzeye çıkarmak için modüller tavana dikey olarak yerleştirildi, lineer modüller havaya sabitlendi, spiraller doğrudan tavana sabitlendi. Ve pinpon topunu ve anahtarı oltaya bağladık, böylece çalıştırılabilirdi.

Anahtarı rafa sabitlemek için yukarıdaki çizimde gösterilen akrilik kesim gereklidir. 6 cm kare şekilli bir anahtar yaklaşık 5 mm kalınlığındadır, anahtar ortalanmış ve anahtarı sıkıca sabitlemek için her iki taraftaki deliklerden bir kablo bağı geçirilmiştir. Merkezin altındaki dairesel bir delik, anahtarın çekmesini ortaya çıkarır; bunun altında, üç telli bir kablonun dışarı çekildiği ve modülün kablo terminaline bağlandığı. Benzer şekilde, dört köşedeki bir delikten raf ve akrilik kablo bağları ile sabitlenir. Yukarıda açıklandığı gibi, lineer modül doğrudan çekme ünitesine bağlıdır, ancak spiral modül pimi ve anahtarı ayrı olarak bağlar.

Adım 4: 50 Işık Modülü Kullanarak Oluşturun

50 Işık Modülü Kullanarak Oluşturun
50 Işık Modülü Kullanarak Oluşturun
50 Işık Modülü Kullanarak Oluşturun
50 Işık Modülü Kullanarak Oluşturun
50 Işık Modülü Kullanarak Oluşturun
50 Işık Modülü Kullanarak Oluşturun

Toplam 50 modül dağıtarak daha zengin ışık için bir kullanıcı deneyimi tasarladık

1.800 mm genişliğinde ve 1.200 mm uzunluğunda bir rafımız vardı ve başlangıçta planladığımız yağmur ve yağmur ortamını yaşayabilmeniz için her bir anahtarı ve modülü birbirine bağladık ve çoklu görevleri mümkün kılmak için her bir modülü tek başına tuttuk..

Tasarım çizimine bağlı olarak, montajı gizlemek ve LED modülünün bağlı bölgesinin görünmediğinden emin olmak için foemax'a yuvarlak bir delik açılmıştır. Akrilik levhadan anahtarın takıldığı LED modül bağlantısına kadar olan mesafe yaklaşık 1cm olduğu için 1cm kalınlığında foemax kullanılmıştır.

Metal kare çerçeve, toplam ağırlığı ve dengeyi korurken kurulumu vidalar ve kablo bağlarıyla bir arada tutmak için kullanıldı. Açıktaki bağlantıların uzunluğu, üretici denediğinde olduğundan daha fazlaysa, daha kalın tahta verimsizdir ve diğer yapılar önerilir.

Kullanıcının göz seviyesinde deneyimini kolaylaştırmak için, tamamlanan kurulum yaklaşık 2 m yüksekliğinde bir destek üzerine yerleştirilir, ancak dikkat edilmesi gereken nokta, anahtarla birlikte yerleşik LED modülünü takmanın çok zahmetli olmasıdır, bu nedenle tüm bağlantılar çıkarılmalıdır. Merdivenden yukarı çıktık ve desteğin üzerine sabitlenmiş kurulum ile modülü bağladık.

Tüm bu sürecin en önemli kısmı, deneyimin güvenli bir ortamda mümkün olmasını sağlamak için işin güvenli ve tam olarak güvenli bir şekilde yapılmasını sağlamaktır

Daha verimli ve sorunsuz çoklu görev için toplam 10 arduino ve 50 LED modülü kullanıldı ve arduino başına beş LED modülü bağlandı. Ayrıntılar için ekteki plana bakın. Tasarım şemasına göre tam anahtarı kullanarak neopiksel çoklu görev kodlaması bir sonraki adımda ayrıntılı olarak ele alınacaktır.

Adım 5: Arduino Kodlama ve Kablolama

Arduino Kodlama ve Kablolama
Arduino Kodlama ve Kablolama
Arduino Kodlama ve Kablolama
Arduino Kodlama ve Kablolama

kablolama

  • 4. adımın düzenine göre 50 modül bağlandı.
  • Her modül, çoklu görevi etkinleştirmek ve net bir bağlantı sağlamak için 50 modülden oluşan 10 sete bölündü.
  • Yukarıdaki set 1 görüntüsünde gösterildiği gibi, tek bir arduinoya beş modül bağlandı ve güç kaynağını bağlamak için 5v neopiksel pinleri bir kerede birbirine bağlandı.
  • Neopiksellerin ve anahtarların GND'si de birbirine bağlandı ve algılama kolaylığı için anahtarlar 2, 3, 4, 5, 6 pinlerine ve neopikseller 9, 10, 11, 12, 13 pinlerine takıldı..
  • Anahtarlar ve neopikseller sırasıyla 2-9, 3-10, 4-11, 5-12, 6-13 şekilde bağlanmıştır.
  • Unutulmamalıdır ki, hatların bağlantıları karmaşık olduğundan ve kısa devrelerden dolayı yangın riski olduğundan, zayıf kısımların kırılmaması için büzülen tüp ısıtılmıştır.

Yukarı çekme anahtarlı neopiksel çok görevli kodlama

5 ışık animasyonu (Yağmur tipi, Duş tipi, Kıvılcım yıldırım tipi, Pop tipi, Düzensiz tip)

#Dahil etmek

/*사용하고자하는 패턴을 추가함*/

enum pattern { HİÇBİRİ, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, TWINKLE, STAR, RAINBOWSPARKLE, METEOR, LIGHT, BLOSSOM }; /*네오 픽셀을 방향을 설정함*/ enum yönü { İLERİ, GERİ };

/*패턴의 클래스를 입력함*/

class NeoPatterns: public Adafruit_NeoPixel { /* 패턴을 추가하고 업데이트하기위한 함수*/ public: pattern ActivePattern; /*클레스 함수에 패턴의 방향을 입력*/ yön Yön;

/*변수 Aralık을 추가*/ unsigned long Interval; /*변수 lastUpdate를 추가*/ imzasız uzun lastUpdate; /*변수 Renk1, Renk2를 추가*/ uint32_t Renk1, Renk2; /*변수 TotalSteps를 추가*/ uint16_t TotalSteps; /*변수 Dizin를 추가*/ uint16_t Dizin;

/*패턴을 완료했을시 다시 불러오는 함수*/ void (*OnComplete)(); /*네오패턴에서 네오픽샐의 갯수, 핀번호, 타입, 콜백을 불러오는 함수*/ NeoPatterns(uint16_t piksel, uint8_t pin, uint8_t type, void (*geri arama)()): Adafruit_NeoPixel(piksel, pin, tip){ OnComplete = geri arama; }

/*패턴을 업데이트 하기위한 케이스 구문*/

void Update(){ /*패턴의 시간 설정. 멀티태스킹을 구현하는 구문*/ if ((millis() - lastUpdate) > Aralık){ lastUpdate = millis(); /*ActivePattern의 스위치구문*/ geçiş (ActivePattern) { /*case RAINBOW_CYCLE에서는 RainbowCycleUpdate를 실행하라*/ case RAINBOW_CYCLE: RainbowCycleUpdate(); /*case RAINBOW_CYCLE에서 나와라*/ ara;

/*case THEATER_CHASE에서는 TheaterChaseUpdate를 실행하라*/

durum THEATER_CHASE: TheaterChaseUpdate(); /*case THEATER_CHASE에서 나와라*/ mola;

/*case COLOR_WIPE에서는 ColorWipeUpdate를 실행하라*/

durum COLOR_WIPE: ColorWipeUpdate(); /*case COLOR_WIPE에서 나와라*/ break; /*case SCANNER에서는 ScannerUpdate를 실행하라*/ case SCANNER: ScannerUpdate(); /*case SCANNER에서 나와라*/ break;

/*kasa FADE에서는 FadeUpdate를 실행하라*/

durum FADE: FadeUpdate(); /*case FADE에서 나와라*/ break;

/*case TWINKLE에서는 TwinkleUpdate를 실행하라*/

durum TWINKLE: TwinkleUpdate(); /*case TWINKLE에서 나와라*/ break;

/*case STAR에서는 StarUpdate를 실행하라*/

durum YILDIZI: StarUpdate(); /*case STAR에서 나와라*/ ara;

/*case RAINBOWSPARKLE에서는 RainbowsparkleUpdate를 실행하라*/

durum RAINBOWSPARKLE: RainbowsparkleUpdate(); /*case RAINBOWSPARKLE에서 나와라*/ break; /*case METEOR에서는 MeteorUpdate를 실행하라*/ case METEOR: MeteorUpdate(); /*case METEOR에서 나와라*/ break;

/*case LIGHT에서는 LightUpdate를 실행하라*/

durum IŞIK: LightUpdate(); /*case LIGHT에서 나와라*/ ara;

/*case BLOSSOM에서는 BlossomUpdate를 실행하라*/

case BLOSSOM: BlossomUpdate(); /*case BLOSSOM에서 나와라*/ break; } } }

/*패턴의 방향을 설정하는 구문*/

/*İndeks를 증가시키고 초기화하는 함수*/

void Artış(){ /*만약 정방향이면 인덱스를 증가시켜라*/ if (Yön == İLERİ){ Index++; /*만약 인덱스가 전체 네오픽셀 구동 갯수와 같거나 많다면 0으로 초기화시켜라*/ if (Index >= TotalSteps){ Index = 0; /*패턴을 완료시키는 함수*/ if (OnComplete != NULL){ OnComplete(); } } }

/*만약 정방향이 아니면 인덱스를 감소시켜라*/ else{ --Index; /*만약 인덱스가 전체 네오픽셀 구동 갯수와 같거나 적다면 전체 구동 갯수에서 1을빼라*/ if (Index <= 0){ Index = TotalSteps - 1; /*패턴을 완료시키는 함수*/ if (OnComplete != NULL){ OnComplete(); } } } }

/*반대방향으로 움직이게하는 함수*/

void Ters(){ /*애니메이션 함수에 Ters를 썼을시, 만약 방향이 정방향이면*/ if (Yön == İLERİ){ /*방향은 그와 반대이며 전체 구동 갯수에서 1일빼라*/ Yön = GERİ; İndeks = ToplamAdımlar - 1; } /*그 외의 방향이 정방향이면 인덱스를 0으로 설정해라*/ else{ Yön = İLERİ; dizin = 0; } }

/*애니메이션을 설정하는 함수들*

*RainbowCycle의 시간과 방향을 입력*/

void RainbowCycle(uint8_t aralığı, yön dir = İLERİ){ /*실행되는 패턴은 RainbowCycle임*/ ActivePattern = RAINBOW_CYCLE; /*시간은 void RainbowCycle()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*총 구동갯수는 255임*/ ToplamAdımlar = 255; /*인덱스는 0으로 설정함*/ İndeks = 0; /*방향은 void RainbowCycle()안에 입력되는 yön = İLERİ과 같음*/ Yön = yön; }

/*RainbowCycle를 업데이트했을 경우*/

void RainbowCycleUpdate(){ /*변수 i가 네오픽셀 개수보다 작으면 i를 증가시켜라*/ for (int i = 0; i < numPixels(); i++){ /*변수 i가 증가함과 동시에 RGB의 무지개 컬러로 변화하면서 작동해라 */ setPixelColor(i, Wheel(((i * 256 / numPixels()) + Index) & 255); } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*TheaterChase의 컬러와 시간 방향을 입력*/

void TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD){ /*실행되는 패턴은 RTHEATER_CHASE*/ ActivePattern = THEATER_CHASE; /*시간은 void TheaterChase()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*총 구동갯수는 numPixels갯수임*/ TotalSteps = numPixels(); /*컬러 1, 2를 설정*/ Renk1 = renk1; Renk2 = renk2; /*인덱스는 0으로 설정함*/ İndeks = 0; /*방향은 void TheaterChase()안에 입력되는 dir = FORWARD과 같음*/ Direction = dir; }

/*TheaterChase를 업데이트했을 경우*/

void TheaterChaseUpdate(){ /*변수 i가 네오픽셀 개수보다 작으면 i를 증가시켜라*/ for (int i = 0; i < numPixels(); i++){ /*만약 변수 i에 인덱스를 더해서 3으로 나눈 것이 0과 같다면 i를 Color로 변환시켜라*/ if ((i + Index) % 3 == 0){ setPixelColor(i, Color1); } /*그렇지 않다면 i를 Color로 변환시켜라*/ else{ setPixelColor(i, Color2); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*ColorWipe의 컬러와 시간 방향을 입력*/

void ColorWipe(uint32_t renk, uint8_t aralığı, yön dir = İLERİ){ /*실행되는 패턴은 COLOR_WIPE*/ ActivePattern = COLOR_WIPE; /*시간은 void ColorWipe()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*총 구동갯수는 numPixels갯수임*/ TotalSteps = numPixels(); /*컬러 1을 설정*/ Renk1 = renk; /*인덱스는 0으로 설정함*/ İndeks = 0; /*방향은 void ColorWipe()안에 입력되는 yön = İLERİ과 같음*/ Yön = yön; }

/*ColorWipeUpdate를 업데이트했을 경우*/

void ColorWipeUpdate(){ /*index를 컬러1로 변환시켜라*/ setPixelColor(Index, Color1); /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*Tarayıcı의 컬러와 시간을 입력*/

void Tarayıcı(uint32_t color1, uint8_t aralığı){ /*실행되는 패턴은 TARAYICI*/ ActivePattern = TARAYICI; /*시간은 void Scanner()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*구동갯수는 총갯수에서 1을빼고 2를 곱해라*/ TotalSteps = (numPixels() - 1) * 2; /*컬러 1을 설정*/ Renk1 = renk1; /*인덱스는 0으로 설정함*/ İndeks = 0; }

/*Tarayıcı Güncellemesi를 업데이트했을 경우*/

void ScannerUpdate(){ /*변수 i는 영이고 총갯수보다 작을경우 i를 증가시켜라*/ for (int i = 0; i < numPixels(); i++){ /*만약 변수 i가 인덱스와 같다면 i 를 color1로 변환시켜라*/ if (i == Index){ setPixelColor(i, Color1); } /*그렇지 않다면 변수 i를 전체구동갯수에서 인덱스를 뺀값과 같다 */ else if (i == TotalSteps - Index){ setPixelColor(i, Color1); } /*그 밖에는 i를 디밍시켜라 i의 값만큼 */ else { setPixelColor(i, DimColor(getPixelColor(i))); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*Tarayıcı의 컬러1, 2와 스텝, 시간, 방향을 입력*/

void Fade(uint32_t color1, uint32_t color2, uint16_t adımlar, uint8_t interval, direction dir = FORWARD){ /*실행되는 패턴은 FADE*/ ActivePattern = FADE; /*시간은 void Fade()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*구동갯수는 스텝값임*/ TotalSteps = adımlar; /*컬러 1, 2를 설정*/ Renk1 = renk1; Renk2 = renk2; /*인덱스는 0으로 설정함*/ İndeks = 0; /*방향은 void Fade()안에 입력되는 dir = FORWARD과 같음*/ Direction = dir; } /*FadeUpdate를 업데이트했을 경우*/ void FadeUpdate(){ /*변수 red값은 다음과 같음*/ uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / ToplamAdımlar; /*변수 green값은 다음과 같음*/ uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps; /*변수 blue값은 다음과 같음*/ uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps; /*위의 kırmızı, yeşil, mavi 값으로 컬러를 셋팅함*/ ColorSet(Renk(kırmızı, yeşil, mavi)); /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*모든 네오픽셀을 끄는 구문*/

void alloff() { /*총 네오픽셀 갯수는 74개이며*/ int NPIXEL = 74; /*변수 i가 증가하며 모든 네오픽셀의 컬러 값을 0으로 변환함*/ for (int i = 0; i < NPIXEL; i++) { setPixelColor(i, 0, 0, 0); } }

/*Parıltı의 컬러1와 시간을 입력*/

void Twinkle(uint32_t color1, uint8_t interval){ /*실행되는 패턴은 TWINKLE*/ ActivePattern = TWINKLE; /*시간은 void Twinkle()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*컬러 1를 설정*/ Renk1 = renk1; /*총 구동갯수는 numPixels갯수임*/ TotalSteps = numPixels(); dizin = 0; }

/*TwinkleUpdate를 업데이트했을 경우*/

void TwinkleUpdate(){ /*모든 네오픽셀의 컬러를 0으로 셋팅*/ setAll(0, 0, 0); /*변수 Piksel은 rastgele 74*/ int Piksel = rastgele(74); /*rastgele 74개에서 2로나눈 수를 랜덤하게 켜라*/ setPixelColor(Pixel/2, 50, 100, 255); setPixelColor(Piksel, 250, 255, 250); setPixelColor(Piksel/2, 200, 250, 255); setPixelColor(Piksel, 255, 255, 255); setPixelColor(Piksel, 250, 230, 250); setPixelColor(Piksel/2, 150, 200, 255); /*애니메이션을 보여주는 함수 */ show(); /*랜덤하게 끄는 함수 */ setPixelColor(Pixel, 0, 0, 0); /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*Yıldız의 컬러1 값을 입력*/

void Star(uint32_t color1){ /*실행되는 패턴은 STAR*/ ActivePattern = STAR; /*시간은 void Star()안에 입력되는 aralık과 같음*/ Aralık = Aralık; /*총 구동갯수는 numPixels갯수임*/ TotalSteps = numPixels(); /*컬러 1을 설정*/ Renk1 = renk1; dizin = 0; }

/*StarUpdate를 업데이트했을 경우*/

void StarUpdate(){ /*인덱스와 컬러를 셋팅*/ setPixelColor(Index, Color1); göstermek(); /*변수 i가 0이고 구동 갯수보다 작으면 i를 감소시킴 = 한칸씩 이동하는 애니메이션*/ for (int i = 0; i < numPixels(); i--) { setPixelColor(i, Color(0,) 0, 0)); } /*애니메이션을 보여주는 함수 */ Artış(); }

/*Gökkuşağı ışıltısı의 시간과 방향을 입력*/

void Rainbowsparkle(uint8_t aralığı, yön dir = İLERİ){ /*실행되는 패턴은 RAINBOWSPARKLE*/ ActivePattern = RAINBOWSPARKLE; /*시간은 void Rainbowsparkle()안에 입력되는 aralık과 같음*/ Aralık = aralık; /*총 구동갯수는 numPixels갯수임*/ TotalSteps = numPixels(); dizin = 0; /*방향은 void Rainbowsparkle()안에 입력되는 direction과 같음*/ Direction = dir; }

/*RainbowsparkleUpdate를 업데이트했을 경우*/

void RainbowsparkleUpdate(){ /*변수 i가 0이고 구동 갯수보다 작으면 i값을 증가하는데*/ for (int i = 0; i < numPixels(); i++){ /*변수 i가 0이고 구동 구동 갯수보다 작으면 i값을 증가하는데*/ if ((i + İndeks) % 2 == 0){ uint32_t c = rastgele(255); setPixelColor(i, c); } başka{ setPixelColor(i, rastgele(255)); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); } /*Meteor의 시간과 방향을 입력*/ void Meteor(uint32_t color1){ /*실행되는 패턴은 METEOR*/ ActivePattern = METEOR; /*시간 설정*/ Aralık = Aralık; /*총 구동갯수는 numPixels갯수에서 1일뺀 후, *2를 한것과 같음*/ TotalSteps = (numPixels()-1) * 2; /*컬러 1을 설정*/ Renk1 = renk1; dizin = 0; }

/*Meteor Güncellemesi를 업데이트했을 경우*/

void MeteorUpdate(){ for (int i = 0; i < numPixels(); i++){ if (i == Index){ setPixelColor(i, 100, random(255), 255); } else { setPixelColor(i, DimColor(getPixelColor(i))); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*Işık의 시간과 방향을 입력*/

void Light(uint32_t color1){ /*실행되는 패턴은 LIGHT*/ ActivePattern = LIGHT; /*시간 설정*/ Aralık = Aralık; /*총 구동갯수는 numPixels갯수에서 1일뺀 후, *2를 한것과 같음*/ TotalSteps = (numPixels()-1) * 2; /*컬러 1을 설정*/ Renk1 = renk1; dizin = 0; }

/*LightUpdate를 업데이트했을 경우*/

void LightUpdate(){ for (int i = 0; i < numPixels(); i++){ if (i == TotalSteps - Index){ setPixelColor(i, 150, random(200), 40); } else { setPixelColor(i, DimColor(getPixelColor(i))); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

/*Çiçek의 시간과 방향을 입력*/

void Blossom(uint32_t color1){ /*실행되는 패턴은 BLOSSOM*/ ActivePattern = BLOSSOM; /*시간 설정*/ Aralık = Aralık; /*총 구동갯수는 numPixels갯수에서 1일뺀 후, *2를 한것과 같음*/ TotalSteps = (numPixels()-1) * 2; /*컬러 1을 설정*/ Renk1 = renk1; dizin = 0; }

/*BlossomUpdate를 업데이트했을 경우*/

void BlossomUpdate(){ for (int i = 0; i < numPixels(); i++){ if (i == TotalSteps - Index){ setPixelColor(i, 255, random(255), 100); } else { setPixelColor(i, DimColor(getPixelColor(i))); } } /*애니메이션을 보여주는 함수 */ show(); Artış(); }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*네오픽셀의 켜지는 위치와 색을 지정해주는 함수 */ void setAll(byte red, byte green, byte blue) { for(int i = 0; i < numPixels(); i++) { setPixelColor(i, red, yeşil Mavi); } göstermek(); }

/*네오픽셀의 디밍, 즉 밝기를 조절하는 함수*/

uint32_t DimColor(uint32_t color){ // R, G ve B bileşenlerini bir bit sağa kaydır uint32_t dimColor = Color(Kırmızı(renk) >> 1, Yeşil(renk) >> 1, Mavi(renk) >> 1); dimColor'ı döndür; }

/*모든 네오픽셀의 칼라를 조절*/

void ColorSet(uint32_t color){ for (int i = 0; i < numPixels(); i++){ setPixelColor(i, color); } göstermek(); }

/*레드값을 불러옴*/

uint8_t Red(uint32_t color){ return (color >> 16) & 0xFF; } /*그린값을 불러옴*/ uint8_t Green(uint32_t color){ return (color >> 8) & 0xFF; } /*블루값을 불러옴*/ uint8_t Blue(uint32_t color){ dönüş rengi & 0xFF; }

/*Gökkuşağı 컬러를 불러옴*/

uint32_t Wheel(byte WheelPos){ WheelPos = 255 - WheelPos; if (WheelPos < 85){ dönüş Renk(255 - WheelPos * 3, 0, WheelPos * 3); } else if (WheelPos < 170){ WheelPos -= 85; dönüş Renk(0, WheelPos * 3, 255 - WheelPos * 3); } başka{ WheelPos -= 170; dönüş Renk(WheelPos * 3, 255 - WheelPos * 3, 0); } } };

/*şerit을 불러오기위한 함수 / *사용하는 스트립별로 모두 지정해주어야함*/

geçersiz strip1Complete(); geçersiz strip2Complete(); geçersiz strip3Complete(); geçersiz strip4Complete(); geçersiz strip5Complete();

/*네오픽셀의 갯수 설정*/

#define NUMPIXELS 74 /*사용하는 버튼의 갯수 설정*/ #define B_NUM 5 /*Strip1~5까지, 갯수는 74개 스트립 연결핀은 strip1은 8 ~ strip5까지12*/ NeoPatterns strip1(74, 8, NEO_GRB + NEO_KHZ800, &strip1Complete); NeoPatterns strip2(74, 9, NEO_GRB + NEO_KHZ800, &strip2Complete); NeoPatterns strip3(74, 10, NEO_GRB + NEO_KHZ800, &strip3Complete); NeoPatterns strip4(74, 11, NEO_GRB + NEO_KHZ800, &strip4Complete); NeoPatterns strip5(74, 12, NEO_GRB + NEO_KHZ800, &strip5Complete); /*배열을 사용한 연결 버튼핀 설정*/ const int buttonPin[B_NUM] = {2, 3, 4, 5, 6}; /*배열을 사용하여 버튼 상태를 지정해줌*/ int buttonState[B_NUM]; /*2번핀부터 6번핀까지 상태는 순서대로 LOW임*/ int lastButtonState[B_NUM] = {DÜŞÜK, DÜŞÜK, DÜŞÜK, DÜŞÜK, DÜŞÜK}; /*2번핀부터 6번핀까지 버튼 카운터를 초기화시킴*/ int buttonCounter[B_NUM] = {0, 0, 0, 0, 0}; /*2번핀부터 6번핀까지 최대 버튼 카운터는 5임*/ int buttonCounterMax = 5; /*모든 버튼핀을 읽일수있도록 변수 추가*/ int okuma[B_NUM]; unsigned long lastDebounceTime[B_NUM] = {0, 0, 0, 0, 0}; /*모든 버튼핀을 읽는 시간간격은 delay50과 같음*/ unsigned long debounceDelay = 50;

geçersiz kurulum(){

/*복잡하게 저항 연결이 필요없도록 인풋 풀업방식의 버튼설정: GND - 5V(Pin numarasına bağlan)*/ for (int i = 0; i < B_NUM; i++) { pinMode(buttonPin, INPUT_PULLUP); } Serial.begin(9600); /*스트립 1~5를 셋팅*/ strip1.begin(); strip2.begin(); strip3.begin(); strip4.begin(); strip5.begin();

//strip1. TheaterChase(strip1. Color(255, 0, 255), strip1. Color(255, 50, 0), 20, FORWARD);

}

/*버튼 카운터 변수값은 5임*/

int sayaç = 5; void loop(){ /*버튼 수보다 i가 작으면 i를 증가시키고*/ for (int i = 0; i debounceDelay) { if (okuma != buttonState) { buttonState = okuma; buttonCounter++; /*버튼 카운팅이 위에서 설정한 Maks값 5를 넘으면 0으로 초기화 시켜라.*/ if (buttonCounter > buttonCounterMax) buttonCounter = 0; } } lastButtonState = okuma; } /*모든 스트립을 업데이트함.*/ strip1. Update(); strip2. Update(); strip3. Update(); strip4. Update(); strip5. Update();

/////SWITCH_2////////////////////////////////////// //////////////////////////////////////////// ////////////////////////////////////

/*버튼 배열의 0번째 즉. 2번핀에 연결된 버튼을 활용하여 애니메이션이 구동되도록 하는 스위치 케이스 구문*/ anahtarı (buttonCounter[0]) {

/*첫번째 버튼을 활동시키면 구동되는 애니메이션*/

durum 0: strip1. ActivePattern = BLOSSOM; /*해당 애니메이션의 시간을 설정*/ strip1. Interval = 20; /*구동되는 네오픽셀의 갯수를 설정*/ strip1. TotalSteps = strip1.numPixels(); kırmak; /*두번째 버튼을 활동시키면 구동되는 애니메이션*/ case 1: strip1. ActivePattern = RAINBOWSPARKLE; şerit1. Aralık = 50; strip1. TotalSteps = strip1.numPixels(); kırmak; /*세번째 버튼을 활동시키면 구동되는 애니메이션*/ case 2: strip1. ActivePattern = TARAYICI; şerit1. Aralık = 10; strip1. TotalSteps = (strip1.numPixels() - 1) * 2; kırmak; /*네번째 버튼을 활동시키면 구동되는 애니메이션*/ case 3: strip1. ActivePattern = TWINKLE; şerit1. Aralık = 1; strip1. TotalSteps = strip1.numPixels(); kırmak; /*다섯번째 버튼을 활동시키면 구동되는 애니메이션*/ case 4: strip1. ActivePattern = METEOR; şerit1. Aralık = 10; strip1. TotalSteps = strip1.numPixels(); kırmak; } Serial.print(buttonCounter[0]); Seri.print(", "); Serial.println(buttonCounter[1]);

/////SWITCH_3////////////////////////////////////// //////////////////////////////////////////// ////////////////////////////////////

switch (buttonCounter[1]) { case 0: strip2. ActivePattern = STAR; strip2. Aralık = 50; strip2. TotalSteps = strip2.numPixels(); kırmak; durum 1: strip2. ActivePattern = RAINBOWSPARKLE; strip2. Aralık = 100; strip2. TotalSteps = strip2.numPixels(); kırmak; durum 2: strip2. ActivePattern = TARAYICI; strip2. Aralık = 20; strip2. TotalSteps = (strip2.numPixels() - 1) * 2; kırmak; durum 3: strip2. ActivePattern = TWINKLE; strip2. Aralık = 5; strip2. TotalSteps = strip2.numPixels(); kırmak; durum 4: strip2. ActivePattern = METEOR; strip2. Aralık = 40; strip2. TotalSteps = strip2.numPixels(); kırmak; } Serial.print(buttonCounter[0]); Seri.print(", "); Serial.println(buttonCounter[1]);

/////SWITCH_4////////////////////////////////////// //////////////////////////////////////////// ////////////////////////////////////

switch (buttonCounter[2]) { case 0: strip3. ActivePattern = STAR; strip3. Aralık = 50; strip3. TotalSteps = strip3.numPixels(); kırmak; durum 1: strip3. ActivePattern = RAINBOWSPARKLE; strip3. Aralık = 100; strip3. TotalSteps = strip3.numPixels(); kırmak; durum 2: strip3. ActivePattern = TARAYICI; strip3. Aralık = 20; strip3. TotalSteps = (strip3.numPixels() - 1) * 2; kırmak; durum 3: strip3. ActivePattern = TWINKLE; strip3. Aralık = 5; strip3. TotalSteps = strip3.numPixels(); kırmak; durum 4: strip3. ActivePattern = METEOR; strip3. Aralık = 25; strip3. TotalSteps = strip3.numPixels(); kırmak; } Serial.print(buttonCounter[0]); Seri.print(", "); Serial.println(buttonCounter[1]);

/////SWITCH_5////////////////////////////////////// //////////////////////////////////////////// ////////////////////////////////////

switch (buttonCounter[3]) { case 0: strip4. ActivePattern = STAR; strip4. Aralık = 50; strip4. TotalSteps = strip4.numPixels(); kırmak; durum 1: strip4. ActivePattern = RAINBOWSPARKLE; strip4. Aralık = 100; strip4. TotalSteps = strip4.numPixels(); kırmak; durum 2: strip4. ActivePattern = TARAYICI; strip4. Aralık = 20; strip4. TotalSteps = (strip4.numPixels() - 1) * 2; kırmak; durum 3: strip4. ActivePattern = TWINKLE; strip4. Aralık = 5; strip4. TotalSteps = strip4.numPixels(); kırmak; durum 4: strip4. ActivePattern = METEOR; strip4. Aralık = 25; strip4. TotalSteps = strip4.numPixels(); kırmak; } Serial.print(buttonCounter[0]); Seri.print(", "); Serial.println(buttonCounter[1]);

/////SWITCH_6////////////////////////////////////// ///////////////////////////////////////////// ////////////////////////////////////

switch (buttonCounter[4]) { case 0: strip5. ActivePattern = STAR; şerit5. Aralık = 50; strip5. TotalSteps = strip5.numPixels(); kırmak; durum 1: strip5. ActivePattern = RAINBOWSPARKLE; şerit5. Aralık = 100; strip5. TotalSteps = strip5.numPixels(); kırmak; durum 2: strip5. ActivePattern = TARAYICI; şerit5. Aralık = 20; strip5. TotalSteps = (strip5.numPixels() - 1) * 2; kırmak; durum 3: strip5. ActivePattern = TWINKLE; şerit5. Aralık = 5; strip5. TotalSteps = strip5.numPixels(); kırmak; durum 4: strip5. ActivePattern = METEOR; şerit5. Aralık = 25; strip5. TotalSteps = strip5.numPixels(); kırmak; } Serial.print(buttonCounter[0]); Seri.print(", "); Serial.println(buttonCounter[1]); }

// strip1 Tamamlama Geri Çağrısı

void strip1Complete(){ strip1. Color1 = strip1. Wheel(rastgele(255)); strip1. Color2 = strip1. Wheel(rastgele(255)); strip1. Index = 0; }

// strip2 Tamamlama Geri Çağırma

void strip2Complete(){ strip2. Color1 = strip2. Wheel(rastgele(255)); strip2. Color2 = strip2. Wheel(rastgele(255)); strip2. Index = 0; }

// strip3 Tamamlama Geri Araması

void strip3Complete(){ strip3. Color1 = strip3. Wheel(rastgele(255)); strip3. Color2 = strip3. Wheel(rastgele(255)); strip3. Index = 0; }

// strip4 Tamamlama Geri Çağırma

void strip4Complete(){ strip4. Color1 = strip4. Wheel(rastgele(255)); strip4. Color2 = strip4. Wheel(rastgele(255)); strip4. Index = 0; }

// strip5 Tamamlama Geri Araması

void strip5Complete(){ strip5. Color1 = strip5. Wheel(rastgele(255)); strip5. Color2 = strip5. Wheel(rastgele(255)); strip5. Index = 0; }

Adım 6: Sonuç ve Film Yapımı

Image
Image
Sonuç ve Film Yapımı
Sonuç ve Film Yapımı

Yeterli olmasa da projemize gösterdiğiniz ilgi için teşekkür ederiz.

Önerilen: