Obsah:

Bodový svetelný vzor: 6 krokov
Bodový svetelný vzor: 6 krokov

Video: Bodový svetelný vzor: 6 krokov

Video: Bodový svetelný vzor: 6 krokov
Video: ⚡️ Я НЕ СДАМСЯ! AMAZON 2.0 | Интернет магазин с нуля - Часть 3 2024, Júl
Anonim
Image
Image
Bodový svetelný vzor
Bodový svetelný vzor
Bodový svetelný vzor
Bodový svetelný vzor

Začal som myšlienkou „Môžem ovládať svetlo vlastnými rukami a prejavovať vlastnú vôľu?“

Je to „bodový svetelný vzor“, ktorý vám umožňuje vytvárať si vlastné farby, navrhovať vlastné vzory s týmito farbami a využívať rôzne efekty animácie.

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ý pás LED WS2901 alebo WS2811 (130 LED)
  3. Tlačidlový spínač x 1
  4. Zapínací spínač x 65
  5. Potenciometer x 65
  6. Dúhový kábel
  7. Dostatočne výkonný SMPS
  8. Vodičový kábel
  9. Akrylová priehľadná okrúhla tyč (priemer 30 mm)
  10. Akrylová doska čiernej farby (5T) (500 mm*790 mm) x 2, (500 mm*35 mm) x 2, (790 mm*35 mm) x 2

Krok 2: Plán výstavby

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: Hardvér: Návrh obvodu

Hardvér: Dizajn obvodu
Hardvér: Dizajn obvodu
Hardvér: Dizajn obvodu
Hardvér: Dizajn obvodu
Hardvér: Dizajn obvodu
Hardvér: Dizajn obvodu
  1. Odrežte akrylovú dosku podľa vyššie uvedenej štruktúry. (pozri krok 2)

  2. Jeden kus neo-pixelovej LED diódy je umiestnený na hornú a dolnú časť otvoru pre potenciometer a je k nej pripevnených celkom 65 párov neo-pixelových LED diód.
  3. Dvojica neo-pixelových diód LED je zapojená dohromady a tvorí jeden pin Arduino.
  4. Do otvorov potenciometra namontujte 65 potenciometrov. (Položte ho na opačnú stranu neo-pixelového povrchu.)
  5. Pripojte 65 západkových spínačov tak, aby zodpovedali otvorom prepínača.
  6. Do každej z trinástich zón je pripevnených celkom trinásť Arduino UNO, aby bolo možné spojiť päť kusov 65 kusov hardvéru do jedného Arduino UNO.
  7. Ako je znázornené na priloženej fotografii, potenciometre, zapínacie spínače a neo-pixelové diódy LED pripojte k pinom Arduino UNO pomocou drôtu. (pozri krok 2)
  8. Piny GND a 5V niekoľkých Arduino UNO sú zhromaždené do káblových vodičov a potom pripojené k externému napájaniu. (pozri krok 2)
  9. Odstráňte prach tlakom vzduchu.

Krok 4: Hardvér: Akrylové rezanie

Hardvér: Akrylové rezanie
Hardvér: Akrylové rezanie
Hardvér: Akrylové rezanie
Hardvér: Akrylové rezanie
Hardvér: Akrylové rezanie
Hardvér: Akrylové rezanie
  1. Odrežte akrylovú tyč na dĺžku 50 mm.
  2. Jedna strana akrylovej tyče je vyvŕtaná do veľkosti a hĺbky, aby zodpovedala kontrolnej časti potenciometra.
  3. Akrylová tyč je orezaná o niečo širšia ako otvor, aby zabezpečila voľný priestor, ktorý sa dobre zmestí do potenciometra.
  4. Druhá strana dáva malý brúsny papier, aby bolo možné svetlo úhľadne prenášať.

Krok 5: Programovací kód Arduino

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

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

#zahrnúť

// '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 pixelov = {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 () 를 위한 변수 와 함수 선언

konštantný 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 hue, int sat, int val, int colors [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ákladňa;

ak (sat == 0) {

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

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

prepínač (odtieň / 60) {

prípad 0: r = val; g = (((val - báza) * odtieň) / 60) + báza; b = základ; prestávka;

prípad 1:

r = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; g = val; b = základ; prestávka;

prípad 2:

r = základ; g = val; b = (((val - báza) * (odtieň % 60)) / 60) + báza; prestávka;

prípad 3:

r = základ; g = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; b = val; prestávka;

prípad 4:

r = (((val - báza) * (odtieň % 60)) / 60) + báza; g = základ; b = val; prestávka;

prípad 5:

r = val; g = základ; b = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; prestávka; }

farby [index] [0] = r;

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

}

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

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

// 일반 변수 선언

int startsSwitch = {8, 9, 10, 11, 12}; // zapnutie/vypnutie 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // zapnutie/vypnutie 상태 변수

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

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

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

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? 해결 시간 내 많은 이벤트 가 발생 하는것 에 대한 문제 에 대해서 대해서 지정된 시간 간격 으로 함수 를 해결 해결 해결 int tlačidloState; // 입력 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 nepodpísané dlhé lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 nepodpísané dlhé debounceDelay = 50; // 디 바운싱 타임 설정; 출력 이 깜빡 이면 증가 한다 MOD 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수

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

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

nepodpísaný dlhý prúdMillis; // 현재 시간 변수

bez znamienka dlhý B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 nepodpísané dlhé DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) nepodpísané dlhé R_previousMillis; // 레인보우 타이머 bez znamienka D_previousMillis; // 디밍 타이머

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

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

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

neplatné nastavenie () {

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

// 버튼 인풋 설정

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

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

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

}

prázdna slučka () {

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

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

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

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

prípad 0: on (); // na 함수 실행 prestávka; // 조건문 에서 빠져 나가라

prípad 1:

dúha (); // dúha 함수 실행 prestávka;

prípad 2:

stmievanie (); // stmievanie 함수 실행 prestávka;

prípad 3:

bliká (); // blikanie 함수 실행 prestávka; }

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

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

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

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

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

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

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

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

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

// funkcia režimu animácie

// dňa

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

// Dúha

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

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

}

// Stmievanie

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

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

// Bliká

prázdne blikanie () {Serial.println ("blikanie"); // 시리얼 모니터 에 blikajte 를 써라

pre (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 ); // 가변 저항 값 에 따라 컬러 셋팅} else {noColor_set (i); // 읽히지 않으면 컬러 셋팅 하지 않음}}

}

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

// základná funkcia

// sada farieb

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 (odtieň [index], 255, 255, rgb_colors, index); pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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) {// 컬러 셋팅 하지 않는 함수 설정

pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 color (colorVal 에) getRGB (odtieň [index], 255, BC, rgb_colors, index); pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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: Hotový vzhľad

Odporúča: