สารบัญ:

รูปแบบแสงจุด: 6 ขั้นตอน
รูปแบบแสงจุด: 6 ขั้นตอน

วีดีโอ: รูปแบบแสงจุด: 6 ขั้นตอน

วีดีโอ: รูปแบบแสงจุด: 6 ขั้นตอน
วีดีโอ: สอนแต่งรูป 📸 แก้ไขรูปย้อนแสงมืดๆให้สดใส ด้วยAppฟรี ทำง่ายมาก | Holidear 2024, กรกฎาคม
Anonim
Image
Image
รูปแบบแสงดอท
รูปแบบแสงดอท
รูปแบบแสงดอท
รูปแบบแสงดอท

ฉันเริ่มต้นด้วยความคิดที่ว่า "ฉันสามารถควบคุมแสงด้วยมือของฉันเองและแสดงเจตจำนงของตัวเองได้หรือไม่"

มันคือ 'Dot Light Pattern' ที่ให้คุณสร้างสีของคุณเอง ออกแบบลวดลายของคุณเองด้วยสีเหล่านั้น และสัมผัสประสบการณ์เอฟเฟกต์แอนิเมชั่นต่างๆ

ขั้นตอนที่ 1: วัสดุ

วัสดุ
วัสดุ
วัสดุ
วัสดุ
วัสดุ
วัสดุ
วัสดุ
วัสดุ
  1. Arduino UNO x 13
  2. แถบ LED พิกเซล WS2901 หรือ WS2811 (130 LEDS)
  3. สวิตช์ปุ่ม x 1
  4. สแน็ปสวิตช์ x 65
  5. โพเทนนิ่งมิเตอร์ x 65
  6. สายสายรุ้ง
  7. พลังงานพอเพียง SMPS
  8. สายตัวนำ
  9. แท่งอะคริลิคใสทรงกลม (เส้นผ่านศูนย์กลาง 30 มม.)
  10. แผ่นอะครีลิคสีดำ (5T) (500mm*790mm) x 2, (500mm*35mm) x 2, (790mm*35mm) x 2

ขั้นตอนที่ 2: แผนการก่อสร้าง

แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง
แผนการก่อสร้าง

ขั้นตอนที่ 3: ฮาร์ดแวร์: การออกแบบวงจร

ฮาร์ดแวร์: การออกแบบวงจร
ฮาร์ดแวร์: การออกแบบวงจร
ฮาร์ดแวร์: การออกแบบวงจร
ฮาร์ดแวร์: การออกแบบวงจร
ฮาร์ดแวร์: การออกแบบวงจร
ฮาร์ดแวร์: การออกแบบวงจร
  1. ตัดแผ่นอะครีลิคเหมือนโครงสร้างด้านบน (ดูขั้นตอนที่2)

  2. LED นีโอพิกเซลหนึ่งชิ้นวางอยู่ที่ด้านบนและด้านล่างของรูโพเทนชิมิเตอร์ และติดไฟ LED นีโอพิกเซลรวม 65 คู่
  3. ไฟ LED นีโอพิกเซลคู่หนึ่งเชื่อมต่อเข้าด้วยกันเพื่อสร้างพิน Arduino ตัวเดียว
  4. ใส่โพเทนต์มิเตอร์ 65 ตัวเข้ากับรูโพเทนต์มิเตอร์ (วางไว้ที่ด้านตรงข้ามของพื้นผิวนีโอพิกเซล)
  5. ติดสวิตซ์แบบสแน็ป 65 ตัวเพื่อให้ตรงกับรูสวิตซ์
  6. Arduino UNO ทั้งหมด 13 ตัวถูกต่อเข้ากับแต่ละโซนจาก 13 โซน เพื่อผูกฮาร์ดแวร์ 65 ชิ้นห้าชิ้นเข้ากับ Arduino UNO หนึ่งตัว
  7. ดังที่แสดงในภาพที่แนบมา ให้ต่อโพเทนชิมิมิเตอร์ สแน็ปสวิตช์ และไฟ LED แบบนีโอพิกเซลเข้ากับหมุดของ Arduino UNO โดยใช้สายไฟ (ดูขั้นตอนที่2)
  8. พิน GND และ 5V ของ Arduino UNO หลายตัวถูกรวบรวมเข้ากับสายเคเบิล จากนั้นเชื่อมต่อกับแหล่งจ่ายไฟภายนอก (ดูขั้นตอนที่2)
  9. ขจัดฝุ่นด้วยแรงดันอากาศ

ขั้นตอนที่ 4: ฮาร์ดแวร์: การตัดอะคริลิก

ฮาร์ดแวร์: ตัดอะคริลิค
ฮาร์ดแวร์: ตัดอะคริลิค
ฮาร์ดแวร์: ตัดอะคริลิค
ฮาร์ดแวร์: ตัดอะคริลิค
ฮาร์ดแวร์: ตัดอะคริลิค
ฮาร์ดแวร์: ตัดอะคริลิค
  1. ตัดแท่งอะคริลิกให้ยาว 50 มม.

  2. ด้านหนึ่งของแท่งอะคริลิกเจาะให้ได้ขนาดและความลึกเพื่อให้เข้ากับส่วนควบคุมของโพเทนชิมิเตอร์
  3. ก้านอะคริลิกถูกเล็มให้กว้างกว่ารูเล็กน้อยเพื่อให้มีระยะห่างที่พอดีกับโพเทนมิเตอร์ได้ดี
  4. อีกด้านให้กระดาษทรายเล็กน้อยเพื่อให้แสงส่องผ่านได้อย่างสวยงาม

ขั้นตอนที่ 5: รหัสการเขียนโปรแกรม Arduino

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

รหัส 'hsb to rgb' 참고한 사이트

#รวม

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

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

#กำหนด PIN1 2 # กำหนด PIN2 3 # กำหนด PIN3 4 # กำหนด PIN4 5 # กำหนด PIN5 6

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

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

//네오픽셀 오브젝트 อาร์เรย์ 선언

Adafruit_NeoPixel พิกเซล = { Adafruit_NeoPixel (NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEOPIXELS Adafruit_NeoPixel(NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800) }; ////네오픽셀을 사용하기 위해 하 하나를 생성한다. //첫번째 인자값은 네오픽셀의 LED의 개수 // 인 인자값은 네오픽셀이 연결된 아두이노의 핀번호 //세번째 인자값은 네오픽셀의 타입에 따라 바뀌는 ธง

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

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

const ไบต์ 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, }; //

เป็นโมฆะ getRGB (สี int, int sat, int val, สี int [5][3], ดัชนี int) {

วาล = dim_curve[วาล]; sat = 255 - dim_curve[255 - sat];

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

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

int r;

int กรัม; int ข; ฐานภายใน;

ถ้า (นั่ง == 0) {

สี[ดัชนี][0] = วาล; สี[ดัชนี][1] = วาล; สี[ดัชนี][2] = วาล; } อื่น {

ฐาน = ((255 - เสาร์) * วาล) >> 8;

สวิตช์ (ฮิว / 60) {

กรณีที่ 0: r = วาล; g = (((val - base) * hue) / 60) + ฐาน; b = ฐาน; หยุดพัก;

กรณีที่ 1:

r = (((val - ฐาน) * (60 - (สี % 60))) / 60) + ฐาน; ก. = วาล; b = ฐาน; หยุดพัก;

กรณีที่ 2:

r = ฐาน; ก. = วาล; b = (((val - base) * (hue % 60)) / 60) + ฐาน; หยุดพัก;

กรณีที่ 3:

r = ฐาน; g = (((val - base) * (60 - (hue % 60))) / 60) + ฐาน; b = วาล; หยุดพัก;

กรณีที่ 4:

r = (((val - ฐาน) * (สี % 60)) / 60) + ฐาน; ก. = ฐาน; b = วาล; หยุดพัก;

กรณีที่ 5:

r = วาล; ก. = ฐาน; b = (((val - base) * (60 - (hue % 60))) / 60) + ฐาน; หยุดพัก; }

สี[ดัชนี][0] = r;

สี[ดัชนี][1] = ก.; สี[ดัชนี][2] = b; }

}

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

เฉดสี [NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 hue 선언 int sat[NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 명도 선언 int brint[NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 밝기 서언

//일반 변수 선언

int startSwitch = {8, 9, 10, 11, 12}; // เปิด/ปิด 버튼 핀번호 บูลีน startState = {เท็จ เท็จ เท็จ เท็จ เท็จ}; // เปิด/ปิด 상태변수

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

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

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

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

//애니메이션 모든 변환을 위한 버튼 디바운싱 변수선언 //디바운싱? 간내 시간내 많은 이벤트가 발생하는것에 대한 문제에 대해서 지정된 시간 간격으로 함수를 호출하여 해결 int buttonState; // 입력 핀으로부터의 현재 판독값 int lastButtonState = สูง; // 이전의 판독값은 켜진상태로 ที่ไม่ได้ลงชื่อ 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; //디밍 속도 변수

บูลีน B_state[5]; //블링킹을 위한 각 모듈의 상태변수

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

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

ไม่ได้ลงนามยาวปัจจุบันMillis; //현재시간 변수

ยาวที่ไม่ได้ลงนาม B_previousMillis[5]; //각 모듈의 블링킹 타이머 unsigned long DR_Millis[5]; //각 모듈의 디밍 랜덤 타이머(예비) unsigned long R_previousMillis; //레인보우 타이머 ไม่ได้ลงนามยาว D_previousMillis; //디밍 타이머

บูลีนก่อนเรนโบว์ = จริง; //레인보우 색상 초기화 상태변수

ภายใน RainbowSpeed; //레인보우 변환변수

int สว่าง = 100; //디밍 초기값 int BrightnessFactor = 1; //디밍 증감 값 //////////////////////////////////////////// ////////////////////////////////////

การตั้งค่าเป็นโมฆะ () {

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { พิกเซล.begin(); //네오픽셀 오브젝트 초기화 }

//버튼 อิน풋 설정

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { pinMode (startsSwitch , INPUT_PULLUP); //เปิด/ปิด 버튼 인풋 설정 } pinMode(animationButton, INPUT_PULLUP); // 애니메이션 풋 인풋 설정

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

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

}

วงเป็นโมฆะ () {

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

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

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { startState = !digitalRead(startsSwitch); //เปิด/ปิด 버튼에서 읽은 값의 반대값을 startState에 넣어준다 //startState = digitalRead(startsSwitch); colorVal = analogRead (colorPin); // 가변저항에서 읽은 값을 가변저항 초기값에 넣는다 }

สวิตช์ (MODE) { //애니메이션함수 스위치문

กรณีที่ 0: บน (); //on함수 실행 แตก; // 조건문에서 빠져나가라

กรณีที่ 1:

รุ้ง(); //สายรุ้ง함수 실행 แตก;

กรณีที่ 2:

ลดแสง (); // dimming함수 실행 แตก;

กรณีที่ 3:

กระพริบ (); //กระพริบ함수 실행 หยุด; }

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { พิกเซล.show(); //네오픽셀 오브젝트 배열 켜라 }

}

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

int CheckAnimMode() {

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

/////////////////////////////////////////////////////////////////////// /// ปัจจุบันมิลลิวินาที = มิลลิวินาที (); // 시간 측정 int reading = digitalRead(animationButton); if (อ่าน != lastButtonState) { //입력핀으로부터 이전의 버튼의 상태와 판독값 비교 lastDebounceTime = มิลลิวินาที (); //현재 시간을 출력핀이 마지막으로 전환된 시간에 넣음 }

ถ้า ((currentMillis - lastDebounceTime) > debounceDelay) {

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

buttonState = การอ่าน; //판독값을 buttonState에 대입

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

โหมด++; //버튼모드 1씩 증가 if (MODE > 3) { MODE = 0; firstRainbow = จริง; //레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; //디밍 증감값 สว่าง = 15; //밝기는 15 } } } }

lastButtonState = การอ่าน; //판독값을 이전의 버튼상태에 대입

กลับโหมด; 함수를 종료하고 mode함수로 값을 리턴하라 }

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

// ฟังก์ชั่นโหมดภาพเคลื่อนไหว

//บน

เป็นโมฆะเมื่อ () { Serial.println ("เปิด"); //시리얼 모니터에 on을 써라 สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { color_set(i, colorVal); // 가변저항 값에 따라 컬러 셋팅 } }

//รุ้ง

รุ้งเป็นโมฆะ () { Serial.println ("ฝน"); //시리얼 모니터에 rain을 써라 if (firstRainbow) { RainbowSpeed = 0; //레인보우 속도 초기화 firstRainbow = false; //레인보우 색상 초기화 상태 꺼짐 } if (มิลลิวินาที () - R_previousMillis > R_Interval) { //흐른 시간값이 레인보우 인터벌 값보다 크면 R_previousMillis = currentMillis; //현재시간을 이전의 레인보우 시간에 넣어라 RainbowSpeed += 10; //레인보우 변환변수에 10을 더해라 }

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { color_set(i, (colorVal + RainbowSpeed) % 1023); //레인보우컬러셋팅 }

}

//หรี่แสง

โมฆะลดแสง () { Serial.println ("dimm"); //시리얼모니터에 dimm을 써라 Serial.println(สว่าง); //시리얼모니터에 Bright를 써라 ถ้า (currentMillis - D_previousMillis > D_Interval) { //흐른 시간값이 디밍 인터벌 값보다 크면 D_previousMillis = currentMillis; //현재시간을 이전의 디밍 시간에 넣어라 Bright += BrightnessFactor; //밝기에 디밍 증감값 1씩 올려라 } ถ้า (สว่าง 254) { BrightnessFactor = -1 * BrightnessFactor; } สว่าง = จำกัด (สว่าง 99, 254); //변수 밝기값을 최소값99~최대값254 사이의 값으로 한정한다

สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { dim_color_set (i, Bright); //디밍컬러셋팅 } }

//กระพริบตา

กะพริบเป็นโมฆะ () { Serial.println ("กะพริบ"); // 시리얼모니터에 กระพริบตา 써라

สำหรับ (int i = 0; i B_Interval) { //흐른 시간값이 블링크 인터벌 값보다 크면

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

}

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

// ฟังก์ชันหลัก

//ชุดสี

เป็นโมฆะ color_set (ดัชนี int, colorSenser int) {

ถ้า (startState [ดัชนี]) { สี [ดัชนี] = แผนที่ (colorSenser, 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorSenser에) getRGB(hue[index], 255, 255, rgb_colors, index); สำหรับ (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[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 (ดัชนี int) { //컬러셋팅 하지않는 함수 설정

สำหรับ (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(0, 0, 0)); } //픽셀컬러 세팅을 0, 0, 0으로 설정 }

////dimColor set

เป็นโมฆะ dim_color_set (ดัชนี int, int BC) { //디밍컬러셋팅 함수 설정

ถ้า (startState [ดัชนี]) { สี [ดัชนี] = แผนที่ (colorVal [ดัชนี], 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorVal에) getRGB(hue[index], 255, BC, rgb_colors, index); สำหรับ (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(rgb_colors[index][0], rgb_colors[index][1], rgb_colors[index] [2])); } ///픽셀컬러 셋팅을 rgb_colors의 r, g, b으로 설정 } else noColor_set(index); //컬러셋팅 하지않음 }

ขั้นตอนที่ 6: ดูเสร็จแล้ว

แนะนำ: