Mục lục:

Mô hình chấm sáng: 6 bước
Mô hình chấm sáng: 6 bước

Video: Mô hình chấm sáng: 6 bước

Video: Mô hình chấm sáng: 6 bước
Video: Xây dần ước mơ "Bảo Tàng Tiền Tệ" 🏛 2024, Tháng mười một
Anonim
Image
Image
Mô hình chấm sáng
Mô hình chấm sáng
Mô hình chấm sáng
Mô hình chấm sáng

Tôi bắt đầu với ý tưởng "Tôi có thể điều khiển ánh sáng bằng chính đôi tay của mình và thể hiện ý muốn của mình không?"

Nó là một 'Dot Light Pattern' cho phép bạn tự tạo ra màu sắc của riêng mình, thiết kế các mẫu của riêng bạn với những màu đó và trải nghiệm các hiệu ứng hoạt hình khác nhau.

Bước 1: Vật liệu

Vật liệu
Vật liệu
Vật liệu
Vật liệu
Vật liệu
Vật liệu
Vật liệu
Vật liệu
  1. Arduino UNO x 13
  2. Dải LED WS2901 hoặc WS2811 pixel (130 LEDS)
  3. Công tắc nút x 1
  4. Công tắc chụp x 65
  5. Máy đo điện thế x 65
  6. Cáp cầu vồng
  7. Đủ sức mạnh SMPS
  8. Cáp dẫn
  9. Thanh tròn trong suốt acrylic (đường kính 30mm)
  10. Bảng Acrylic màu đen (5T) (500mm * 790mm) x 2, (500mm * 35mm) x 2, (790mm * 35mm) x 2

Bước 2: Kế hoạch xây dựng

Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công
Kế hoạch thi công

Bước 3: Phần cứng: Thiết kế mạch

Phần cứng: Thiết kế mạch
Phần cứng: Thiết kế mạch
Phần cứng: Thiết kế mạch
Phần cứng: Thiết kế mạch
Phần cứng: Thiết kế mạch
Phần cứng: Thiết kế mạch
  1. Cắt tấm acrylic giống như cấu trúc trên. (xem bước 2)

  2. Một phần của đèn LED tân pixel được đặt ở trên cùng và dưới cùng của lỗ đo điện trở, và có tổng cộng 65 cặp đèn LED tân pixel được gắn vào.
  3. Một cặp đèn LED tân pixel được nối với nhau để tạo thành một chân Arduino duy nhất.
  4. Lắp 65 áp kế vào các lỗ của đồng hồ đo. (Đặt nó ở phía đối diện của một bề mặt tân pixel.)
  5. Gắn 65 công tắc snap để khớp với các lỗ công tắc.
  6. Tổng cộng có mười ba Arduino UNO được gắn vào mỗi vùng trong số mười ba vùng để liên kết năm phần của 65 phần cứng vào một Arduino UNO.
  7. Như được hiển thị trong ảnh đính kèm, Kết nối các máy đo điện áp, công tắc chụp nhanh và đèn LED tân pixel với các chân của Arduino UNO bằng dây. (xem bước 2)
  8. Các chân GND và 5V của một số Arduino UNO được thu vào dây cáp, sau đó được kết nối với nguồn bên ngoài. (xem bước 2)
  9. Loại bỏ bụi bằng áp suất không khí.

Bước 4: Phần cứng: Cắt acrylic

Phần cứng: Cắt acrylic
Phần cứng: Cắt acrylic
Phần cứng: Cắt acrylic
Phần cứng: Cắt acrylic
Phần cứng: Cắt acrylic
Phần cứng: Cắt acrylic
  1. Cắt thanh acrylic có chiều dài 50mm.

  2. Một mặt của thanh acrylic được khoan với kích thước và độ sâu để phù hợp với bộ phận điều khiển của máy đo lực.
  3. Thanh acrylic được cắt rộng hơn một chút so với lỗ để có một khoảng trống có thể vừa khít với máy đo lực.
  4. Mặt còn lại cho một ít giấy nhám để ánh sáng có thể truyền qua một cách gọn gàng.

Bước 5: Mã lập trình Arduino

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

Mã 'hsb to rgb' 를 참고 한 사이트

#bao gồm

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

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

# xác định mã PIN1 2 # xác định mã PIN2 3 # xác định mã PIN3 4 # xác định mã PIN4 5 # xác định mã PIN5 6

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

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

// 네오 픽셀 오브젝트 Mảng 선언

Adafruit_NeoPixel pixel = {Adafruit_NeoPixel (NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), Adafruit_KHZ800 Adafruit_NeoPixel (NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800)}; //// 네오 픽셀 을 사용 하기 위해 객체 하나 를 생성 한다. // 첫번째 인자 값 은 네오 픽셀 의 LED 의 개수 // 두번째 인자 값 은 네오 픽셀 이 연결된 아두 이노 의 핀 번호 // 세번째 인자 값 은 네오 픽셀 의 타입 에 따라 바뀌는 cờ

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

////// 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 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 cơ sở;

if (sat == 0) {

màu sắc [chỉ số] [0] = val; màu sắc [chỉ số] [1] = val; màu sắc [chỉ số] [2] = val; } khác {

căn = ((255 - sat) * val) >> 8;

chuyển đổi (màu / 60) {

trường hợp 0: r = val; g = (((val - bazơ) * hue) / 60) + bazơ; b = căn cứ; nghỉ;

trường hợp 1:

r = (((val - base) * (60 - (hue% 60))) / 60) + base; g = val; b = căn cứ; nghỉ;

trường hợp 2:

r = căn cứ; g = val; b = (((val - base) * (hue% 60)) / 60) + base; nghỉ;

trường hợp 3:

r = căn cứ; g = (((val - bazơ) * (60 - (hue% 60))) / 60) + bazơ; b = val; nghỉ;

trường hợp 4:

r = (((val - base) * (hue% 60)) / 60) + base; g = căn cứ; b = val; nghỉ;

trường hợp 5:

r = val; g = căn cứ; b = (((val - bazơ) * (60 - (hue% 60))) / 60) + bazơ; nghỉ; }

màu sắc [chỉ số] [0] = r;

màu sắc [chỉ số] [1] = g; màu sắc [chỉ số] [2] = b; }

}

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

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

// 일반 변수 선언

int startedSwitch = {8, 9, 10, 11, 12}; // bật / tắt 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // bật / tắt 상태 변수

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

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

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

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? 짧은 시간 내 많은 이벤트 가 발생 하는것 에 대한 문제 에 대해서 지정된 시간 간격 으로 함수 를 호출 하여 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; // 디밍 속도 변수

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

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

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

unsigned long currentMillis; // 현재 시간 변수

unsigned long B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 unsigned long DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) dài không dấu R_previousMillis; // 레인보우 타이머 dài không dấu D_previousMillis; // 디밍 타이머

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

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

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

void setup () {

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

// 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startedSwitch , INPUT_PULLUP); // bật / tắt 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정

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

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

}

void loop () {

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

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

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

chuyển đổi (MODE) {// 애니메이션 함수 스위치 문

case 0: on (); // trên 함수 실행 break; // 조건문 에서 빠져 나가라

trường hợp 1:

cầu vồng(); // cầu vồng 함수 실행 break;

trường hợp 2:

mờ (); // làm mờ 함수 실행 break;

trường hợp 3:

nhấp nháy (); // nhấp nháy 함수 실행 break; }

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

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

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

buttonState = đọc; // 판독 값 을 buttonState 에 대입

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

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

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

trả về CHẾ ĐỘ; 함수 를 종료 하고 chế độ 함수 로 값 을 리턴 하라}

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

// chức năng của chế độ hoạt ảnh

//trên

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

//Cầu vồng

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

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

}

// Làm mờ

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

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

// Chớp mắt

void nhấp nháy () {Serial.println ("nhấp nháy"); // 시리얼 모니터 에 chớp mắt 를 써라

for (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); // 읽히지 않으면 컬러 셋팅 하지 않음}}

}

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

// chức năng cốt lõi

// bộ màu

void color_set (int index, int colorSenser) {

if (startState [index]) {hue [index] = map (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 값 으로 지정 (colorSenser 에) getRGB (hue [index], 255, 255, rgb_colors, index); for (int i = 0; i <NUMPIXELS; i ++) {pixel [index].setPixelColor (i, pixel [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

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

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

//// bộ dimColor

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

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

Bước 6: Một cái nhìn hoàn chỉnh

Đề xuất: