جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
بدأت بفكرة "هل يمكنني التحكم في الضوء بيدي والتعبير عن إرادتي؟"
إنه "نمط Dot Light" الذي يسمح لك بإنشاء الألوان الخاصة بك بنفسك ، وتصميم أنماطك الخاصة بهذه الألوان ، وتجربة تأثيرات الرسوم المتحركة المختلفة.
الخطوة 1: المواد
- Arduino UNO × 13
- WS2901 أو WS2811 بكسل لشريط LED (130 LEDS)
- زر التبديل × 1
- التقط التبديل x 65
- مقياس الجهد × 65
- كابل قوس قزح
- قوة كافية SMPS
- كابل موصل
- شريط دائري أكريليك شفاف (قطر 30 مم)
- لوح أكريليك أسود اللون (5T) (500 مم * 790 مم) × 2 ، (500 مم * 35 مم) × 2 ، (790 مم * 35 مم) × 2
الخطوة الثانية: خطة البناء
الخطوة 3: الأجهزة: تصميم الدوائر
-
قطع لوحة الاكريليك مثل الهيكل أعلاه. (انظر الخطوة 2)
- يتم وضع قطعة واحدة من LED ذات البكسل الجديد في الجزء العلوي والسفلي من فتحة مقياس الجهد ، ويتم إرفاق ما مجموعه 65 زوجًا من مصابيح LED ذات البكسل الجديد.
- تم توصيل زوج من مصابيح LED ذات البكسل الجديد معًا لتشكيل دبوس Arduino واحد.
- قم بملاءمة 65 مقياس جهد في فتحات مقياس الجهد. (ضعها على الجانب المقابل لسطح جديد البكسل).
- قم بتوصيل 65 مفتاحًا سريعًا لتتناسب مع فتحات المفتاح.
- يتم إرفاق ما مجموعه ثلاثة عشر Arduino UNO بكل منطقة من المناطق الثلاثة عشر من أجل ربط خمس قطع من 65 قطعة من الأجهزة في Arduino UNO واحد.
- كما هو موضح في الصورة المرفقة ، قم بتوصيل مقاييس الجهد والمفاتيح المفاجئة ومصابيح LED ذات البكسل الجديد بمسامير Arduino UNO عن طريق السلك. (انظر الخطوة 2)
- يتم تجميع دبابيس GND و 5 V للعديد من Arduino UNOs على أسلاك كبلية ، ثم توصيلها بالطاقة الخارجية. (انظر الخطوة 2)
- إزالة الغبار عن طريق ضغط الهواء.
الخطوة 4: الأجهزة: قطع الأكريليك
-
قطع قضيب الاكريليك بطول 50 مم.
- يتم حفر جانب واحد من قضيب الأكريليك بالحجم والعمق لمطابقة جزء التحكم في مقياس الجهد.
- يتم قطع قضيب الأكريليك بشكل أوسع قليلاً من الفتحة للحصول على خلوص يمكن أن يتناسب جيدًا مع مقياس الجهد.
- يوفر الجانب الآخر القليل من ورق الصنفرة بحيث يمكن نقل الضوء بدقة.
الخطوة 5: كود برمجة اردوينو
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 // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)
// 네오 픽셀 오브젝트 Array 선언
Adafruit_NeoPixel pixels = {Adafruit_NeoPixel (NUMPIXELS، PIN1، NEO_GRB + NEO_KHZ800)، Adafruit_NeoPixel (NUMPIXELS، PIN2، NEO_GRB + NEO_KHZ800)، Adafruit_Neo_Gixel (NUMPIXELS، PIN3 + NEOPixel 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 sat ، int val ، int colours [5] [3] ، int index) {
val = dim_curve [val] ؛ sat = 255 - dim_curve [255 - sat] ؛
// 색조، 채도 및 밝기 (HSB / HSV) 를 RGB 로 변환
// dim_curve 는 밝기 값 및 채도 (반전) 에서만 사용 됩니다. // 이것은 가장 자연스럽게 보입니다.
الباحث ص
الباحث ز الباحث ب ؛ قاعدة كثافة العمليات
إذا (جلس == 0) {
الألوان [الفهرس] [0] = val ؛ الألوان [الفهرس] [1] = val ؛ الألوان [الفهرس] [2] = val ؛ } آخر {
القاعدة = ((255 - جلس) * فال) >> 8 ؛
التبديل (هوى / 60) {
الحالة 0: r = val ؛ g = (((val - base) * hue) / 60) + قاعدة ؛ ب = قاعدة ؛ استراحة؛
حالة 1:
r = (((val - base) * (60 - (hue٪ 60))) / 60) + قاعدة ؛ ز = فال ؛ ب = قاعدة ؛ استراحة؛
الحالة 2:
ص = قاعدة ؛ ز = فال ؛ ب = (((val - Base) * (hue٪ 60)) / 60) + قاعدة ؛ استراحة؛
الحالة 3:
ص = قاعدة ؛ g = (((val - base) * (60 - (hue٪ 60))) / 60) + قاعدة ؛ ب = فال ؛ استراحة؛
الحالة 4:
r = (((val - base) * (hue٪ 60)) / 60) + قاعدة ؛ ز = قاعدة ؛ ب = فال ؛ استراحة؛
الحالة 5:
ص = فال ؛ ز = قاعدة ؛ ب = (((val - Base) * (60 - (hue٪ 60))) / 60) + قاعدة ؛ استراحة؛ }
الألوان [الفهرس] [0] = r ؛
الألوان [الفهرس] [1] = ز ؛ الألوان [الفهرس] [2] = ب ؛ }
}
int rgb_colors [NUM_LIGHTS] [3] ؛ // 네오 픽셀 오브젝트 갯수 마다 لون RGB 선언
درجة اللون [NUM_LIGHTS] ، // 네오 픽셀 오브젝트 갯수 마다 hue 선언 int sat [NUM_LIGHTS] ؛ // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS] ؛ // 네오 픽셀 오브젝트 갯수 마다 밝기 서언
// 일반 변수 선언
int startSwitch = {8، 9، 10، 11، 12} ؛ // on / off 버튼 핀 번호 boolean startState = {false، false، false، false، false} ؛ // تشغيل / إيقاف 상태 변수
const int colorPin = {A0، A1، A2، A3، A4} ؛ // 가변 저항 핀 번호
int colorVal = {0 ، 0 ، 0 ، 0 ، 0} ؛ // 가변 저항 초기 값
زر الرسوم المتحركة int = 7 ؛ // 애니메이션 모드 변환 버튼 핀 번호
/////////////////////////////////////////////////
// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱؟ 시간 내 많은 이벤트 가 발생 에 대한 문제 에 대해서 지정된 시간 간격 으로 함수 를 호출 하여 int buttonState ؛ // 입력 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH ؛ // 이전 의 판독 값 은 켜진 상태 بدون توقيع long lastDebounceTime = 0 ؛ // 출력 핀 이 마지막 으로 전환 된 시간 은 0 debounceDelay الطويل غير الموقعة = 50 ؛ // 디 바운싱 타임 설정 ؛ 출력 이 깜빡 이면 증가 한다 int MODE = 0 ؛ // 애니메이션 모드 변수
int B_Interval [5] ؛ // 블 링킹 을 위한 각 모듈 의 랜덤 속도 변수
كثافة B_Min = 100 ؛ // 블 링킹 최단 속도 ؛ كثافة العمليات B_Max = 500 ؛ // 블 링킹 최장 속도 ؛ int R_Interval = 50 ؛ // 레인보우 애니메이션 속도 변수 int D_Interval = 10 ؛ // 디밍 속도 변수
منطقية B_state [5] ؛ // 블 링킹 을 위한 각 모듈 의 상태 변수
///////////////////////////////////////////////////////
// 멀티 테스 킹 애니메이션 을 위한 시간 변수 선언
تيار طويل غير موقع // 현재 시간 변수
طويلة بدون توقيع B_previousMillis [5] ؛ // 각 모듈 의 블 링킹 타이머 بدون توقيع طويل DR_Millis [5] ؛ // 각 모듈 의 디밍 랜덤 타이머 (예비) بدون توقيع طويل R_previousMillis ؛ // 레인보우 타이머 بدون توقيع طويل D_previousMillis ؛ // 디밍 타이머
أول قوس قزح منطقي = صحيح ؛ // 레인보우 색상 초기화 상태 변수
Int RainbowSpeed؛ // 레인보우 변환 변수
int برايت = 100 ؛ // 디밍 초기 값 int BrightnessFactor = 1 ؛ // 디밍 증감 값 ///////////////////////////////////////////////// //////////////////////////////////////////
الإعداد باطل() {
لـ (int i = 0 ؛ i <NUM_LIGHTS ؛ i ++) {بكسل .begin () ؛ // 네오 픽셀 오브젝트 초기화}
// 버튼 인풋 설정
لـ (int i = 0 ؛ i <NUM_LIGHTS ؛ i ++) {pinMode (StartSwitch ، INPUT_PULLUP) ؛ // on / off 버튼 인풋 설정} pinMode (زر الرسوم المتحركة ، INPUT_PULLUP) ؛ // 애니메이션 버튼 인풋 설정
لـ (int i = 0؛ i <NUM_LIGHTS؛ i ++) {B_Interval = int (random (B_Min، B_Max)) ؛ // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}
Serial.begin (9600) ؛ // 통신 설정
}
حلقة فارغة() {
الوضع = CheckAnimMode () ، // 모드 에 애니메이션 체크 모드 함수 를 넣는다
// 버튼 과 가변 저항 을 값 을 각각 읽어 변수 에 지정 한다.
لـ (int i = 0؛ i <NUM_LIGHTS؛ i ++) {startState =! digitalRead (beginSwitch ) ؛ // on / off 버튼 에서 읽은 값 의 반대 값 을 startState 에 넣어 준다 // startState = digitalRead (StartSwitch ) ؛ colorVal = analogRead (colorPin ) ؛ // 가변 저항 에서 읽은 값 을 가변 저항 초기 값 에 넣는다}
التبديل (الوضع) {// 애니메이션 함수 스위치 문
الحالة 0: في () ؛ // على 함수 실행 استراحة ؛ // 조건문 에서 빠져 나가라
حالة 1:
قوس المطر()؛ // قوس قزح 함수 실행 استراحة ؛
الحالة 2:
يعتم () ؛ // يعتم 함수 실행 استراحة ؛
الحالة 3:
رمش العين()؛ // وامض 함수 실행 استراحة ؛ }
لـ (int i = 0 ؛ i <NUM_LIGHTS ؛ i ++) {بكسل .show () ؛ // 네오 픽셀 오브젝트 배열 켜라}
}
/////////////////////////////////////////////////////////////
int CheckAnimMode () {
// 애니메이션 선택 버튼 을 읽어 모드 를 결정 한다.
////////////////////////////////////////////////////// /// currentMillis = millis () ؛ // 시간 측정 int القراءة = digitalRead (زر الرسوم المتحركة) ؛ إذا (read! = lastButtonState) {// 입력 핀 으로부터 이전 의 버튼 의 상태 와 판독 값 비교 lastDebounceTime = millis () ؛ // 현재 시간 을 출력 핀 이 마지막 으로 전환 된 시간 에 넣음}
إذا ((currentMillis - lastDebounceTime)> debounceDelay) {
إذا (read! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 값 과 비교
buttonState = قراءة ؛ // 판독 값 을 buttonState 에 대입
إذا (buttonState == LOW) {// 버튼 상태 가 꺼져 있다면
الوضع ++ ؛ // 버튼 모드 1 씩 증가 إذا (MODE> 3) {MODE = 0 ؛ firstRainbow = صحيح ؛ // 레인보우 색상 초기화 상태 켜짐 عامل السطوع = 1 ؛ // 디밍 증감 값 ساطع = 15 ؛ // 밝기 는 15}}}
lastButtonState = قراءة ؛ // 판독 값 을 이전 의 버튼 상태 에 대입
وضع الإرجاع ؛ 함수 를 종료 하고 الوضع 함수 로 값 을 리턴 하라}
////////////////////////////////////////////////////////////////////
// وظيفة وضع الرسوم المتحركة
//تشغيل
void on () {Serial.println ("on") ؛ // 시리얼 모니터 에 على 을 써라 لـ (int i = 0 ؛ i <NUM_LIGHTS ؛ i ++) {color_set (i، colorVal ) ؛ // 가변 저항 값 에 따라 컬러 셋팅}}
//قوس المطر
قوس قزح فارغ () {Serial.println ("مطر") ؛ // 시리얼 모니터 에 rain 을 써라 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) ؛ // 레인보우 컬러 셋팅}
}
// يعتم
تعتيم باطل () {Serial.println ("dimm") ؛ // 시리얼 모니터 에 dimm 을 Serial.println (برايت) ؛ // 시리얼 모니터 에 Bright 를 써라 if (currentMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 값 보다 크면 D_previousMillis = currentMillis ؛ // 현재 시간 을 이전 의 디밍 시간 에 넣어 라 Bright + = BrightnessFactor ؛ // 밝기 에 디밍 증감 값 1 씩 올려라} إذا (Bright 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 = currentMillis ، // 현재 시간 을 이전 의 블링크 시간 에 넣어 라 B_state =! B_state ؛ // 각 모듈 의 블 링킹 상태 변수 의 값 의 반대 값 을 대입 하라}} لـ (int i = 0؛ i <NUM_LIGHTS؛ i ++) {if (B_state ) {// 모듈 의 블 링킹 상태 가 읽 히면 color_set (i، colorVal ) ؛ // 가변 저항 값 에 따라 컬러 셋팅} else {noColor_set (i) ؛ // 읽히지 않으면 컬러 셋팅 하지 않음}}
}
////////////////////////////////////////////////////////////////////////////////////////
// الوظيفة الأساسية
// مجموعة اللون
مجموعة ألوان باطلة (مؤشر كثافة العمليات ، كثافة الألوان كثافة العمليات) {
if (startState [index]) {hue [index] = map (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
void noColor_set (فهرس int) {// 컬러 셋팅 하지 않는 함수 설정
لـ (int i = 0؛ i <NUMPIXELS؛ i ++) {pixels [index].setPixelColor (i، pixels [index]. Color (0، 0، 0)) ؛ } // 픽셀 컬러 세팅 을 0، 0، 0 으로 설정}
//// تعيين اللون الخافت
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) ؛ لـ (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) ؛ // 컬러 셋팅 하지 않음}