Obsah:

Bodový světelný vzor: 6 kroků
Bodový světelný vzor: 6 kroků

Video: Bodový světelný vzor: 6 kroků

Video: Bodový světelný vzor: 6 kroků
Video: 1. Q Light Controller + Začínáme s QLC +. Přístroje a funkce 2024, Červenec
Anonim
Image
Image
Bodový světelný vzor
Bodový světelný vzor
Bodový světelný vzor
Bodový světelný vzor

Začal jsem s myšlenkou „Mohu ovládat světlo vlastníma rukama a projevovat vlastní vůli?“

Jedná se o 'Dot Light Pattern', který vám umožňuje vytvářet vlastní barvy sami, navrhovat vlastní vzory s těmito barvami a zažít různé efekty animace.

Krok 1: Materiály

Materiály
Materiály
Materiály
Materiály
Materiály
Materiály
Materiály
Materiály
  1. Arduino UNO x 13
  2. Pixelový LED pás WS2901 nebo WS2811 (130 LED)
  3. Tlačítkový spínač x 1
  4. Zapínací spínač x 65
  5. Potenciometr x 65
  6. Duhový kabel
  7. Dostatečně výkonné SMPS
  8. Vodičový kabel
  9. Akrylová průhledná kulatá tyč (průměr 30 mm)
  10. Akrylová deska černé barvy (5T) (500 mm*790 mm) x 2, (500 mm*35 mm) x 2, (790 mm*35 mm) x 2

Krok 2: Stavební plán

Stavební plán
Stavební plán
Stavební plán
Stavební plán
Stavební plán
Stavební plán
Stavební plán
Stavební plán

Krok 3: Hardware: Návrh obvodu

Hardware: Návrh obvodu
Hardware: Návrh obvodu
Hardware: Návrh obvodu
Hardware: Návrh obvodu
Hardware: Návrh obvodu
Hardware: Návrh obvodu
  1. Odřízněte akrylovou desku jako výše uvedená struktura. (viz krok 2)

  2. Jeden kus neo-pixelové LED diody je umístěn na horní a spodní část otvoru potenciometru a je připojeno celkem 65 párů neo-pixelových LED.
  3. Dvojice neo-pixelových LED diod je spojena dohromady a tvoří jeden pin Arduino.
  4. Do otvorů potenciometru nasaďte 65 potenciometrů. (Umístěte jej na opačnou stranu neo-pixelového povrchu.)
  5. Připojte 65 západkových spínačů tak, aby odpovídaly otvorům pro spínače.
  6. Ke každé ze třinácti zón je připojeno celkem třináct Arduino UNO, aby bylo možné spojit pět kusů 65 kusů hardwaru do jednoho Arduino UNO.
  7. Jak je znázorněno na přiložené fotografii, připojte potenciometry, zapínací spínače a neo-pixelové LED k pinům Arduino UNO pomocí drátu. (viz krok 2)
  8. Piny GND a 5V několika Arduino UNO jsou shromažďovány do kabelových vodičů a poté připojeny k externímu napájení. (viz krok 2)
  9. Odstraňte prach tlakem vzduchu.

Krok 4: Hardware: Řezání akrylem

Hardware: Řezání akrylem
Hardware: Řezání akrylem
Hardware: Řezání akrylem
Hardware: Řezání akrylem
Hardware: Řezání akrylem
Hardware: Řezání akrylem
  1. Odřízněte akrylovou tyč na délku 50 mm.

  2. Jedna strana akrylové tyče je vyvrtána do velikosti a hloubky, aby odpovídala řídicí části potenciometru.
  3. Akrylová tyč je oříznuta o něco širší než otvor pro vůli, která se dobře vejde do potenciometru.
  4. Na druhé straně je malý brusný papír, aby bylo možné úhledně přenášet světlo.

Krok 5: Programovací kód Arduino

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

Kód 'hsb to rgb' 를 참고 한 사이트

#zahrnout

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

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

#define PIN1 2 #define PIN2 3 #define PIN3 4 #define PIN4 5 #define PIN5 6

#define NUMPIXELS 2 // 네오 픽셀 LED 갯수

#define NUM_LIGHTS 5 // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)

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

Adafruit_NeoPixel pixelů = {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 () 를 위한 변수 와 함수 선언

konstantní bajt 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, }; //

void getRGB (int odstín, int sat, int val, int barvy [5] [3], int index) {

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

// 색조, 채도 및 밝기 (HSB /HSV) 를 RGB 로 변환

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

int r;

int g; int b; int základna;

if (sat == 0) {

barvy [index] [0] = val; barvy [index] [1] = val; barvy [index] [2] = val; } else {

základ = ((255 - sat) * val) >> 8;

přepínač (odstín / 60) {

případ 0: r = val; g = (((val - báze) * odstín) / 60) + báze; b = základna; přestávka;

případ 1:

r = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; g = val; b = základna; přestávka;

případ 2:

r = základ; g = val; b = (((val - báze) * (odstín % 60)) / 60) + báze; přestávka;

případ 3:

r = základ; g = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; b = val; přestávka;

případ 4:

r = (((val - báze) * (odstín % 60)) / 60) + báze; g = základ; b = val; přestávka;

případ 5:

r = val; g = základ; b = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; přestávka; }

barvy [index] [0] = r;

barvy [index] [1] = g; barvy [index] [2] = b; }

}

int rgb_colors [NUM_LIGHTS] [3]; // 네오 픽셀 오브젝트 갯수 마다 barva RGB 선언

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

// 일반 변수 선언

int startsSwitch = {8, 9, 10, 11, 12}; // zapnuto/vypnuto 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // zapnutí/vypnutí 상태 변수

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

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

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

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? 해결 시간 내 많은 이벤트 가 발생 하는것 에 대한 문제 에 대해서 대해서 지정된 시간 간격 으로 함수 를 호출 button button int tlačítkoState; // 입력 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 bez znaménka dlouhý lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 nepodepsané dlouhé 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수

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

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

nepodepsaný dlouhý proud Millis; // 현재 시간 변수

bez znaménka dlouhý B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 nepodepsané dlouhé DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) nepodepsané dlouhé R_previousMillis; // 레인보우 타이머 nepodepsané dlouhé D_previousMillis; // 디밍 타이머

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

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

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

neplatné nastavení () {

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

// 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startsSwitch , INPUT_PULLUP); // zapnuto/vypnuto 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정

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

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

}

prázdná smyčka () {

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

// 버튼 과 가변 저항 을 값 을 각각 읽어 변수 에 지정 한다 한다.

for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startsSwitch ); // zapnutí/vypnutí 버튼 에서 읽은 값 의 반대 값 을 startState 에 넣어 준다 // startState = digitalRead (startsSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 값 에 넣는다 넣는다}

přepínač (REŽIM) {// 애니메이션 함수 스위치 문

případ 0: on (); // na 함수 실행 break; // 조건문 에서 빠져 나가라

případ 1:

duha(); // duha 함수 실행 break;

případ 2:

stmívání (); // stmívání 함수 실행 break;

případ 3:

bliká (); // bliká 함수 실행 přestávka; }

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

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

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

buttonState = čtení; // Tlačítko 판독 값 을Stát 에 대입

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

MODE ++; // 버튼 모드 1 씩 증가 if (MODE> 3) {MODE = 0; firstRainbow = true; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 Jasný = 15; // 밝기 는 15}}}}

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

návrat MODE; 함수 를 종료 하고 režim 함수 로 값 을 리턴 하라 하라

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

// funkce režimu animace

//na

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

//Duha

void rainbow () {Serial.println ("déšť"); // 시리얼 모니터 에 déšť 을 써라 if (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = false; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - R_previousMillis> R_Interval) {// 흐른 시간 값 이 레인보우 인터벌 인터벌 값 보다 크면 R_previousMillis = currentMillis; // 현재 시간 을 이전 의 레인보우 시간 에 넣어 라 RainbowSpeed += 10; // 레인보우 변환 변수 에 10 을 더해라}

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

}

// Stmívání

void dimming () {Serial.println ("dimm"); // 시리얼 모니터 에 stmívání 을 써라 Serial.println (jasný); // 시리얼 모니터 에 Jasné 를 써라 if (aktuálníMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 인터벌 값 보다 크면 D_previousMillis = aktuálníMillis; // 현재 시간 을 이전 의 디밍 시간 에 넣어 라 Bright += BrightnessFactor; // 밝기 에 디밍 증감 값 1 씩 올려라} if (Bright 254) {BrightnessFactor = -1 * BrightnessFactor; } Bright = omezení (Bright, 99, 254); // 변수 밝기 값 을 최소값 99 ~ 최대 값 254 사이 의 값 으로 한정 한다

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

// Bliká

neplatné blikání () {Serial.println ("blikání"); // 시리얼 모니터 에 mrkněte 를 써라

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

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

}

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

// základní funkce

// barevná sada

void color_set (int index, int colorSenser) {

if (startState [index]) {hue [index] = mapa (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 color (colorSenser 에) getRGB (odstín [index], 255, 255, rgb_colors, index); pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [index]. Color (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (index); // 컬러 셋팅 하지 않음}

////// noColor set

neplatné noColor_set (int index) {// 컬러 셋팅 하지 않는 함수 설정

pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [index]. Color (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}

//// sada dimColor

neplatné dim_color_set (int index, int BC) {// 디밍 컬러 셋팅 함수 설정

if (startState [index]) {hue [index] = mapa (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 지정 (colorVal 에) getRGB (odstín [index], 255, BC, rgb_colors, index); pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [index]. Color (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (index); // 컬러 셋팅 하지 않음}

Krok 6: Dokončený vzhled

Doporučuje: