Mündəricat:

Dot Light Pattern: 6 addım
Dot Light Pattern: 6 addım

Video: Dot Light Pattern: 6 addım

Video: Dot Light Pattern: 6 addım
Video: Бесшовные следки на 2-х спицах с красивой регланной линией. Подробный мастер класс ДЛЯ НАЧИНАЮЩИХ. 2024, Iyul
Anonim
Image
Image
Dot İşıq Nümunəsi
Dot İşıq Nümunəsi
Dot İşıq Nümunəsi
Dot İşıq Nümunəsi

"İşığı öz əlimlə idarə edə bilərəmmi və öz iradəmi ifadə edə bilərəmmi" fikri ilə başladım.

Öz rənglərinizi özünüz yaratmağa, o rənglərlə öz naxışlarınızı dizayn etməyə və müxtəlif animasiya effektləri yaşamağa imkan verən 'Dot Light Pattern' dir.

Addım 1: Materiallar

Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
  1. Arduino UNO x 13
  2. WS2901 və ya WS2811 piksel LED şeridi (130 LED)
  3. Düymə açarı x 1
  4. Keçid açarı x 65
  5. Potensial ölçən x 65
  6. Göy qurşağı kabeli
  7. SMPS -in gücü kifayətdir
  8. Dirijor kabeli
  9. Akrilik şəffaf yuvarlaq çubuq (diametri 30 mm)
  10. Qara rəngli Akril lövhə (5T) (500mm*790mm) x 2, (500mm*35mm) x 2, (790mm*35mm) x 2

Addım 2: Tikinti Planı

Tikinti Planı
Tikinti Planı
Tikinti Planı
Tikinti Planı
Tikinti Planı
Tikinti Planı
Tikinti Planı
Tikinti Planı

Addım 3: Hardware: Circuit Design

Avadanlıq: Dövrə Dizaynı
Avadanlıq: Dövrə Dizaynı
Avadanlıq: Dövrə Dizaynı
Avadanlıq: Dövrə Dizaynı
Avadanlıq: Dövrə Dizaynı
Avadanlıq: Dövrə Dizaynı
  1. Akril lövhəni yuxarıdakı quruluş kimi kəsin. (addım 2 -ə baxın)

  2. Potensialölçən çuxurun yuxarı və aşağı hissəsinə bir ədəd neo-piksel LED qoyulur və cəmi 65 cüt neo-piksel LED bağlanır.
  3. Bir cüt neo-piksel LED tək Arduino pinini yaratmaq üçün bir araya gətirilir.
  4. Potensial ölçmə deliklərinə 65 potensial ölçmə cihazı yerləşdirin. (Neo-pikselli bir səthin əks tərəfinə qoyun.)
  5. Keçid deliklərinə uyğun olmaq üçün 65 keçid bağlayın.
  6. Bir Arduino UNO -ya beş ədəd 65 ədəd aparat bağlamaq üçün on üç zonanın hər birinə cəmi on üç Arduino UNO bağlanmışdır.
  7. Əlavə edilmiş fotoşəkildə göstərildiyi kimi, potensial ölçmə cihazlarını, açar açarları və neo-piksel LED-ləri Arduino UNO-nun pinlərinə tellə bağlayın. (addım 2 -ə baxın)
  8. Bir neçə Arduino UNO -nun GND və 5V pinləri kabel tellərinə toplanır, sonra xarici gücə qoşulur. (addım 2 -ə baxın)
  9. Hava təzyiqi ilə tozları çıxarın.

Addım 4: Avadanlıq: Akril Kəsmə

Avadanlıq: Akril Kəsmə
Avadanlıq: Akril Kəsmə
Avadanlıq: Akril Kəsmə
Avadanlıq: Akril Kəsmə
Avadanlıq: Akril Kəsmə
Avadanlıq: Akril Kəsmə
  1. Akrilik çubuğu 50 mm uzunluğunda kəsin.

  2. Akrilik çubuğun bir tərəfi potensialölçənin nəzarətçi hissəsinə uyğun olması üçün ölçü və dərinliyə qədər qazılır.
  3. Akrilik çubuq, potensial ölçmə cihazına yaxşı uyğunlaşa bilən bir boşluq üçün çuxurdan bir qədər geniş kəsilmişdir.
  4. İşığın səliqəli şəkildə ötürülməsi üçün qarşı tərəf bir az zımpara verir.

Addım 5: Arduino Proqramlaşdırma Kodu

www.kasperkamperman.com/blog/arduino/ardui…

'hsb to rgb' kodu 를 참고 한 사이트

#daxil edin

// 'adafruit_neopixel' 헤더 파일 라는 외부 라이브러리 를 를 포함

// 네오 픽셀 연결 핀 번호 선언

#PIN1 təyin edin 2 #PIN2 təyin edin 3 #PIN3 təyin edin 4 #PIN4 təyin edin 5 #PIN5 təyin edin 6

#define NUMPIXELS 2 // LED 갯수

#NUM_LIGHTS 5 təyin edin // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)

// 네오 픽셀 오브젝트 Array 선언

Adafruit_NeoPixel piksel = {Adafruit_NeoPixel (NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800) Adafruit_NeoPixel (NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800) Adafruit_NeoPixel (NUMPIXELS, PIN3, NEO_GRB + NEO_KHZ800) Adafruit_NeoPixel (NUMPIXELS, PIN4, NEO_GRB + NEO_KHZ800) Adafruit_NeoPixel (NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800)}; //// 네오 픽셀 을 사용 하기 위해 객체 하나 하나 다 한 다. // 첫번째 인자 값 은 네오 픽셀 의 LED 의 개수 // 두번째 값 은 네오 픽셀 이 연결된 이노 의 핀 핀 번호 세번째 세번째 바뀌는 값 네오 픽셀 바뀌는 바뀌는 바뀌는 바뀌는 바뀌는 바뀌는

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

////// HSV 를 RGB 로 변환 하는 함수 getRGB () 를 위한 변수 와 함수 선언

const bayt dim_curve = {

0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 105, 107, 109, 110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144, 146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190, 193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255, }; //

etibarsız getRGB (int hue, int sat, int val, int colors [5] [3], int index) {

val = dim_curve [val]; sat = 255 - dim_curve [255 - oturdu];

// HSB, HSB /HSV və ya RGB

// dim_curve 는 밝기 값 및 채도 (반전) 에서만 사용 됩니다. // 이것은 가장 자연스럽게 보입니다.

int r;

int g; int b; int bazası;

əgər (oturdu == 0) {

rənglər [indeks] [0] = dəyər; rənglər [indeks] [1] = val; rənglər [indeks] [2] = val; } başqa {

baz = ((255 - sat) * val) >> 8;

keçid (rəng / 60) {

hal 0: r = val; g = (((val - əsas) * rəng) / 60) + əsas; b = əsas; fasilə;

hal 1:

r = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; g = dəyər; b = əsas; fasilə;

hal 2:

r = əsas; g = dəyər; b = (((val - əsas) * (ton % 60)) / 60) + əsas; fasilə;

hal 3:

r = əsas; g = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; b = dəyər; fasilə;

hal 4:

r = (((val - əsas) * (ton % 60)) / 60) + əsas; g = əsas; b = dəyər; fasilə;

hal 5:

r = val; g = əsas; b = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; fasilə; }

rənglər [indeks] [0] = r;

rənglər [indeks] [1] = g; rənglər [indeks] [2] = b; }

}

int rgb_colors [NUM_LIGHTS] [3]; // 네오 픽셀 오브젝트 갯수 마다 rgb rəngi 선언

int hue [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 hue 선언 int oturdu [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 밝기 밝기 서언

// 일반 변수 선언

int startSwitch = {8, 9, 10, 11, 12}; // on/off ole 핀 번호 boolean startState = {yalan, yalan, yalan, yalan, yalan}; // aç/söndür 상태 변수

const int colorPin = {A0, A1, A2, A3, A4}; // 가변 저항 핀 번호

int colorVal = {0, 0, 0, 0, 0}; // 가변 저항 초기 값

int animationButton = 7; // 애니메이션 모드 변환 버튼 핀 번호

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 선언 // 디 바운싱? Button 시간 내 많은 이벤트 가 발생 하는것 대 문제 문제 에 해결 으로 으로 해결 button button // last 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 로 로 로 işarəsiz uzun lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 imzasız uzun debounceDelay = 50; // 디 바운싱 타임 설정; 출력 이 깜빡 이면 증가 한 다 int MODE = 0; // 애니메이션 모드 변수

int B_Interval [5]; // 블 링킹 을 위한 각 모듈 의 랜덤 속도 변수

int B_Min = 100; // 블 링킹 최단 속도; int B_Max = 500; // 블 링킹 최장 속도; int R_Interval = 50; // 레인보우 애니메이션 속도 변수 int D_Interval = 10; // 디밍 속도 변수

boolean B_state [5]; // 블 링킹 을 위한 각 모듈 의 상태 변수

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

// 멀티 테스 킹 애니메이션 을 위한 시간 변수 선언

imzasız uzun cari Milis; // 현재 시간 변수

imzasız uzun B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 işarəsiz uzun DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) işarəsiz uzun R_previousMillis; // 레인보우 타이머 imzasız uzun D_previousMillis; // 디밍 타이머

boolean firstRainbow = doğru; // 레인보우 색상 초기화 상태 변수

int RainbowSpeed; // 레인보우 변환 변수

int Bright = 100; // Br 초기 값 int BrightnessFactor = 1; // 디밍 증감 값 ///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////

boş quraşdırma () {

for (int i = 0; i <NUM_LIGHTS; i ++) {piksel .begin (); // 네오 픽셀 오브젝트 초기화}

// 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startSwitch , INPUT_PULLUP); // aç/söndür 버튼 인풋 설정} pinMode (animasiyaButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {B_Interval = int (təsadüfi (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}

Serial.begin (9600); // 통신 설정

}

boşluq döngəsi () {

MODE = CheckAnimMode (); // 모드 에 애니메이션 체크 모드 모드 함수 를 넣는다

// 버튼 과 가변 저항 을 값 읽 읽 읽 읽 읽 에 다 한다.

for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startSwitch ); // aç/söndür 버튼 에서 읽은 값 의 반대 값 startState 에 넣어 준다 // startState = digitalRead (startSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 초기 에 에 넣는다}

keçid (MODE) {// 애니메이션 함수 스위치 문

halda 0: on (); // on 함수 실행 fasilə; // 조건문 에서 빠져 나가라

hal 1:

göy qurşağı (); // göy qurşağı 함수 실행 qırılma;

hal 2:

karartma (); // karartma 함수 실행 qırılma;

hal 3:

yanıb -sönən (); // yanıb -sönən 함수 실행 qırılma; }

for (int i = 0; i <NUM_LIGHTS; i ++) {piksel .show (); // 네오 픽셀 오브젝트 배열 켜라}

}

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

int CheckAnimMode () {

// 애니메이션 선택 버튼 을 읽어 모드 를 결정 한다.

//////////////////////////////////////////////////// /// currentMillis = milis (); // oxu int oxu = digitalRead (animationButton); if (oxu! = lastButtonState) {// 입력 핀 으로부터 이전 의 버튼 의 상태 상태 비교 비교 D lastDebounceTime = millis (); // 현재 시간 을 출력 핀 이 마지막 으로 전환 전환 된 시간 에 넣음}

if ((currentMillis - lastDebounceTime)> debounceDelay) {

əgər (oxu! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 값 값 과 비교

buttonState = oxu; // 판독 값 을 düyməsiDövlət 에 대입

əgər (buttonState == LOW) {// 버튼 상태 가 꺼져 있다면

MODE ++; // 버튼 모드 1 씩 증가 əgər (MODE> 3) {MODE = 0; firstRainbow = doğru; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 Parlaq = 15; // 밝기 는 15}}}}

lastButtonState = oxu; // 판독 값 을 이전 의 의 버튼 상태 에 대입

MODE qayıt; 함수 를 종료 하고 rejimi 함수 로 값 을 리턴 하라}

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

// animasiya rejimi funksiyası

// haqqında

void on () {Serial.println ("on"); // 시리얼 모니터 에 üçün int 써라 (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅}}

// Göy qurşağı

boş göy qurşağı () {Serial.println ("yağış"); // 시리얼 모니터 에 yağış 을 써라 if (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = yalan; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - R_previousMillis> R_Interval) {// 흐른 시간 값 이 레인보우 인터벌 값 보다 크면 R_previousMillis = currentMillis; // Göy qurşağı sürəti += 10; // 레인보우 변환 변수 에 10 을 더해라}

for (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, (colorVal +RainbowSpeed) % 1023); // 레인보우 컬러 셋팅}

}

// Qaranlıq

boşluq qaralması () {Serial.println ("dimm"); // 시리얼 모니터 에 dimm 을 써라 Serial.println (Parlaq); // 시리얼 모니터 에 Parlaq 를 써라 if (currentMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 값 보다 크면 D_previousMillis = currentMillis; // Parlaq += Parlaqlıq Faktoru; // 밝기 에 디밍 증감 값 1 씩 올려라} if (Bright 254) {BrightnessFactor = -1 * BrightnessFactor; } Parlaq = məhdudlaşdır (Parlaq, 99, 254); // 변수 밝기 값 을 최소값 99 ~ 254 사이 의 값 으로 한으로 한다

for (int i = 0; i <NUM_LIGHTS; i ++) {dim_color_set (i, Bright); // 디밍 컬러 셋팅}}

// yanıb -sönən

boş göz qırpmaq () {Serial.println ("yanıb sönmək"); // 시리얼 모니터 에 göz qırpmaq 를 써라

üçün (int i = 0; i B_Interval ) {// 흐른 시간 값 이 블링크 인터벌 인터벌 값 보다 크면

B_previousMillis = currentMillis; // 현재 시간 을 이전 의 블링크 시간 에 넣어 라 B_state =! B_state ; // 각 모듈 블 링킹 링킹 상태 변수 의 값 의 반대 값 대입 하라}} for (int i = 0; i <NUM_LIGHTS; i ++) {if (B_state ) {// 모듈 의 블 링킹 상태 가 읽 히면 color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅} başqa {noColor_set (i); // 읽히지 않으면 컬러 셋팅 하지 않음 않음}}

}

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

// əsas funksiya

// rəng dəsti

void color_set (int indeksi, int colorSenser) {

if (startState [index]) {hue [index] = map (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 을 0 ~ 359 값 으로 한 한 값 을 color 색상 값 color (colorSenser 에) getRGB (rəng [indeks], 255, 255, rgb_colors, indeks); for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [indeks]. Rəng (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} başqa noColor_set (indeks); // 컬러 셋팅 하지 않음}

////// noRəng dəsti

etibarsız noColor_set (int indeksi) {// 컬러 셋팅 하지 않는 함수 설정

for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [index]. Rəng (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}

//// dimColor dəsti

etibarsız dim_color_set (int indeksi, int BC) {// 디밍 컬러 셋팅 함수 설정

if (startState [index]) {hue [index] = map (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 을 0 ~ 359 값 으로 한 한 값 을 color 색상 값 color color (colorVal 에) getRGB (hue [index], 255, BC, rgb_colors, index); for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [indeks]. Rəng (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} başqa noColor_set (indeks); // 컬러 셋팅 하지 않음}

Addım 6: Bitmiş bir görünüş

Tövsiyə: