Kazalo:

Vzorec svetlobne pike: 6 korakov
Vzorec svetlobne pike: 6 korakov

Video: Vzorec svetlobne pike: 6 korakov

Video: Vzorec svetlobne pike: 6 korakov
Video: ТЕПЕРЬ НЕ ПРОПАДУ 10-ть самоделок ВЫРУЧАТ ГДЕ УГОДНО! 2024, November
Anonim
Image
Image
Pikčasti svetlobni vzorec
Pikčasti svetlobni vzorec
Pikčasti svetlobni vzorec
Pikčasti svetlobni vzorec

Začel sem z idejo "Ali lahko z lastnimi rokami nadzorujem svetlobo in izrazim svojo voljo?"

To je 'Dot Light Pattern', ki vam omogoča, da sami ustvarite svoje barve, oblikujete svoje vzorce s temi barvami in doživite različne animacijske učinke.

1. korak: Materiali

Materiali
Materiali
Materiali
Materiali
Materiali
Materiali
Materiali
Materiali
  1. Arduino UNO x 13
  2. LED trak WS2901 ali WS2811 slikovnih pik (130 LED)
  3. Gumbno stikalo x 1
  4. Stikalo za pritrditev x 65
  5. Potentmeter x 65
  6. Mavrični kabel
  7. Z napajanjem SMPS
  8. Prevodniški kabel
  9. Akrilna prozorna okrogla palica (premer 30 mm)
  10. Črna barva Akrilna plošča (5T) (500 mm*790 mm) x 2, (500 mm*35 mm) x 2, (790 mm*35 mm) x 2

2. korak: Načrt gradnje

Načrt gradnje
Načrt gradnje
Načrt gradnje
Načrt gradnje
Načrt gradnje
Načrt gradnje
Načrt gradnje
Načrt gradnje

3. korak: Strojna oprema: Oblikovanje vezja

Strojna oprema: Oblikovanje vezja
Strojna oprema: Oblikovanje vezja
Strojna oprema: Oblikovanje vezja
Strojna oprema: Oblikovanje vezja
Strojna oprema: Oblikovanje vezja
Strojna oprema: Oblikovanje vezja
  1. Akrilno ploščo izrežite kot zgornjo strukturo. (glej korak 2)

  2. En kos LED neo-pikslov je nameščen na zgornji in spodnji strani luknje za merilnik potenciala, skupaj pa je pritrjenih 65 parov svetlečih diod neo-slikovnih pik.
  3. Par svetlečih diod neo-pikslov je povezan skupaj, da tvori en sam Arduino pin.
  4. Na luknje merilnika napetosti namestite 65 potentimetrov. (Postavite ga na nasprotno stran neo-pikselirane površine.)
  5. Pritrdite 65 zaskočnih stikal, da se ujemajo s stikalnimi luknjami.
  6. Na vsako od trinajstih območij je pritrjenih skupaj trinajst Arduino UNO, da se pet kosov 65 kosov strojne opreme poveže v eno Arduino UNO.
  7. Kot je prikazano na priloženi fotografiji, z žico povežite merilnike napetosti, stikala in LED-diode z neo-slikovnimi pikami na zatiče Arduino UNO. (glej korak 2)
  8. Zatiči GND in 5V več Arduino UNO se zberejo na kabelske žice, nato pa se priključijo na zunanje napajanje. (glej korak 2)
  9. Odstranite prah z zračnim tlakom.

4. korak: Strojna oprema: Akrilno rezanje

Strojna oprema: Akrilno rezanje
Strojna oprema: Akrilno rezanje
Strojna oprema: Akrilno rezanje
Strojna oprema: Akrilno rezanje
Strojna oprema: Akrilno rezanje
Strojna oprema: Akrilno rezanje
  1. Akrilno palico odrežite na dolžino 50 mm.
  2. Ena stran akrilne palice je izvrtana do velikosti in globine, ki ustreza krmilnemu delu merilnika potenciala.
  3. Akrilna palica je obrezana nekoliko širše od luknje za prostor, ki se lahko dobro prilega merilniku moči.
  4. Druga stran daje malo brusnega papirja, da se svetloba lahko lepo prenaša.

5. korak: Arduino programska koda

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

koda 'hsb v rgb' 를 참고 한 사이트

#vključi

// '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 // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)

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

Adafruit_NeoPixel pikslov = {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 byte 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 odtenek, int sat, int val, int barve [5] [3], int indeks) {

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

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

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

int r;

int g; int b; int baza;

če (sat == 0) {

barve [indeks] [0] = val; barve [indeks] [1] = val; barve [indeks] [2] = val; } drugo {

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

stikalo (odtenek / 60) {

primer 0: r = val; g = (((val - osnova) * odtenek) / 60) + osnova; b = osnova; prekiniti;

primer 1:

r = (((val - osnova) * (60 - (odtenek % 60))) / 60) + osnova; g = val; b = osnova; prekiniti;

primer 2:

r = baza; g = val; b = (((val - osnova) * (odtenek % 60)) / 60) + osnova; prekiniti;

primer 3:

r = baza; g = (((val - osnova) * (60 - (odtenek % 60))) / 60) + osnova; b = val; prekiniti;

primer 4:

r = (((val - osnova) * (odtenek % 60)) / 60) + osnova; g = baza; b = val; prekiniti;

primer 5:

r = val; g = baza; b = (((val - osnova) * (60 - (odtenek % 60))) / 60) + osnova; prekiniti; }

barve [indeks] [0] = r;

barve [indeks] [1] = g; barve [indeks] [2] = b; }

}

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

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

// 일반 변수 선언

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

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

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

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

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? T 시간 내 많은 이벤트 가 발생 하는것 에 대한 에 대해서 지정된 시간 간격 으로 함수 를 호출 하여 해결 int buttonState; // int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 unsigned long lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 unsigned long 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; // 디밍 속도 변수

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

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

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

nepodpisani dolgi tokMillis; // 현재 시간 변수

brez podpisa dolg B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 brez podpisa dolgo DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) unsigned long R_previousMillis; // 레인보우 타이머 brez podpisa dolga D_previousMillis; // 디밍 타이머

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

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

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

void setup () {

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

// 버튼 인풋 설정

za (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startSwitch , INPUT_PULLUP); // vklop/izklop 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정

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

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

}

void loop () {

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

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

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

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

primer 0: on (); // na 함수 실행 prekinitvi; // 조건문 에서 빠져 나가라

primer 1:

mavrica (); // mavrica 함수 실행 prelom;

primer 2:

zatemnitev (); // zatemnitev 함수 실행 prelom;

primer 3:

utripa (); // utripa 함수 실행 prekinitev; }

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

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

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

buttonState = branje; // gumb 판독 값 을Država 에 대입

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

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

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

način vrnitve; Način 함수 를 종료 하고 하고 로 로 을 리턴 하라}

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

// način delovanja animacije

// vklopljeno

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

// Mavrica

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

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

}

// Zatemnitev

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

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

// Utripa

void blinking () {Serial.println ("utripa"); // 시리얼 모니터 에 utripa 를 써라

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

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

}

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

// jedro delovanja

// barvni niz

void color_set (int indeks, int colorSenser) {

if (startState [index]) {hue [index] = zemljevid (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 color (colorSenser 에) getRGB (odtenek [indeks], 255, 255, rgb_colors, indeks); za (int i = 0; i <NUMPIXELS; i ++) {slikovnih pik [indeks].setPixelColor (i, slikovne pike [indeks]. Barva (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (indeks); // 컬러 셋팅 하지 않음}

////// noColor set

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

za (int i = 0; i <NUMPIXELS; i ++) {slikovnih pik [indeks].setPixelColor (i, slikovne pike [indeks]. Barva (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}

//// dimColor set

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

if (startState [index]) {hue [index] = map (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 값 color (colorVal 에) getRGB (odtenek [indeks], 255, BC, rgb_colors, indeks); za (int i = 0; i <NUMPIXELS; i ++) {slikovnih pik [indeks].setPixelColor (i, slikovne pike [indeks]. Barva (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (indeks); // 컬러 셋팅 하지 않음}

6. korak: Dokončan pogled

Priporočena: