Mündəricat:
- Addım 1: Başlamazdan əvvəl
- Addım 2: Lazım olan hissələr
- Addım 3: Bağlantı və Avadanlıqların Qurulması
- Addım 4: 50 İşıq Modulu istifadə edərək yaradın
- Addım 5: Arduino Kodlaşdırma və Kablolama
- Addım 6: Nəticə və Film çəkmək
Video: İşığı çəkin - Neopixel & Pull Up Switch istifadə edərək İşıq Modulu: 6 addım (şəkillərlə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:46
İşıq modulunun xüsusiyyətləri
- Arduino Uno
- Avadanlıq və korpus internetdən alınıb
- Neopixel və Enerji təchizatı İnformatika və Məhsul Dizayn Məktəbindən alınmışdır
- İşıq modulu enerji təchizatı ilə idarə olunur
- Bütün funksiyalar istifadəçilərin qarşılıqlı əlaqəsi ilə idarə olunur
- Neopixel zolağının animasiya növləri: Yağış növü, Duş tipi, Qığılcımlı ildırım növü, Pop növü, Düzensiz tip
- Açma açarı Neopixel zolağına bağlıdır və Neopixel şeridi çəkildikdə animasiya dəyişir
Addım 1: Başlamazdan əvvəl
Salam Təlimatçılar və Yaradıcılar.
Yağış duyğusunu işıq animasiyası ilə hiss edə bilsək nə olacağı baxımından interaktiv dizayn layihəsinə başladıq. İşığı birbaşa çəkən bir interfeys vasitəsilə istifadəçinin həssaslığının maksimuma çatacağını düşünürdüm.
İşə girməyək
Addım 2: Lazım olan hissələr
Bir İşıq Moduluna əsaslanır
*** Şöbəmizin dəstəyi ilə Neopixels və Enerji təchizatı istifadə edildi. ***
Elektronika:
- Arduino Uno
- 3 rəngli tel (Qara, Qırmızı, istənilən rəng)
- 3 pinli bağlayıcı (Almaq üçün link)
- 1 açarını yuxarı çəkin (Almaq üçün link)
- daralma borusu
- WS2812b əlavə edilə bilən LED şeridi 74 LED (Neopixel şeridi)*2
- Enerji təchizatı (5V 350A) 1
*** Arduino, Pull Switch və NeoPixels üçün 50 dəst lazımdır. ***
Avadanlıq:
- Akril çubuq 2t (10mm*1000mm) 1
- Akril lövhə 5t (60mm*60mm) 1
- Foemax 10t (1200mm*1800mm) 1
- Qara sprey
- Kabel bağlayıcı
- Simli
- Sərt lövhə
- Şəbəkə lövhəsi
Addım 3: Bağlantı və Avadanlıqların Qurulması
Birincisi, bir işıqlandırma modulu hazırlamaq üçün Akril Kəsmə lazımdır.
- İşığın animasiyasını yaşamaq üçün, 1M sahəsi olan 2 mm qalınlığında akril çubuğa neopixel şerit şəklində 74 LED bağlayaraq sabitlənən bir işıqlandırma modulunu hazırlayın. İki növ işıqlandırma modulu istehsal etdik: tipik xətti və spiral.
- Xətti tiplər üçün, mövcud neopixel şeritlər tutula və bərkidilə bilər, ancaq spiral tiplər əllə işləməyi tələb edir. 74 LED -in hər biri hissələrə bölünür, spiral akrilə yapışdırılır və qurğuşunla bağlanır.
Neopixel şeridini akrilə yapışdırın və hər bir şeridin istidən yayılmaması üçün bərkidin və ya nazik bir balıqçılıq xətti ilə bağlayın. Xətti tipə gəldikdə, estetik görünüşün dizaynı üçün modulun ucuna çəkilməli olan sahə quraşdırıldı və stolüstü tennis topunu qara bir spreylə bitirdik. Sonra stolüstü tennis topunda kiçik bir delik açdılar və iplə bağladılar. Növbəti ən vacib hissə, keçid və neopiksel, göstərildiyi kimi bağlanır. Sonra açar tavan rəfinə bərkidilir.
Spiral tipdə, spiral modulunun birbaşa çəkilməsinin təzyiq altında akrili qıra biləcəyi riski var, buna görə çəkmə bölməsi (Giriş) və modul (Çıxış) ayrıldı. İşıq düşməsini maksimuma çatdırmaq üçün modullar tavana şaquli olaraq quraşdırılmış, xətti modullar havaya, spirallər birbaşa tavana sabitlənmişdir. Və stolüstü tennis topunu və açarı balıqçılıq xəttinə bağladıq ki, işlədilsin.
Açarı rəfə bağlamaq üçün yuxarıdakı şəkildə göstərildiyi kimi akril kəsmə lazımdır. 6 sm kvadrat formalı açar təxminən 5 mm qalınlığındadır, açar mərkəzdədir və açarı möhkəm bağlamaq üçün hər iki tərəfdəki deliklərdən bir kabel bağı daxil edilir. Mərkəzin altındakı dairəvi bir çuxur, açarın çəkilməsini ortaya qoyur, bunun altında üç telli kabel çıxarılır və modulun kabel terminalına qoşulur. Və bənzər şəkildə, dörd küncdəki bir çuxurdan, rəf və akril kabel bağları ilə bərkidilir. Yuxarıda təsvir edildiyi kimi, xətti modul birbaşa çəkilməyə bağlanır, lakin spiral modulu pin və açarı ayrıca bağlayır.
Addım 4: 50 İşıq Modulu istifadə edərək yaradın
Cəmi 50 modul yerləşdirərək daha zəngin işıq üçün bir istifadəçi təcrübəsi hazırladıq
1 800 mm genişlikdə və 1 200 mm uzunluğunda bir rəfimiz vardı və hər açarı və modulu bağladıq ki, əvvəlcə planlaşdırdığımız yağış və yağış mühitini yaşayasınız və hər bir modulu tək-tək saxlayaq..
Dizayn rəsmindən asılı olaraq, quraşdırmanı gizlətmək və LED modulunun bağlı sahəsinin görünmədiyindən əmin olmaq üçün köpük yuvarlaq bir çuxur qazılmışdır. Akrilik lövhədən açarın bağlandığı LED modulu bağlantısına qədər olan məsafə təxminən 1 sm olduğundan, 1 sm qalınlığında bir köpük istifadə edilmişdir.
Metal kvadrat çərçivə, ümumi çəki və tarazlığı qoruyarkən qurğunu vintlər və kabel bağları ilə birlikdə tutmaq üçün istifadə edilmişdir. Açıq əlaqələrin uzunluğu, istehsalçı çalışdıqdan daha çox olarsa, daha qalın lövhə səmərəsizdir və digər strukturlar tövsiyə olunur.
İstifadəçinin göz səviyyəsində təcrübəsini asanlaşdırmaq üçün tamamlanmış quraşdırma təxminən 2 m yüksəklikdə bir dayağa yerləşdirilir, lakin diqqətli olmaq lazımdır ki, quraşdırılmış LED modulunu açarla quraşdırmaq çox çətin olur, buna görə də bütün əlaqələr çıxarılmalıdır. Nərdivana qalxdıq və modulu dəstəyə sabitlənmiş quraşdırma ilə bağladıq.
Bütün bu prosesin ən vacib hissəsi, təcrübənin təhlükəsiz bir mühitdə mümkün olmasını təmin etmək üçün işin etibarlı və tam təhlükəsiz olmasını təmin etməkdir
Ümumilikdə 10 arduino və 50 LED modulu istifadə edildi və daha səmərəli və problemsiz çox tapşırıq üçün arduino başına beş LED modulu bağlandı. Ətraflı məlumat üçün əlavə plana baxın. Dizayn sxeminə görə tam keçiddən istifadə edərək Neopixel çox vəzifəli kodlaşdırma, növbəti addımda ətraflı müzakirə ediləcək.
Addım 5: Arduino Kodlaşdırma və Kablolama
Kablolama
- 4 -cü addımın sxeminə görə 50 modul birləşdirildi.
- Hər bir modul çoxlu tapşırıqları yerinə yetirmək və aydın bir əlaqə təmin etmək üçün 50 moduldan ibarət 10 dəstə bölünmüşdür.
- Yuxarıdakı 1 şəkilində göstərildiyi kimi, beş modul tək bir arduinoya bağlandı və 5V neopixel pinləri bir anda bağlandı və enerji təchizatı bağlandı.
- Neopiksellərin və açarların GND -ləri də bir -birinə bağlandı və qəbulu asanlaşdırmaq üçün açarlar 2, 3, 4, 5, 6 sancaqlarına və neopiksellər 9, 10, 11, 12, 13 sancaqlarına bağlandı..
- Anahtarlar və neopiksellər sırasıyla 2-9, 3-10, 4-11, 5-12, 6-13 yollarla birləşdirildi.
- Xatırladaq ki, xətlərin əlaqələri mürəkkəb olduğundan və qısa qapanma nəticəsində yanğın təhlükəsi yarandığından zəif hissələrin qırılmaması üçün büzülən borunun qızdırıldığı bildirilir.
Açma açarı olan Neopixel çox vəzifəli kodlaşdırma
5 yüngül animasiya (Yağış tipi, Duş tipi, Qığılcımlı ildırım növü, Pop növü, Düzensiz tip)
#daxil edin
/*사용 하고자 하는 패턴 을 추가 함*/
enum nümunəsi {NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, TWINKLE, STAR, RAINBOWSPARKLE, METEOR, LIGHT, BLOSSOM}; /*네오 픽셀 을 방향 을 설정 함*/ enum istiqaməti {İLƏ, REVERSE};
/*패턴 의 클래스 를 입력 함*/
sinif NeoPatterns: ictimai Adafruit_NeoPixel { /* /*클레스 함수 에 패턴 의 방향 을 입력*/ istiqamət İstiqamət;
/*변수 Aralıq 을 추가*/ işarəsiz uzun Aralıq; /*변수 lastUpdate 를 추가*/ unsigned long lastUpdate; /*변수 Rəng1, Rəng2 를 추가*/ uint32_t Rəng1, Rəng2; /*변수 TotalSteps 를 추가*/ uint16_t TotalSteps; /*변수 İndeks 를 추가*/ uint16_t İndeksi;
/*패턴 을 완료 했을 시 다시 불러오는 함수*/ void (*OnComplete) (); /*네오 패턴 에서 네오 픽샐 픽샐 갯수 핀, 핀 번호, 타입, 타입 을 불러오는 함수*/ NeoPatterns (uint16_t piksel, uint8_t pin, uint8_t növü, void (*geri çağırma) ()): Adafruit_NeoPixel (piksel, pin, tip) { OnComplete = geri zəng; }
/*패턴 을 업데이트 하기 위한 케이스 구문*/
void Update () { /*패턴 의 시간 설정. 멀티 태스킹 을 구현 하는/*/ if ((millis () - lastUpdate)> Interval) {lastUpdate = millis (); /*ActivePattern 의 스위치 구문*/ switch (ActivePattern) {/*case RAINBOW_CYCLE 에서는 RainbowCycleUpdate 를 실행 하라*/ case RAINBOW_CYCLE: RainbowCycleUpdate (); /*hal RAINBOW_CYCLE 에서 나와라*/ break;
/*case THEATER_CHASE 에서는 TheaterChaseUpdate 를 실행 하라*/
case THEATER_CHASE: TheaterChaseUpdate (); /*case THEATER_CHASE 에서 나와라*/ break;
/*halda COLOR_WIPE 에서는 ColorWipeUpdate 를 실행 하라*/
hal COLOR_WIPE: ColorWipeUpdate (); /*hal COLOR_WIPE 에서 나와라*/ break; /*case SCANNER 에서는 ScannerUpdate 를 실행 하라*/ case SCANNER: ScannerUpdate (); /*case SCANNER 에서 나와라*/ break;
/*case FADE 에서는 FadeUpdate 를 실행 하라*/
FADE işi: FadeUpdate (); /*case FADE 에서 나와라*/ break;
/*dava TWINKLE 에서는 TwinkleUpdate 를 실행 하라*/
dava TWINKLE: TwinkleUpdate (); /*case TWINKLE 에서 나와라*/ break;
/*Case STAR 에서는 StarUpdate 를 실행 하라*/
hal STAR: StarUpdate (); /*halda STAR 에서 나와라*/ break;
/*hal RAINBOWSPARKLE 에서는 RainbowsparkleUpdate 를 실행 하라*/
hal RAINBOWSPARKLE: RainbowsparkleUpdate (); /*hal RAINBOWSPARKLE 에서 나와라*/ break; /*case METEOR 에서는 MeteorUpdate 를 실행 하라*/ case METEOR: MeteorUpdate (); /*case METEOR 에서 나와라*/ break;
/*case LIGHT 에서는 LightUpdate 를 실행 하라*/
işığın işığı: LightUpdate (); /*halda İŞIQ 에서 나와라*/ fasilə;
/*hal BLOSSOM 에서는 BlossomUpdate 를 실행 하라*/
hal BLOSSOM: BlossomUpdate (); /*hal BLOSSOM 에서 나와라*/ break; }}}
/*패턴 의 방향 을 설정 하는 구문*/
/*İndeks 를 증가 시키고 초기화 하는 함수*/
void Artım () { /*만약 정방향 이면 인덱스 를 시켜라 / / / / / / / / if if if if if if if if if if if if if if if if if if if if if if if if if if /*만약 인덱스 가 전체 네오 픽셀 구동 갯수 같 거나 거나 많다 0 으로 초기화 시켜라*/ if (Index> = TotalSteps) {İndeks = 0; /*패턴 을 완료 시키는 함수*/ if (OnComplete! = NULL) {OnComplete (); }}}
/*만약 정방향 이 아니면 인덱스 를 감소 시켜라*/ else {--Index; /*만약 인덱스 가 전체 네오 픽셀 구동 갯수 와 같 거나 다면 전체 구동 갯수 에서 1 을 빼라*/ if (İndeks <= 0) {İndeks = TotalSteps - 1; /*패턴 을 완료 시키는 함수*/ if (OnComplete! = NULL) {OnComplete (); }}}}
/*반대 방향 으로 움직이게 하는 함수*/
void Reverse () { /*애니메이션 함수 에 Ters 를 썼을 시, 만약 방향 이 정방향 이면* / if (İstiqamət == İLƏ) { /*방향 은 그 와 반대 이며 전체 구동 갯수 에서 1 일 빼라* / Direction = REVERSE; İndeks = TotalSteps - 1; } /*그 외의 방향 이 정방향 이면 인덱스 를 0 으로 설정 해라* / else {Direction = FORWARD; İndeks = 0; }}
/*애니메이션 을 설정 하는 함수 들 들*
*RainbowCycle 의 시간 과 방향 을 입력*/
boş RainbowCycle (uint8_t interval, istiqamət dir = İLƏ) { /*실행 되는 패턴 은 RainbowCycle 임* / ActivePattern = RAINBOW_CYCLE; /*시간 은 void RainbowCycle () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*총 구동 갯수 는 255 임*/ TotalSteps = 255; /*인덱스 는 0 으로 설정 함*/ İndeks = 0; /*방향 은 void RainbowCycle () 안에 입력 되는 dir = İLƏ 과 같음*/ Yön = dir; }
/*RainbowCycle 를 업데이트 했을 경우*/
void RainbowCycleUpdate () { /*변수 i 가 네오 픽셀 개수 보다 작 으면 를 를 시켜라* /for (int i = 0; i <numPixels (); i ++) { /*변수 i 가 증가 함 과 동시에 RGB 의 무지개 해라 로 변화 작동 작동 / * / setPixelColor (i, Təkər (((i * 256 / numPixels ()) + İndeks) & 255)); } / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
/*TheaterChase 의 컬러 와 시간 방향 을 입력*/
void TheaterChase (uint32_t color1, uint32_t color2, uint8_t interval, istiqamət dir = İLƏ) { /*실행 되는 패턴 은 RTHEATER_CHASE* / ActivePattern = THEATER_CHASE; /*시간 은 void TheaterChase () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*총 구동 갯수 는 numPixels 갯수 임*/ TotalSteps = numPixels (); /*컬러 1, 2 를 설정*/ Color1 = color1; Rəng2 = rəng2; /*인덱스 는 0 으로 설정 함*/ İndeks = 0; /*방향 은 void TheaterChase () 안에 입력 되는 dir = İLƏ 과 같음*/ Yön = dir; }
/*TheatreChase 를 업데이트 했을 경우*/
void TheaterChaseUpdate () { /*변수 i 가 네오 픽셀 개수 보다 작 으면 i 를 증가* /for (int i = 0; i <numPixels (); i ++) { /*만약 변수 i 에 인덱스 를 더해서 3 으로 나눈 것이 0 과 같다 면 i 를 Rəng 로 변환 시켜라*/ if ((i + İndeks) % 3 == 0) {setPixelColor (i, Color1); } /*그렇지 않다면 i 를 Rəng 로 변환 시켜라* / else {setPixelColor (i, Color2); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
/*ColorWipe 의 컬러 와 시간 방향 을 입력/*/
boş ColorWipe (uint32_t rəng, uint8_t interval, istiqamət dir = İLƏ) { /*실행 되는 패턴 은 COLOR_WIPE* / ActivePattern = COLOR_WIPE; /*시간 은 void ColorWipe () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*총 구동 갯수 는 numPixels 갯수 임*/ TotalSteps = numPixels (); /*컬러 1 을 설정*/ Color1 = rəng; /*인덱스 는 0 으로 설정 함*/ İndeks = 0; /*방향 은 void ColorWipe () 안에 입력 되는 dir = İLƏ 과 같음*/ Yön = dir; }
/*ColorWipeUpdate 를 업데이트 했을 경우*/
void ColorWipeUpdate () { /*indeksi 1 로 변환 시켜라* / setPixelColor (İndeks, Rəng1); / *애니메이션 을 보여주는 함수 */ show (); Artım (); }
/*Skaner 의 컬러 와 시간 을 입력*/
boş Tarayıcı (uint32_t color1, uint8_t interval) { /*실행 되는 패턴 은 SCANNER* / ActivePattern = SCANNER; /*시간 은 void Scanner () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*구동 갯수 는 총 갯수 에서 1 을 빼고 2 를 곱 해라*/ TotalSteps = (numPixels () - 1)*2; /*컬러 1 을 설정*/ Color1 = color1; /*인덱스 는 0 으로 설정 함*/ İndeks = 0; }
/*ScannerUpdate 를 업데이트 했을 경우*/
void ScannerUpdate () { /*변수 i 는 영 이고 총 갯수 보다 작을 경우 i 를 증가* /for (int i = 0; i <numPixels (); i ++) { /*만약 변수 i 가 인덱스 같다 면 면 i 를 color1 로 변환 시켜라*/ if (i == İndeks) {setPixelColor (i, Color1); } / *그렇지 않다면 변수 i 를 전체 구동 갯수 에서 인덱스 를 뺀값 과 * / else if (i == TotalSteps - Index) {setPixelColor (i, Color1); } / *그 밖에는 i 를 디밍 시켜라 i 의 값 만큼 * / else {setPixelColor (i, DimColor (getPixelColor (i)))); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
/*Skaner 의 컬러 1, 2 와 스텝, 시간, 방향 을 입력*/
void Fade (uint32_t color1, uint32_t color2, uint16_t addımlar, uint8_t interval, istiqamət dir = İLƏ) { /*실행 되는 패턴 은 FADE* / ActivePattern = FADE; /*시간 은 void Fade () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*구동 갯수 는 스텝 값임 값임*/ TotalSteps = addımlar; /*컬러 1, 2 를 설정*/ Color1 = color1; Rəng2 = rəng2; /*인덱스 는 0 으로 설정 함*/ İndeks = 0; /*방향 은 void Fade () 안에 입력 되는 dir = İLƏ 과 같음*/ Yön = dir; } /*FadeUpdate 를 업데이트 했을 경우* / void FadeUpdate () { /*변수 red 값 은 다음 과 같음* / uint8_t red = ((Qırmızı (Rəng1)*(TotalSteps - İndeks)) + (Qırmızı (Rəng2)*İndeks)) / TotalSteps; / * 변수 yaşıl 값 은 다음 과 / * / uint8_t yaşıl = ((Yaşıl (Rəng1) * (TotalSteps - İndeks)) + (Yaşıl (Rəng2) * İndeks)) / TotalSteps; / * 변수 mavi 값 은 다음 과 / * / uint8_t blue = ((Mavi (Rəng1) * (TotalSteps - İndeks)) + (Mavi (Rəng2) * İndeks)) / TotalSteps; /*위 의 qırmızı, yaşıl, mavi 값 으로 컬러 를 셋팅 함*/ ColorSet (Rəng (qırmızı, yaşıl, mavi)); / *애니메이션 을 보여주는 함수 */ show (); Artım (); }
/*모든 네오 픽셀 을 끄는 구문*/
void alloff () { /*총 네오 픽셀 갯수 는 74 개 이며* / int NPIXEL = 74; /*변수 i 가 증가 하며 모든 네오 픽셀 의 컬러 값 을 0 으로 변환 함*/ for (int i = 0; i <NPIXEL; i ++) {setPixelColor (i, 0, 0, 0); }}
/*Twinkle 의 컬러 1 와 시간 을 입력*/
boş Twinkle (uint32_t color1, uint8_t interval) { /*실행 되는 패턴 은 TWINKLE* / ActivePattern = TWINKLE; /*시간 은 void Twinkle () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*컬러 1 를 설정*/ Color1 = color1; /*총 구동 갯수 는 numPixels 갯수 임*/ TotalSteps = numPixels (); İndeks = 0; }
/*TwinkleUpdate 를 업데이트 했을 경우*/
void TwinkleUpdate () { /*모든 네오 픽셀 의 컬러 컬러 0 으로 셋팅* / setAll (0, 0, 0); /*변수 Piksel 은 təsadüfi 74*/ int Piksel = təsadüfi (74); /*təsadüfi 74 개 에서 2 로나 눈 수 를 랜덤 하게 켜라*/setPixelColor (Pixel/2, 50, 100, 255); setPixelColor (Pixel, 250, 255, 250); setPixelColor (Piksel/2, 200, 250, 255); setPixelColor (Pixel, 255, 255, 255); setPixelColor (Pixel, 250, 230, 250); setPixelColor (Piksel/2, 150, 200, 255); / *애니메이션 을 보여주는 함수 */ show (); / *랜덤 하게 끄는 함수 */ setPixelColor (Piksel, 0, 0, 0); / *애니메이션 을 보여주는 함수 */ show (); Artım (); }
/*Ulduz 의 컬러 1 값 을 입력*/
boş ulduz (uint32_t color1) { /*실행 되는 패턴 은 STAR* / ActivePattern = STAR; /*시간 은 void Star () 안에 입력 되는 interval 과 같음*/ Interval = Interval; /*총 구동 갯수 는 numPixels 갯수 임*/ TotalSteps = numPixels (); /*컬러 1 을 설정*/ Color1 = color1; İndeks = 0; }
/*StarUpdate 를 업데이트 했을 경우*/
boş StarUpdate () { /*인덱스 와 컬러 를 셋팅* / setPixelColor (İndeks, Rəng1); göstərmək (); /*변수 i 가 0 이고 구동 갯수 보다 작 으면 i 를 감소 = 한칸 씩 이동 애니메이션*/ for (int i = 0; i <numPixels (); i--) {setPixelColor (i, Color (0, 0, 0)); } / *애니메이션 을 보여주는 함수 * / Artım (); }
/*Rainbowsparkle 의 시간 과 방향 을 입력*/
boş Rainbowsparkle (uint8_t interval, istiqamət dir = İLƏ) { /*실행 되는 패턴 은 RAINBOWSPARKLE* / ActivePattern = RAINBOWSPARKLE; /*시간 은 boş Rainbowsparkle () 안에 입력 되는 interval 과 같음*/ Interval = interval; /*총 구동 갯수 는 numPixels 갯수 임*/ TotalSteps = numPixels (); İndeks = 0; /*방향 은 boş Rainbowsparkle () 안에 입력 되는 istiqamət 과 같음*/ İstiqamət = 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 = təsadüfi (255); setPixelColor (i, c); } başqa {setPixelColor (i, təsadüfi (255)); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); } /*Meteor 의 시간 과 방향 을 입력* / void Meteor (uint32_t color1) { /*실행 되는 패턴 은 METEOR* / ActivePattern = METEOR; /*시간 설정*/ Aralıq = Aralıq; / *총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, *2 한 한 것과 같음 */ TotalSteps = (numPixels ()-1) *2; /*컬러 1 을 설정*/ Color1 = color1; İndeks = 0; }
/*MeteorUpdate 를 업데이트 했을 경우*/
void MeteorUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == Index) {setPixelColor (i, 100, təsadüfi (255), 255); } başqa {setPixelColor (i, DimColor (getPixelColor (i)))); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
/*İşıq 의 시간 과 방향 을 입력/*/
void Light (uint32_t color1) { /*실행 되는 패턴 은 LIGHT* / ActivePattern = LIGHT; /*시간 설정*/ Aralıq = Aralıq; / *총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, *2 한 한 것과 같음 */ TotalSteps = (numPixels ()-1) *2; /*컬러 1 을 설정*/ Color1 = color1; İndeks = 0; }
/*LightUpdate 를 업데이트 했을 경우*/
void LightUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == TotalSteps - Index) {setPixelColor (i, 150, təsadüfi (200), 40); } başqa {setPixelColor (i, DimColor (getPixelColor (i)))); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
/*Çiçək 의 시간 과 방향 을 입력*/
void Blossom (uint32_t color1) { /*실행 되는 패턴 은 BLOSSOM* / ActivePattern = BLOSSOM; /*시간 설정*/ Aralıq = Aralıq; / *총 구동 갯수 는 numPixels 갯수 에서 1 일뺀 후, *2 한 한 것과 같음 */ TotalSteps = (numPixels ()-1) *2; /*컬러 1 을 설정*/ Color1 = color1; İndeks = 0; }
/*BlossomUpdate 를 업데이트 했을 경우*/
voss BlossomUpdate () {for (int i = 0; i <numPixels (); i ++) {if (i == TotalSteps - Index) {setPixelColor (i, 255, təsadüfi (255), 100); } başqa {setPixelColor (i, DimColor (getPixelColor (i)))); }} / *애니메이션 을 보여주는 함수 * / show (); Artım (); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/ *네오 픽셀 의 켜지 는 위치 와 색 을 지정 해주는/ */ void setAll (bayt qırmızı, bayt yaşıl, mavi bayt) {for (int i = 0; i <numPixels (); i ++) {setPixelColor (i, qırmızı, yaşıl, mavi); } göstər (); }
/*네오 픽셀 의 디밍, 즉 밝기 를 조절 하는 함수*/
uint32_t DimColor (uint32_t rəng) {// R, G və B komponentlərini bir az sağa sürüşdürün uint32_t dimColor = Rəng (Qırmızı (rəng) >> 1, Yaşıl (rəng) >> 1, Mavi (rəng) >> 1); qaytarılması dimColor; }
/*모든 네오 픽셀 의 칼라 를 조절*/
etibarsız ColorSet (uint32_t color) {for (int i = 0; i <numPixels (); i ++) {setPixelColor (i, color); } göstər (); }
/*레드 값 을 불러 옴*/
uint8_t Qırmızı (uint32_t rəng) {qaytar (rəng >> 16) & 0xFF; } /*그린 값 을 불러 옴* / uint8_t Yaşıl (uint32_t rəng) {qaytar (rəng >> 8) & 0xFF; } /*블루 값 을 불러 옴* / uint8_t Mavi (uint32_t rəngi) {qaytarılma rəngi & 0xFF; }
/*Gökkuşağı 컬러 를 불러 옴*/
uint32_t Təkər (bayt WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return Color (255 - WheelPos * 3, 0, WheelPos * 3); } if if (WheelPos <170) {WheelPos -= 85; qaytarma Rəngi (0, WheelPos * 3, 255 - WheelPos * 3); } başqa {WheelPos -= 170; qaytarma Rəngi (WheelPos * 3, 255 - WheelPos * 3, 0); }}};
/*zolaq 을 불러 오기 위한 함수 /*사용 하는 스트립 별로 모두 지정 해주어야 함* /
boşluq zolağı1Complete (); boşluq zolağı2Complete (); boşluq zolağı3Complete (); boşluq zolağı4Complete (); boşluq zolağı5Complete ();
/*네오 픽셀 의 갯수 설정*/
#define NUMPIXELS 74 /*사용 하는 버튼 의 갯수 설정* / #define B_NUM 5 /*Import 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 zolağı5 (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] = {LOW, LOW, LOW, LOW, LOW}; /*2 번핀 부터 6 번핀 까지 버튼 카운터 를 초기화/*/ int buttonCounter [B_NUM] = {0, 0, 0, 0, 0}; /*2 번핀 부터 6 번핀 까지 최대 버튼 카운터 는 5 임*/ int düyməsi CounterMax = 5; /*모든 버튼 핀 을 읽 일수 있도록 변수/*/ int oxunması [B_NUM]; imzasız uzun lastDebounceTime [B_NUM] = {0, 0, 0, 0, 0}; /*모든 버튼 핀 을 읽는 읽는 간격 은 gecikmə50 과 같음*/ imzasız uzun debounceDelay = 50;
boş quraşdırma () {
/*복잡 하게 저항 연결 이 필요 없도록 인풋 풀업 방식 설정 설정 G: GND - 5V (Pin nömrəsinə qoşul)*/ 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(şerit1. Color(255, 0, 255), strip1. Color (255, 50, 0), 20, İLƏ);
}
/*버튼 카운터 변수 값 은 5 임*/
int sayğacı = 5; void loop () { /*버튼 수 보다 i 가 작 으면 i 를 증가 시키고* / for (int i = 0; i debounceDelay) {if (oxu ! = buttonState ) {buttonState = oxu ; buttonCounter ++; /*버튼 카운팅 이 위에서 한 한 Max 5 를 넘으면 0 으로 초기화 시켜라.*/ İf (buttonCounter > buttonCounterMax) buttonCounter = 0; }} lastButtonState = oxu ; } /*모든 스트립 을 업데이트 함.* / Strip1. Update (); zolaq 2. Yeniləmə (); zolaq 3. Yeniləmə (); zolaq 4. Yeniləmə (); zolaq 5. Yeniləmə ();
///// SWITCH_2 //////////////////////////////////////////// //////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
/*버튼 배열 의 0 번째 즉. 2 번핀 에 연결된 버튼 을 활용 하여 애니메이션 이 구동 되도록 하는 스위치 케이스 구문*/ keçid (buttonCounter [0]) {
/*첫번째 버튼 을 활동 시키면 구동 되는 애니메이션*/
hal 0: strip1. ActivePattern = BLOSSOM; /*해당 애니메이션 의 시간 을 설정*/ zolaq 1. Aralıq = 20; /*구동 되는 네오 픽셀 의 갯수 를 설정*/ strip1. TotalSteps = strip1.numPixels (); fasilə; /*두번째 버튼 을 활동 시키면 구동 되는 애니메이션*/ hal 1: strip1. ActivePattern = RAINBOWSPARKLE; zolaq 1. Aralıq = 50; strip1. TotalSteps = strip1.numPixels (); fasilə; /*세번째 버튼 을 활동 시키면 구동 되는 애니메이션*/ case 2: strip1. ActivePattern = SCANNER; zolaq 1. Aralıq = 10; strip1. TotalSteps = (strip1.numPixels () - 1) * 2; fasilə; /*네번째 버튼 을 활동 시키면 구동 되는 애니메이션*/ case 3: strip1. ActivePattern = TWINKLE; zolaq 1. Aralıq = 1; strip1. TotalSteps = strip1.numPixels (); fasilə; /*다섯 번째 버튼 을 활동 시키면 구동 되는 애니메이션*/ case 4: strip1. ActivePattern = METEOR; zolaq 1. Aralıq = 10; strip1. TotalSteps = strip1.numPixels (); fasilə; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);
///// SWITCH_3 //////////////////////////////////////////// //////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
keçid (buttonCounter [1]) {hal 0: strip2. ActivePattern = STAR; zolaq 2. Aralıq = 50; strip2. TotalSteps = strip2.numPixels (); fasilə; hal 1: strip2. ActivePattern = RAINBOWSPARKLE; zolaq 2. Aralıq = 100; strip2. TotalSteps = strip2.numPixels (); fasilə; hal 2: strip2. ActivePattern = SCANNER; zolaq 2. Aralıq = 20; strip2. TotalSteps = (strip2.numPixels () - 1) * 2; fasilə; hal 3: strip2. ActivePattern = TWINKLE; zolaq 2. Aralıq = 5; strip2. TotalSteps = strip2.numPixels (); fasilə; hal 4: strip2. ActivePattern = METEOR; zolaq 2. Aralıq = 40; strip2. TotalSteps = strip2.numPixels (); fasilə; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);
///// SWITCH_4 //////////////////////////////////////////// //////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
keçid (buttonCounter [2]) {hal 0: strip3. ActivePattern = STAR; zolaq 3. Aralıq = 50; strip3. TotalSteps = strip3.numPixels (); fasilə; hal 1: strip3. ActivePattern = RAINBOWSPARKLE; zolaq 3. Aralıq = 100; strip3. TotalSteps = strip3.numPixels (); fasilə; hal 2: strip3. ActivePattern = SCANNER; zolaq 3. Aralıq = 20; strip3. TotalSteps = (strip3.numPixels () - 1) * 2; fasilə; hal 3: strip3. ActivePattern = TWINKLE; zolaq 3. Aralıq = 5; strip3. TotalSteps = strip3.numPixels (); fasilə; hal 4: strip3. ActivePattern = METEOR; zolaq 3. Aralıq = 25; strip3. TotalSteps = strip3.numPixels (); fasilə; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);
///// SWITCH_5 //////////////////////////////////////////// //////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
keçid (buttonCounter [3]) {hal 0: strip4. ActivePattern = STAR; zolaq 4. Aralıq = 50; strip4. TotalSteps = strip4.numPixels (); fasilə; hal 1: strip4. ActivePattern = RAINBOWSPARKLE; zolaq 4. Aralıq = 100; strip4. TotalSteps = strip4.numPixels (); fasilə; hal 2: strip4. ActivePattern = SCANNER; zolaq 4. Aralıq = 20; strip4. TotalSteps = (strip4.numPixels () - 1) * 2; fasilə; hal 3: strip4. ActivePattern = TWINKLE; zolaq 4. Aralıq = 5; strip4. TotalSteps = strip4.numPixels (); fasilə; hal 4: strip4. ActivePattern = METEOR; zolaq 4. Aralıq = 25; strip4. TotalSteps = strip4.numPixels (); fasilə; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]);
///// SWITCH_6 //////////////////////////////////////////// //////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
keçid (buttonCounter [4]) {hal 0: strip5. ActivePattern = STAR; zolaq 5. Aralıq = 50; strip5. TotalSteps = strip5.numPixels (); fasilə; hal 1: strip5. ActivePattern = RAINBOWSPARKLE; zolaq 5. Aralıq = 100; strip5. TotalSteps = strip5.numPixels (); fasilə; hal 2: strip5. ActivePattern = SCANNER; zolaq 5. Aralıq = 20; strip5. TotalSteps = (strip5.numPixels () - 1) * 2; fasilə; hal 3: strip5. ActivePattern = TWINKLE; zolaq 5. Aralıq = 5; strip5. TotalSteps = strip5.numPixels (); fasilə; hal 4: strip5. ActivePattern = METEOR; zolaq 5. Aralıq = 25; strip5. TotalSteps = strip5.numPixels (); fasilə; } Serial.print (buttonCounter [0]); Serial.print (","); Serial.println (buttonCounter [1]); }
// strip1 Tamamlanması Geri Zəng
void strip1Complete () {strip1. Color1 = strip1. Təkər (təsadüfi (255)); strip1. Color2 = strip1. Təkər (təsadüfi (255)); zolaq 1. İndeks = 0; }
// strip2 Tamamlanması Geri Zəng
void strip2Complete () {strip2. Color1 = strip2. Təkər (təsadüfi (255)); strip2. Color2 = strip2. Təkər (təsadüfi (255)); zolaq2. İndeks = 0; }
// strip3 Tamamlanması Geri Zəng
void strip3Complete () {strip3. Color1 = strip3. Təkər (təsadüfi (255)); strip3. Color2 = strip3. Təkər (təsadüfi (255)); zolaq 3. İndeks = 0; }
// strip4 Tamamlanması Geri Zəng
void strip4Complete () {strip4. Color1 = strip4. Təkər (təsadüfi (255)); strip4. Color2 = strip4. Təkər (təsadüfi (255)); zolaq 4. İndeks = 0; }
// strip5 Tamamlanması Geri Zəng
void strip5Complete () {strip5. Color1 = strip5. Təkər (təsadüfi (255)); zolaq 5. Rəng2 = zolaq 5. Təkər (təsadüfi (255)); zolaq 5. İndeks = 0; }
Addım 6: Nəticə və Film çəkmək
Layihəmizə maraq göstərmədiyiniz üçün təşəkkür edirik.
Tövsiyə:
ESP32-CAM Şəkillər çəkin və SPIFF Yaddaşından istifadə edərək E-poçtla Göndərin. -- SD karta ehtiyac yoxdur: 4 addım
ESP32-CAM Şəkillər çəkin və SPIFF Yaddaşından istifadə edərək E-poçtla Göndərin. || SD Karta ehtiyac yoxdur: Salam millət, ESP32-CAM lövhəsi, ESP32-S çipi, OV2640 kamerası, ətraf cihazları birləşdirmək üçün bir neçə GPIO və microSD kart yuvasını birləşdirən aşağı qiymətli bir inkişaf etdirmə lövhəsidir. Video axını veb serverindən bir sıra tətbiqetmələrə malikdir
Uno ilə ESP8266 WeMos D1 R1 Wifi Prosessoru istifadə edərək ESP32-Cam ilə Şəkillər çəkin və göndərin: 7 addım
Uno ilə ESP8266 WeMos D1 R1 Wifi Prosessorundan istifadə edərək ESP32-Kamera ilə Şəkillər çəkin və göndərin: Uno ilə ESP8266 WeMos D1 R1 WiFI Prosessoru istifadə edərək ESP32-Cam (OV2640) istifadə edərək şəkil çəkin və e-poçtla göndərin, Google Diskə qeyd edin və göndərin Twilio istifadə edən Whatsapp.Tələblər: Uno ilə ESP8266 WeMos D1 R1 WiFI Prosessoru (https: // protosupplies
Xüsusi İşıq Paneli PCB -lərindən istifadə edərək Çox Parlaq Velosiped İşığı: 8 Addım (Şəkillərlə)
Xüsusi İşıq Paneli PC -lərindən istifadə edərək Çox Parlaq Velosiped İşığı: Velosipediniz varsa, təkərlərinizdə və bədəninizdə nə qədər xoşagəlməz çuxurların ola biləcəyini bilirsiniz. Təkərlərimi partlatmaq üçün kifayət qədər gücüm var idi, buna görə də velosiped işığı kimi istifadə etmək üçün özümün LED panelimi hazırlamaq qərarına gəldim. E olmağa yönəlmiş biri
Eagle3D və POV-Ray istifadə edərək PCB-lərinizin 3D şəkillərini çəkin: 5 addım (şəkillərlə)
Eagle3D və POV-Ray istifadə edərək PCB-lərinizin 3D Şəkillərini göstərin: Eagle3D və POV-Ray istifadə edərək, PCB-lərinizin real 3D görünüşlərini edə bilərsiniz. Eagle3D, EAGLE Layout Redaktoru üçün bir skriptdir. Bu, POV-Ray-ə göndəriləcək bir şüa izləmə faylı yaradacaq və bu da nəticədə yekunlaşdırılmış imi çıxaracaq
Quicktime Player -dən istifadə edərək videoları geriyə çəkin: 5 addım
Quicktime Player -dən istifadə edərək videoları geriyə çəkin: Bu, əsrin ən dəhşətli hiyləsidir. Bu Təlimat sizə təhlükəli proqramlar yükləmədən videoları geriyə çəkməyin asan yolunu göstərir (sürətli vaxtınız yoxdursa buna ehtiyacınız olacaq.) Şəklin heç bir əlaqəsi yoxdur. Layihə ilə məşğul olun, amma ehtiyacım var