Obsah:
- Krok 1: Materiály
- Krok 2: Stavební plán
- Krok 3: Hardware: Návrh obvodu
- Krok 4: Hardware: Řezání akrylem
- Krok 5: Programovací kód Arduino
- Krok 6: Dokončený vzhled
Video: Bodový světelný vzor: 6 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:22
Začal jsem s myšlenkou „Mohu ovládat světlo vlastníma rukama a projevovat vlastní vůli?“
Jedná se o 'Dot Light Pattern', který vám umožňuje vytvářet vlastní barvy sami, navrhovat vlastní vzory s těmito barvami a zažít různé efekty animace.
Krok 1: Materiály
- Arduino UNO x 13
- Pixelový LED pás WS2901 nebo WS2811 (130 LED)
- Tlačítkový spínač x 1
- Zapínací spínač x 65
- Potenciometr x 65
- Duhový kabel
- Dostatečně výkonné SMPS
- Vodičový kabel
- Akrylová průhledná kulatá tyč (průměr 30 mm)
- Akrylová deska černé barvy (5T) (500 mm*790 mm) x 2, (500 mm*35 mm) x 2, (790 mm*35 mm) x 2
Krok 2: Stavební plán
Krok 3: Hardware: Návrh obvodu
-
Odřízněte akrylovou desku jako výše uvedená struktura. (viz krok 2)
- Jeden kus neo-pixelové LED diody je umístěn na horní a spodní část otvoru potenciometru a je připojeno celkem 65 párů neo-pixelových LED.
- Dvojice neo-pixelových LED diod je spojena dohromady a tvoří jeden pin Arduino.
- Do otvorů potenciometru nasaďte 65 potenciometrů. (Umístěte jej na opačnou stranu neo-pixelového povrchu.)
- Připojte 65 západkových spínačů tak, aby odpovídaly otvorům pro spínače.
- Ke každé ze třinácti zón je připojeno celkem třináct Arduino UNO, aby bylo možné spojit pět kusů 65 kusů hardwaru do jednoho Arduino UNO.
- Jak je znázorněno na přiložené fotografii, připojte potenciometry, zapínací spínače a neo-pixelové LED k pinům Arduino UNO pomocí drátu. (viz krok 2)
- Piny GND a 5V několika Arduino UNO jsou shromažďovány do kabelových vodičů a poté připojeny k externímu napájení. (viz krok 2)
- Odstraňte prach tlakem vzduchu.
Krok 4: Hardware: Řezání akrylem
-
Odřízněte akrylovou tyč na délku 50 mm.
- Jedna strana akrylové tyče je vyvrtána do velikosti a hloubky, aby odpovídala řídicí části potenciometru.
- Akrylová tyč je oříznuta o něco širší než otvor pro vůli, která se dobře vejde do potenciometru.
- Na druhé straně je malý brusný papír, aby bylo možné úhledně přenášet světlo.
Krok 5: Programovací kód Arduino
www.kasperkamperman.com/blog/arduino/ardui…
Kód 'hsb to rgb' 를 참고 한 사이트
#zahrnout
// '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 // 작동 모듈 갯수 (네오 픽셀 오브젝트 갯수)
// 네오 픽셀 오브젝트 Pole 선언
Adafruit_NeoPixel pixelů = {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 () 를 위한 변수 와 함수 선언
konstantní bajt 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 odstín, int sat, int val, int barvy [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 základna;
if (sat == 0) {
barvy [index] [0] = val; barvy [index] [1] = val; barvy [index] [2] = val; } else {
základ = ((255 - sat) * val) >> 8;
přepínač (odstín / 60) {
případ 0: r = val; g = (((val - báze) * odstín) / 60) + báze; b = základna; přestávka;
případ 1:
r = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; g = val; b = základna; přestávka;
případ 2:
r = základ; g = val; b = (((val - báze) * (odstín % 60)) / 60) + báze; přestávka;
případ 3:
r = základ; g = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; b = val; přestávka;
případ 4:
r = (((val - báze) * (odstín % 60)) / 60) + báze; g = základ; b = val; přestávka;
případ 5:
r = val; g = základ; b = (((val - báze) * (60 - (odstín % 60))) / 60) + báze; přestávka; }
barvy [index] [0] = r;
barvy [index] [1] = g; barvy [index] [2] = b; }
}
int rgb_colors [NUM_LIGHTS] [3]; // 네오 픽셀 오브젝트 갯수 마다 barva RGB 선언
int odstín [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 odstín 선언 int sat [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 밝기 서언
// 일반 변수 선언
int startsSwitch = {8, 9, 10, 11, 12}; // zapnuto/vypnuto 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // zapnutí/vypnutí 상태 변수
const int colorPin = {A0, A1, A2, A3, A4}; // 가변 저항 핀 번호
int colorVal = {0, 0, 0, 0, 0}; // 가변 저항 초기 값
int animationButton = 7; // 애니메이션 모드 변환 버튼 핀 번호
/////////////////////////////////////////////////
// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? 해결 시간 내 많은 이벤트 가 발생 하는것 에 대한 문제 에 대해서 대해서 지정된 시간 간격 으로 함수 를 호출 button button int tlačítkoState; // 입력 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 bez znaménka dlouhý lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 nepodepsané dlouhé 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수
///////////////////////////////////////////////////////
// 멀티 테스 킹 애니메이션 을 위한 시간 변수 선언
nepodepsaný dlouhý proud Millis; // 현재 시간 변수
bez znaménka dlouhý B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 nepodepsané dlouhé DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) nepodepsané dlouhé R_previousMillis; // 레인보우 타이머 nepodepsané dlouhé D_previousMillis; // 디밍 타이머
boolean firstRainbow = true; // 레인보우 색상 초기화 상태 변수
int RainbowSpeed; // 레인보우 변환 변수
int Bright = 100; // 디밍 초기 값 int BrightnessFactor = 1; // 디밍 증감 값 /////////////////////////////////////////////////////// ////////////////////////////////////////////
neplatné nastavení () {
pro (int i = 0; i <NUM_LIGHTS; i ++) {pixely .begin (); // 네오 픽셀 오브젝트 초기화}
// 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startsSwitch , INPUT_PULLUP); // zapnuto/vypnuto 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i ++) {B_Interval = int (random (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}
Serial.begin (9600); // 통신 설정
}
prázdná smyčka () {
MODE = CheckAnimMode (); // 모드 에 애니메이션 체크 모드 함수 를 넣는다
// 버튼 과 가변 저항 을 값 을 각각 읽어 변수 에 지정 한다 한다.
for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startsSwitch ); // zapnutí/vypnutí 버튼 에서 읽은 값 의 반대 값 을 startState 에 넣어 준다 // startState = digitalRead (startsSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 값 에 넣는다 넣는다}
přepínač (REŽIM) {// 애니메이션 함수 스위치 문
případ 0: on (); // na 함수 실행 break; // 조건문 에서 빠져 나가라
případ 1:
duha(); // duha 함수 실행 break;
případ 2:
stmívání (); // stmívání 함수 실행 break;
případ 3:
bliká (); // bliká 함수 실행 přestávka; }
pro (int i = 0; i <NUM_LIGHTS; i ++) {pixely .show (); // 네오 픽셀 오브젝트 배열 켜라}
}
/////////////////////////////////////////////////////////////
int CheckAnimMode () {
// 애니메이션 선택 버튼 을 읽어 모드 를 결정 한다.
////////////////////////////////////////////////////////// /// currentMillis = millis (); // 시간 측정 int reading = digitalRead (animationButton); if (reading! = lastButtonState) {// 입력 핀 으로부터 이전 의 버튼 의 의 상태 와 판독 값 비교 lastDebounceTime = millis (); // 현재 시간 을 출력 핀 이 마지막 으로 전환 된 시간 에 넣음 넣음}
if ((currentMillis - lastDebounceTime)> debounceDelay) {
if (reading! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 판독 값 과 비교
buttonState = čtení; // Tlačítko 판독 값 을Stát 에 대입
if (buttonState == LOW) {// 버튼 상태 가 꺼져 있다면
MODE ++; // 버튼 모드 1 씩 증가 if (MODE> 3) {MODE = 0; firstRainbow = true; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 Jasný = 15; // 밝기 는 15}}}}
lastButtonState = čtení; // 판독 값 을 이전 의 버튼 상태 에 대입
návrat MODE; 함수 를 종료 하고 režim 함수 로 값 을 리턴 하라 하라
////////////////////////////////////////////////////////////////////
// funkce režimu animace
//na
void on () {Serial.println ("on"); // 시리얼 모니터 에 na 을 써라 pro (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅}}
//Duha
void rainbow () {Serial.println ("déšť"); // 시리얼 모니터 에 déšť 을 써라 if (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = false; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - R_previousMillis> R_Interval) {// 흐른 시간 값 이 레인보우 인터벌 인터벌 값 보다 크면 R_previousMillis = currentMillis; // 현재 시간 을 이전 의 레인보우 시간 에 넣어 라 RainbowSpeed += 10; // 레인보우 변환 변수 에 10 을 더해라}
pro (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, (colorVal +RainbowSpeed) % 1023); // 레인보우 컬러 셋팅}
}
// Stmívání
void dimming () {Serial.println ("dimm"); // 시리얼 모니터 에 stmívání 을 써라 Serial.println (jasný); // 시리얼 모니터 에 Jasné 를 써라 if (aktuálníMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 인터벌 값 보다 크면 D_previousMillis = aktuálníMillis; // 현재 시간 을 이전 의 디밍 시간 에 넣어 라 Bright += BrightnessFactor; // 밝기 에 디밍 증감 값 1 씩 올려라} if (Bright 254) {BrightnessFactor = -1 * BrightnessFactor; } Bright = omezení (Bright, 99, 254); // 변수 밝기 값 을 최소값 99 ~ 최대 값 254 사이 의 값 으로 한정 한다
for (int i = 0; i <NUM_LIGHTS; i ++) {dim_color_set (i, Bright); // 디밍 컬러 셋팅}}
// Bliká
neplatné blikání () {Serial.println ("blikání"); // 시리얼 모니터 에 mrkněte 를 써라
for (int i = 0; i B_Interval ) {// 흐른 시간 값 이 블링크 인터벌 값 보다 보다 크면
B_previousMillis = currentMillis; // 현재 시간 을 이전 의 블링크 시간 에 넣어 라 B_state =! B_state ; // 각 모듈 의 블 링킹 상태 변수 의 값 의 반대 값 을 을 대입 하라}} pro (int i = 0; i <NUM_LIGHTS; i ++) {if (B_state ) {// 모듈 의 블 링킹 상태 가 읽 히면 color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅} else {noColor_set (i); // 읽히지 않으면 컬러 셋팅 하지 않음}}
}
////////////////////////////////////////////////////////////////////////////////////////
// základní funkce
// barevná sada
void color_set (int index, int colorSenser) {
if (startState [index]) {hue [index] = mapa (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 color (colorSenser 에) getRGB (odstín [index], 255, 255, rgb_colors, index); pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [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
neplatné noColor_set (int index) {// 컬러 셋팅 하지 않는 함수 설정
pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [index]. Color (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}
//// sada dimColor
neplatné dim_color_set (int index, int BC) {// 디밍 컬러 셋팅 함수 설정
if (startState [index]) {hue [index] = mapa (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 지정 (colorVal 에) getRGB (odstín [index], 255, BC, rgb_colors, index); pro (int i = 0; i <NUMPIXELS; i ++) {pixely [index].setPixelColor (i, pixely [index]. Color (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } /// 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} else noColor_set (index); // 컬러 셋팅 하지 않음}
Krok 6: Dokončený vzhled
Doporučuje:
Vzor záření ESP8266: 7 kroků
Vzor záření ESP8266: ESP8266 je populární modul mikrokontroléru, protože jej lze připojit k internetu prostřednictvím integrovaného WiFi. To fandovi otevírá mnoho příležitostí vyrábět dálkově ovládané gadgety a zařízení IoT s minimem extra hardw
Jak udělat vzor návrhu Singleton v C ++: 9 kroků
Jak provést návrhový vzor Singleton v C ++: Úvod: Účelem této instrukční příručky je naučit uživatele, jak implementovat návrhový vzor singletonu do jejich programu C ++. Přitom tato instrukční sada čtenáři také vysvětlí, proč jsou prvky singletonu způsobem
Stolní světelný ornament a světelný znak dveří: 8 kroků (s obrázky)
Ornament stolního světla a světelný znak dveří: Tento tutoriál vám ukáže, jak naprogramovat a postavit ozdobu stolu, která se rozsvítí. Tato světla mění barvu v průběhu hodiny. Naučíte se také programovat a postavit doprovodný dveřní nápis, který se rozsvítí. Dveře můžete použít
Skládací světelný box / světelný stan v komerční kvalitě za 20 $ / 20 minut: 7 kroků (s obrázky)
Skládací světelný box / světelný stan v komerční kvalitě za 20 $ / 20 minut: Pokud jste hledali světelný box pro vlastní výrobky nebo zblízka fotografie, už víte, že máte mnoho možností. Od lepenkových krabic po překážky prádla si možná myslíte, že projekt byl hotov k smrti. Ale počkej! Za 20 $
Světelný rám (pro světelný box Tekjocks Photography): 3 kroky
Světelný rám (pro světelný box Tekjocks Photography): Zde následuje můj světelný box pro fotografování. Nebudu to rozebírat, protože to bude záviset na tom, jakou velikost trubek získáte, která velikost hardwaru budete potřebovat. Toto tedy bude velmi základní návod. Budu zveřejňovat