Съдържание:

Модел на светлинни точки: 6 стъпки
Модел на светлинни точки: 6 стъпки

Видео: Модел на светлинни точки: 6 стъпки

Видео: Модел на светлинни точки: 6 стъпки
Видео: ❤️ Моята формула за щастие в 6 стъпки 2024, Юли
Anonim
Image
Image
Dot Light Pattern
Dot Light Pattern
Дот светлинен модел
Дот светлинен модел

Започнах с идеята „Мога ли да контролирам светлината със собствените си ръце и да изразя собствената си воля?“

Това е „Dot Light Pattern“, който ви позволява да създавате свои собствени цветове сами, да проектирате свои собствени модели с тези цветове и да изпитате различни анимационни ефекти.

Стъпка 1: Материали

Материали
Материали
Материали
Материали
Материали
Материали
Материали
Материали
  1. Arduino UNO x 13
  2. WS2901 или WS2811 пикселна LED лента (130 LEDS)
  3. Бутон за превключване x 1
  4. Превключвател за щракване x 65
  5. Потенметър х 65
  6. Кабел на дъгата
  7. Захранване достатъчно SMPS
  8. Проводник кабел
  9. Акрилна прозрачна кръгла лента (диаметър 30 мм)
  10. Черен цвят акрилна дъска (5T) (500 мм*790 мм) x 2, (500 мм*35 мм) x 2, (790 мм*35 мм) x 2

Стъпка 2: План за строителство

План за строителство
План за строителство
План за строителство
План за строителство
План за строителство
План за строителство
План за строителство
План за строителство

Стъпка 3: Хардуер: Дизайн на схема

Хардуер: Дизайн на вериги
Хардуер: Дизайн на вериги
Хардуер: Дизайн на вериги
Хардуер: Дизайн на вериги
Хардуер: Дизайн на вериги
Хардуер: Дизайн на вериги
  1. Изрежете акрилната плоча като горната структура. (вижте стъпка 2)

  2. Едно парче неопикселов светодиод е поставено в горната и долната част на отвора на потенциометъра и са прикрепени общо 65 двойки неопикселни светодиоди.
  3. Чифт неопикселни светодиоди са свързани заедно, за да образуват един щифт Arduino.
  4. Поставете 65 потенциометъра към отворите на потенциометъра. (Поставете го на противоположната страна на неопикселирана повърхност.)
  5. Прикрепете 65 превключватели, за да съответстват на отворите за превключватели.
  6. Общо тринадесет Arduino UNO са прикрепени към всяка от тринадесетте зони, за да свържат пет парчета от 65 части хардуер в едно Arduino UNO.
  7. Както е показано на приложената снимка, свържете кабелите за измерване на напрежението, превключвателите и неопикселните светодиоди към щифтовете на 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' 헤더 파일 라는 외부 라이브러리 를 포함

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

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

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

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

// 네오 픽셀 오브젝트 Масив 선언

Adafruit_NeoPixel пиксела = {Adafruit_NeoPixel (NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, ПИН2, 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 байт 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 цветове [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 база;

if (sat == 0) {

цветове [индекс] [0] = вал; цветове [индекс] [1] = вал; цветове [индекс] [2] = вал; } else {

база = ((255 - сат) * вал) >> 8;

превключвател (оттенък / 60) {

случай 0: r = val; g = (((val - основа) * оттенък) / 60) + основа; b = основа; прекъсване;

случай 1:

r = (((val - основа) * (60 - (оттенък % 60))) / 60) + основа; g = val; b = основа; прекъсване;

случай 2:

r = основа; g = val; b = (((val - основа) * (оттенък % 60)) / 60) + основа; прекъсване;

случай 3:

r = основа; g = (((val - основа) * (60 - (оттенък % 60))) / 60) + основа; b = val; прекъсване;

случай 4:

r = (((val - основа) * (оттенък % 60)) / 60) + основа; g = основа; b = val; прекъсване;

случай 5:

r = val; g = основа; b = (((val - основа) * (60 - (оттенък % 60))) / 60) + основа; прекъсване; }

цветове [индекс] [0] = r;

цветове [индекс] [1] = g; цветове [индекс] [2] = b; }

}

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

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

// 일반 변수 선언

int startSwitch = {8, 9, 10, 11, 12}; // включване/изключване 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // включване/изключване 상태 변수

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; // 디밍 속도 변수

логическо B_state [5]; // 블 링킹 을 을 각 모듈 의 상태 변수

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

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

неподписан дълъг токMillis; // 현재 시간 변수

без подпис дълъг B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 неподписан дълъг DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) без подпис дълъг R_previousMillis; // 레인보우 타이머 без подпис дълъг D_previousMillis; // 디밍 타이머

boolean firstRainbow = вярно; // 레인보우 색상 초기화 상태 변수

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

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

void setup () {

for (int i = 0; i <NUM_LIGHTS; i ++) {пиксели .begin (); // 네오 픽셀 오브젝트 초기화}

// 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (StartSwitch , INPUT_PULLUP); // включване/изключване 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정

for (int i = 0; i <NUM_LIGHTS; i ++) {B_Interval = int (произволен (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}

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

}

void loop () {

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

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

for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startSwitch ); // включване/изключване 버튼 에서 읽은 값 의 반대 값 을 startState 에 넣어 준다 // startState = digitalRead (startSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 값 에 넣는다}

превключвател (MODE) {// 애니메이션 함수 스위치 문

случай 0: on (); // на 함수 실행 почивка; // 조건문 에서 빠져 나가라

случай 1:

дъга(); // дъга 함수 실행 почивка;

случай 2:

затъмняване (); // затъмняване 함수 실행 прекъсване;

случай 3:

мигащ (); // мигащ 함수 실행 прекъсване; }

for (int i = 0; i <NUM_LIGHTS; i ++) {пиксели .show (); // 네오 픽셀 오브젝트 배열 켜라}

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

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

buttonState = четене; // бутон 판독 값 을Състояние 에 대입

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

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

lastButtonState = четене; // 판독 값 을 을 의 버튼 상태 에 대입

РЕЖИМ за връщане; Режим на 함수 를 종료 하고 함수 로 값 을 리턴 하라}

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

// функция на анимационен режим

//На

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

//Дъга

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

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

}

// Затъмняване

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

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

// Мига

void blinking () {Serial.println ("мигане"); // 시리얼 모니터 에 мига 를 써라

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

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

}

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

// основна функция

// набор от цветове

void color_set (int индекс, int colorSenser) {

if (startState [index]) {hue [index] = map (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 값 color (colorSenser 에) getRGB (оттенък [индекс], 255, 255, rgb_colors, индекс); за (int i = 0; i <NUMPIXELS; i ++) {пиксели [индекс].setPixelColor (i, пиксели [индекс]. Цвят (rgb_colors [индекс] [0], rgb_colors [индекс] [1], rgb_colors [индекс] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (индекс); // 컬러 셋팅 하지 않음}

////// noColor set

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

за (int i = 0; i <NUMPIXELS; i ++) {пиксели [индекс].setPixelColor (i, пиксели [индекс]. Color (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}

//// dimColor набор

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

if (startState [индекс]) {оттенък [индекс] = карта (colorVal [индекс], 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 값 color (colorVal 에) getRGB (оттенък [индекс], 255, BC, rgb_colors, индекс); за (int i = 0; i <NUMPIXELS; i ++) {пиксели [индекс].setPixelColor (i, пиксели [индекс]. Цвят (rgb_colors [индекс] [0], rgb_colors [индекс] [1], rgb_colors [индекс] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (индекс); // 컬러 셋팅 하지 않음}

Стъпка 6: Завършен поглед

Препоръчано: