Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
"İşığı öz əlimlə idarə edə bilərəmmi və öz iradəmi ifadə edə bilərəmmi" fikri ilə başladım.
Öz rənglərinizi özünüz yaratmağa, o rənglərlə öz naxışlarınızı dizayn etməyə və müxtəlif animasiya effektləri yaşamağa imkan verən 'Dot Light Pattern' dir.
Addım 1: Materiallar
- Arduino UNO x 13
- WS2901 və ya WS2811 piksel LED şeridi (130 LED)
- Düymə açarı x 1
- Keçid açarı x 65
- Potensial ölçən x 65
- Göy qurşağı kabeli
- SMPS -in gücü kifayətdir
- Dirijor kabeli
- Akrilik şəffaf yuvarlaq çubuq (diametri 30 mm)
- Qara rəngli Akril lövhə (5T) (500mm*790mm) x 2, (500mm*35mm) x 2, (790mm*35mm) x 2
Addım 2: Tikinti Planı
Addım 3: Hardware: Circuit Design
-
Akril lövhəni yuxarıdakı quruluş kimi kəsin. (addım 2 -ə baxın)
- Potensialölçən çuxurun yuxarı və aşağı hissəsinə bir ədəd neo-piksel LED qoyulur və cəmi 65 cüt neo-piksel LED bağlanır.
- Bir cüt neo-piksel LED tək Arduino pinini yaratmaq üçün bir araya gətirilir.
- Potensial ölçmə deliklərinə 65 potensial ölçmə cihazı yerləşdirin. (Neo-pikselli bir səthin əks tərəfinə qoyun.)
- Keçid deliklərinə uyğun olmaq üçün 65 keçid bağlayın.
- Bir Arduino UNO -ya beş ədəd 65 ədəd aparat bağlamaq üçün on üç zonanın hər birinə cəmi on üç Arduino UNO bağlanmışdır.
- Əlavə edilmiş fotoşəkildə göstərildiyi kimi, potensial ölçmə cihazlarını, açar açarları və neo-piksel LED-ləri Arduino UNO-nun pinlərinə tellə bağlayın. (addım 2 -ə baxın)
- Bir neçə Arduino UNO -nun GND və 5V pinləri kabel tellərinə toplanır, sonra xarici gücə qoşulur. (addım 2 -ə baxın)
- Hava təzyiqi ilə tozları çıxarın.
Addım 4: Avadanlıq: Akril Kəsmə
-
Akrilik çubuğu 50 mm uzunluğunda kəsin.
- Akrilik çubuğun bir tərəfi potensialölçənin nəzarətçi hissəsinə uyğun olması üçün ölçü və dərinliyə qədər qazılır.
- Akrilik çubuq, potensial ölçmə cihazına yaxşı uyğunlaşa bilən bir boşluq üçün çuxurdan bir qədər geniş kəsilmişdir.
- İşığın səliqəli şəkildə ötürülməsi üçün qarşı tərəf bir az zımpara verir.
Addım 5: Arduino Proqramlaşdırma Kodu
www.kasperkamperman.com/blog/arduino/ardui…
'hsb to rgb' kodu 를 참고 한 사이트
#daxil edin
// 'adafruit_neopixel' 헤더 파일 라는 외부 라이브러리 를 를 포함
// 네오 픽셀 연결 핀 번호 선언
#PIN1 təyin edin 2 #PIN2 təyin edin 3 #PIN3 təyin edin 4 #PIN4 təyin edin 5 #PIN5 təyin edin 6
#define NUMPIXELS 2 // LED 갯수
#NUM_LIGHTS 5 təyin edin // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)
// 네오 픽셀 오브젝트 Array 선언
Adafruit_NeoPixel piksel = {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 bayt 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, }; //
etibarsız getRGB (int hue, int sat, int val, int colors [5] [3], int index) {
val = dim_curve [val]; sat = 255 - dim_curve [255 - oturdu];
// HSB, HSB /HSV və ya RGB
// dim_curve 는 밝기 값 및 채도 (반전) 에서만 사용 됩니다. // 이것은 가장 자연스럽게 보입니다.
int r;
int g; int b; int bazası;
əgər (oturdu == 0) {
rənglər [indeks] [0] = dəyər; rənglər [indeks] [1] = val; rənglər [indeks] [2] = val; } başqa {
baz = ((255 - sat) * val) >> 8;
keçid (rəng / 60) {
hal 0: r = val; g = (((val - əsas) * rəng) / 60) + əsas; b = əsas; fasilə;
hal 1:
r = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; g = dəyər; b = əsas; fasilə;
hal 2:
r = əsas; g = dəyər; b = (((val - əsas) * (ton % 60)) / 60) + əsas; fasilə;
hal 3:
r = əsas; g = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; b = dəyər; fasilə;
hal 4:
r = (((val - əsas) * (ton % 60)) / 60) + əsas; g = əsas; b = dəyər; fasilə;
hal 5:
r = val; g = əsas; b = (((val - əsas) * (60 - (ton % 60))) / 60) + əsas; fasilə; }
rənglər [indeks] [0] = r;
rənglər [indeks] [1] = g; rənglər [indeks] [2] = b; }
}
int rgb_colors [NUM_LIGHTS] [3]; // 네오 픽셀 오브젝트 갯수 마다 rgb rəngi 선언
int hue [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 hue 선언 int oturdu [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 밝기 밝기 서언
// 일반 변수 선언
int startSwitch = {8, 9, 10, 11, 12}; // on/off ole 핀 번호 boolean startState = {yalan, yalan, yalan, yalan, yalan}; // aç/söndür 상태 변수
const int colorPin = {A0, A1, A2, A3, A4}; // 가변 저항 핀 번호
int colorVal = {0, 0, 0, 0, 0}; // 가변 저항 초기 값
int animationButton = 7; // 애니메이션 모드 변환 버튼 핀 번호
/////////////////////////////////////////////////
// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 선언 // 디 바운싱? Button 시간 내 많은 이벤트 가 발생 하는것 대 문제 문제 에 해결 으로 으로 해결 button button // last 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 로 로 로 işarəsiz uzun lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 imzasız uzun 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수
///////////////////////////////////////////////////////
// 멀티 테스 킹 애니메이션 을 위한 시간 변수 선언
imzasız uzun cari Milis; // 현재 시간 변수
imzasız uzun B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 işarəsiz uzun DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) işarəsiz uzun R_previousMillis; // 레인보우 타이머 imzasız uzun D_previousMillis; // 디밍 타이머
boolean firstRainbow = doğru; // 레인보우 색상 초기화 상태 변수
int RainbowSpeed; // 레인보우 변환 변수
int Bright = 100; // Br 초기 값 int BrightnessFactor = 1; // 디밍 증감 값 ///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
boş quraşdırma () {
for (int i = 0; i <NUM_LIGHTS; i ++) {piksel .begin (); // 네오 픽셀 오브젝트 초기화}
// 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startSwitch , INPUT_PULLUP); // aç/söndür 버튼 인풋 설정} pinMode (animasiyaButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i ++) {B_Interval = int (təsadüfi (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}
Serial.begin (9600); // 통신 설정
}
boşluq döngəsi () {
MODE = CheckAnimMode (); // 모드 에 애니메이션 체크 모드 모드 함수 를 넣는다
// 버튼 과 가변 저항 을 값 읽 읽 읽 읽 읽 에 다 한다.
for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startSwitch ); // aç/söndür 버튼 에서 읽은 값 의 반대 값 startState 에 넣어 준다 // startState = digitalRead (startSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 초기 에 에 넣는다}
keçid (MODE) {// 애니메이션 함수 스위치 문
halda 0: on (); // on 함수 실행 fasilə; // 조건문 에서 빠져 나가라
hal 1:
göy qurşağı (); // göy qurşağı 함수 실행 qırılma;
hal 2:
karartma (); // karartma 함수 실행 qırılma;
hal 3:
yanıb -sönən (); // yanıb -sönən 함수 실행 qırılma; }
for (int i = 0; i <NUM_LIGHTS; i ++) {piksel .show (); // 네오 픽셀 오브젝트 배열 켜라}
}
/////////////////////////////////////////////////////////////
int CheckAnimMode () {
// 애니메이션 선택 버튼 을 읽어 모드 를 결정 한다.
//////////////////////////////////////////////////// /// currentMillis = milis (); // oxu int oxu = digitalRead (animationButton); if (oxu! = lastButtonState) {// 입력 핀 으로부터 이전 의 버튼 의 상태 상태 비교 비교 D lastDebounceTime = millis (); // 현재 시간 을 출력 핀 이 마지막 으로 전환 전환 된 시간 에 넣음}
if ((currentMillis - lastDebounceTime)> debounceDelay) {
əgər (oxu! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 값 값 과 비교
buttonState = oxu; // 판독 값 을 düyməsiDövlət 에 대입
əgər (buttonState == LOW) {// 버튼 상태 가 꺼져 있다면
MODE ++; // 버튼 모드 1 씩 증가 əgər (MODE> 3) {MODE = 0; firstRainbow = doğru; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 Parlaq = 15; // 밝기 는 15}}}}
lastButtonState = oxu; // 판독 값 을 이전 의 의 버튼 상태 에 대입
MODE qayıt; 함수 를 종료 하고 rejimi 함수 로 값 을 리턴 하라}
////////////////////////////////////////////////////////////////////
// animasiya rejimi funksiyası
// haqqında
void on () {Serial.println ("on"); // 시리얼 모니터 에 üçün int 써라 (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅}}
// Göy qurşağı
boş göy qurşağı () {Serial.println ("yağış"); // 시리얼 모니터 에 yağış 을 써라 if (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = yalan; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - R_previousMillis> R_Interval) {// 흐른 시간 값 이 레인보우 인터벌 값 보다 크면 R_previousMillis = currentMillis; // Göy qurşağı sürəti += 10; // 레인보우 변환 변수 에 10 을 더해라}
for (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, (colorVal +RainbowSpeed) % 1023); // 레인보우 컬러 셋팅}
}
// Qaranlıq
boşluq qaralması () {Serial.println ("dimm"); // 시리얼 모니터 에 dimm 을 써라 Serial.println (Parlaq); // 시리얼 모니터 에 Parlaq 를 써라 if (currentMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 값 보다 크면 D_previousMillis = currentMillis; // Parlaq += Parlaqlıq Faktoru; // 밝기 에 디밍 증감 값 1 씩 올려라} if (Bright 254) {BrightnessFactor = -1 * BrightnessFactor; } Parlaq = məhdudlaşdır (Parlaq, 99, 254); // 변수 밝기 값 을 최소값 99 ~ 254 사이 의 값 으로 한으로 한다
for (int i = 0; i <NUM_LIGHTS; i ++) {dim_color_set (i, Bright); // 디밍 컬러 셋팅}}
// yanıb -sönən
boş göz qırpmaq () {Serial.println ("yanıb sönmək"); // 시리얼 모니터 에 göz qırpmaq 를 써라
üçün (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 ); // 가변 저항 값 에 따라 컬러 셋팅} başqa {noColor_set (i); // 읽히지 않으면 컬러 셋팅 하지 않음 않음}}
}
////////////////////////////////////////////////////////////////////////////////////////
// əsas funksiya
// rəng dəsti
void color_set (int indeksi, int colorSenser) {
if (startState [index]) {hue [index] = map (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 을 0 ~ 359 값 으로 한 한 값 을 color 색상 값 color (colorSenser 에) getRGB (rəng [indeks], 255, 255, rgb_colors, indeks); for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [indeks]. Rəng (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} başqa noColor_set (indeks); // 컬러 셋팅 하지 않음}
////// noRəng dəsti
etibarsız noColor_set (int indeksi) {// 컬러 셋팅 하지 않는 함수 설정
for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [index]. Rəng (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}
//// dimColor dəsti
etibarsız dim_color_set (int indeksi, int BC) {// 디밍 컬러 셋팅 함수 설정
if (startState [index]) {hue [index] = map (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 을 0 ~ 359 값 으로 한 한 값 을 color 색상 값 color color (colorVal 에) getRGB (hue [index], 255, BC, rgb_colors, index); for (int i = 0; i <NUMPIXELS; i ++) {piksel [index].setPixelColor (i, piksel [indeks]. Rəng (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} başqa noColor_set (indeks); // 컬러 셋팅 하지 않음}