Obsah:
- Krok 1: Materiály
- Krok 2: Plán výstavby
- Krok 3: Hardvér: Návrh obvodu
- Krok 4: Hardvér: Akrylové rezanie
- Krok 5: Programovací kód Arduino
- Krok 6: Hotový vzhľad
Video: Bodový svetelný vzor: 6 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:59
Začal som myšlienkou „Môžem ovládať svetlo vlastnými rukami a prejavovať vlastnú vôľu?“
Je to „bodový svetelný vzor“, ktorý vám umožňuje vytvárať si vlastné farby, navrhovať vlastné vzory s týmito farbami a využívať rôzne efekty animácie.
Krok 1: Materiály
- Arduino UNO x 13
- Pixelový pás LED WS2901 alebo WS2811 (130 LED)
- Tlačidlový spínač x 1
- Zapínací spínač x 65
- Potenciometer x 65
- Dúhový kábel
- Dostatočne výkonný SMPS
- Vodičový kábel
- Akrylová priehľadná okrúhla tyč (priemer 30 mm)
- Akrylová doska čiernej farby (5T) (500 mm*790 mm) x 2, (500 mm*35 mm) x 2, (790 mm*35 mm) x 2
Krok 2: Plán výstavby
Krok 3: Hardvér: Návrh obvodu
-
Odrežte akrylovú dosku podľa vyššie uvedenej štruktúry. (pozri krok 2)
- Jeden kus neo-pixelovej LED diódy je umiestnený na hornú a dolnú časť otvoru pre potenciometer a je k nej pripevnených celkom 65 párov neo-pixelových LED diód.
- Dvojica neo-pixelových diód LED je zapojená dohromady a tvorí jeden pin Arduino.
- Do otvorov potenciometra namontujte 65 potenciometrov. (Položte ho na opačnú stranu neo-pixelového povrchu.)
- Pripojte 65 západkových spínačov tak, aby zodpovedali otvorom prepínača.
- Do každej z trinástich zón je pripevnených celkom trinásť Arduino UNO, aby bolo možné spojiť päť kusov 65 kusov hardvéru do jedného Arduino UNO.
- Ako je znázornené na priloženej fotografii, potenciometre, zapínacie spínače a neo-pixelové diódy LED pripojte k pinom Arduino UNO pomocou drôtu. (pozri krok 2)
- Piny GND a 5V niekoľkých Arduino UNO sú zhromaždené do káblových vodičov a potom pripojené k externému napájaniu. (pozri krok 2)
- Odstráňte prach tlakom vzduchu.
Krok 4: Hardvér: Akrylové rezanie
- Odrežte akrylovú tyč na dĺžku 50 mm.
- Jedna strana akrylovej tyče je vyvŕtaná do veľkosti a hĺbky, aby zodpovedala kontrolnej časti potenciometra.
- Akrylová tyč je orezaná o niečo širšia ako otvor, aby zabezpečila voľný priestor, ktorý sa dobre zmestí do potenciometra.
- Druhá strana dáva malý brúsny papier, aby bolo možné svetlo úhľadne prenášať.
Krok 5: Programovací kód Arduino
www.kasperkamperman.com/blog/arduino/ardui…
Kód „hsb to rgb“를 참고 한 사이트
#zahrnúť
// '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 pixelov = {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 () 를 위한 변수 와 함수 선언
konštantný 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 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 základňa;
ak (sat == 0) {
farby [index] [0] = val; farby [index] [1] = val; farby [index] [2] = val; } else {
základňa (((255 - sat) * val) >> 8;
prepínač (odtieň / 60) {
prípad 0: r = val; g = (((val - báza) * odtieň) / 60) + báza; b = základ; prestávka;
prípad 1:
r = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; g = val; b = základ; prestávka;
prípad 2:
r = základ; g = val; b = (((val - báza) * (odtieň % 60)) / 60) + báza; prestávka;
prípad 3:
r = základ; g = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; b = val; prestávka;
prípad 4:
r = (((val - báza) * (odtieň % 60)) / 60) + báza; g = základ; b = val; prestávka;
prípad 5:
r = val; g = základ; b = (((val - báza) * (60 - (odtieň % 60))) / 60) + báza; prestávka; }
farby [index] [0] = r;
farby [index] [1] = g; farby [index] [2] = b; }
}
int rgb_colors [NUM_LIGHTS] [3]; // 네오 픽셀 오브젝트 갯수 마다 farba RGB 선언
int odtieň [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 odtieň 선언 int sat [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 밝기 서언
// 일반 변수 선언
int startsSwitch = {8, 9, 10, 11, 12}; // zapnutie/vypnutie 버튼 핀 번호 boolean startState = {false, false, false, false, false}; // zapnutie/vypnutie 상태 변수
const int colorPin = {A0, A1, A2, A3, A4}; // 가변 저항 핀 번호
int colorVal = {0, 0, 0, 0, 0}; // 가변 저항 초기 값
int animationButton = 7; // 애니메이션 모드 변환 버튼 핀 번호
/////////////////////////////////////////////////
// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? 해결 시간 내 많은 이벤트 가 발생 하는것 에 대한 문제 에 대해서 대해서 지정된 시간 간격 으로 함수 를 해결 해결 해결 int tlačidloState; // 입력 핀 으로부터 의 현재 판독 값 int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 nepodpísané dlhé lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 으로 nepodpísané dlhé debounceDelay = 50; // 디 바운싱 타임 설정; 출력 이 깜빡 이면 증가 한다 MOD 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수
///////////////////////////////////////////////////////
// 멀티 테스 킹 애니메이션 을 위한 시간 변수 선언
nepodpísaný dlhý prúdMillis; // 현재 시간 변수
bez znamienka dlhý B_previousMillis [5]; // 각 모듈 의 블 링킹 타이머 nepodpísané dlhé DR_Millis [5]; // 각 모듈 의 디밍 랜덤 타이머 (예비) nepodpísané dlhé R_previousMillis; // 레인보우 타이머 bez znamienka D_previousMillis; // 디밍 타이머
boolean firstRainbow = true; // 레인보우 색상 초기화 상태 변수
int RainbowSpeed; // 레인보우 변환 변수
int Bright = 100; // 디밍 초기 값 int BrightnessFactor = 1; // 디밍 증감 값 /////////////////////////////////////////////////////// ////////////////////////////////////////////
neplatné nastavenie () {
pre (int i = 0; i <NUM_LIGHTS; i ++) {pixelov .begin (); // 네오 픽셀 오브젝트 초기화}
// 버튼 인풋 설정
pre (int i = 0; i <NUM_LIGHTS; i ++) {pinMode (startsSwitch , INPUT_PULLUP); // zapnutie/vypnutie 버튼 인풋 설정} pinMode (animationButton, INPUT_PULLUP); // 애니메이션 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i ++) {B_Interval = int (random (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}
Serial.begin (9600); // 통신 설정
}
prázdna slučka () {
MODE = CheckAnimMode (); // 모드 에 애니메이션 체크 모드 함수 를 넣는다
// 버튼 과 가변 저항 을 값 을 각각 읽어 변수 에 지정 지정 한다.
for (int i = 0; i <NUM_LIGHTS; i ++) {startState =! digitalRead (startsSwitch ); // zapnutie/vypnutie 버튼 에서 읽은 값 의 반대 값 을 startState 에 넣어 준다 // startState = digitalRead (startsSwitch ); colorVal = analogRead (colorPin ); // 가변 저항 에서 읽은 값 을 가변 저항 초기 값 에 넣는다 넣는다}
prepínač (REŽIM) {// 애니메이션 함수 스위치 문
prípad 0: on (); // na 함수 실행 prestávka; // 조건문 에서 빠져 나가라
prípad 1:
dúha (); // dúha 함수 실행 prestávka;
prípad 2:
stmievanie (); // stmievanie 함수 실행 prestávka;
prípad 3:
bliká (); // blikanie 함수 실행 prestávka; }
pre (int i = 0; i <NUM_LIGHTS; i ++) {pixelov .show (); // 네오 픽셀 오브젝트 배열 켜라}
}
/////////////////////////////////////////////////////////////
int CheckAnimMode () {
// 애니메이션 선택 버튼 을 읽어 모드 를 결정 한다.
////////////////////////////////////////////////////////// /// currentMillis = millis (); // 시간 측정 int reading = digitalRead (animationButton); if (čítanie! = lastButtonState) {// 입력 핀 으로부터 이전 의 버튼 의 의 상태 와 판독 값 값 lastDebounceTime = millis (); // 현재 시간 을 출력 핀 이 마지막 으로 전환 된 시간 에 넣음 넣음}
if ((currentMillis - lastDebounceTime)> debounceDelay) {
if (reading! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 판독 값 과 비교
buttonState = čítanie; // Tlačidlo 판독 값 을Stát 에 대입
if (buttonState == LOW) {// 버튼 상태 가 꺼져 있다면
REŽIM ++; // 버튼 모드 1 씩 증가 if (REŽIM> 3) {MODE = 0; firstRainbow = true; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 Jasné = 15; // 밝기 는 15}}}}
lastButtonState = čítanie; // 판독 값 을 이전 의 버튼 상태 에 대입
návrat MODE; 함수 를 종료 하고 režim 함수 로 값 을 리턴 하라}
////////////////////////////////////////////////////////////////////
// funkcia režimu animácie
// dňa
void on () {Serial.println ("on"); // 시리얼 모니터 에 na 을 써라 pre (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅}}
// Dúha
void rainbow () {Serial.println ("dážď"); // 시리얼 모니터 에 dážď 을 써라 if (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = false; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - R_previousMillis> R_Interval) {// 흐른 시간 값 이 레인보우 레인보우 인터벌 값 보다 크면 R_previousMillis = currentMillis; // 현재 시간 을 이전 의 레인보우 시간 에 에 라 RainbowSpeed += 10; // 레인보우 변환 변수 에 10 을 더해라}
pre (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, (colorVal +RainbowSpeed) % 1023); // 레인보우 컬러 셋팅}
}
// Stmievanie
void dimming () {Serial.println ("dimm"); // 시리얼 모니터 에 stmievanie 을 써라 Serial.println (jasný); // 시리얼 모니터 에 Jasné 를 써라 if (currentMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 인터벌 값 보다 크면 D_previousMillis = currentMillis; // 현재 시간 을 이전 의 디밍 시간 에 에 라 +Bright += BrightnessFactor; // 밝기 에 디밍 증감 값 1 씩 올려라} if (Bright 254) {BrightnessFactor = -1 * BrightnessFactor; } Jasné = obmedzenie (Jasné, 99, 254); // 변수 밝기 값 을 최소값 99 ~ 최대 값 254 사이 의 값 으로 한정 한다
pre (int i = 0; i <NUM_LIGHTS; i ++) {dim_color_set (i, Bright); // 디밍 컬러 셋팅}}
// Bliká
prázdne blikanie () {Serial.println ("blikanie"); // 시리얼 모니터 에 blikajte 를 써라
pre (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); // 읽히지 않으면 컬러 셋팅 하지 않음}}
}
////////////////////////////////////////////////////////////////////////////////////////
// základná funkcia
// sada farieb
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 (odtieň [index], 255, 255, rgb_colors, index); pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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) {// 컬러 셋팅 하지 않는 함수 설정
pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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 값 으로 매핑 한 값 을 가지고 색상 색상 값 으로 color (colorVal 에) getRGB (odtieň [index], 255, BC, rgb_colors, index); pre (int i = 0; i <NUMPIXELS; i ++) {pixelov [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: Hotový vzhľad
Odporúča:
Vzor žiarenia ESP8266: 7 krokov
Vzorec vyžarovania ESP8266: ESP8266 je populárny modul mikrokontroléra, pretože sa dá pripojiť k internetu prostredníctvom integrovaného WiFi. To otvára pre majstra hobby veľa príležitostí vyrábať diaľkovo ovládané gadgety a zariadenia IoT s minimom extra tvrdého
Ako urobiť vzor návrhu Singletonu v C ++: 9 krokov
Ako vytvoriť návrhový vzor Singleton v C ++: Úvod: Účelom tejto inštrukčnej príručky je naučiť používateľa, ako implementovať návrhový vzor singletonu do svojho programu C ++. Pritom táto sada inštrukcií čitateľovi tiež vysvetlí, prečo sú prvky jednotlivca spôsobom
Skladací svetelný box / svetelný stan v komerčnej kvalite za 20 dolárov / 20 minút: 7 krokov (s obrázkami)
Skladací svetelný box / svetelný stan v komerčnej kvalite za 20 dolárov / 20 minút: Ak ste hľadali svetelný box na výrobu vlastných výrobkov alebo fotografie zblízka, už viete, že máte veľa možností. Od kartónových škatúľ po prekážky bielizne si môžete myslieť, že projekt bol dokončený na smrť. Ale počkaj! Za 20 dolárov
Svetelný rám (pre svetelný box na fotografovanie Tekjocks): 3 kroky
Svetelný rám (pre svetelný box pre fotografovanie Tekjocks): Tu nadväzuje na môj svetelný box pre fotografiu. Nebudem sa o tom rozpisovať, pretože príde na to, akú veľkosť hadičky získate, ktorá veľkosť hardvéru budete potrebovať. Toto bude teda veľmi základný návod. Uverejním príspevok
Vytvorte vzor Tilable pre obrázok na pozadí webovej stránky: 8 krokov
Vytvorte vzorkovateľné vzory pre obrázok na pozadí webových stránok: Toto je priama a jednoduchá (myslím) metóda na vytváranie obrázkov, ktoré je možné ukladať na dlaždice bez toho, aby vyzerali príliš „mriežkovo“. Tento tutoriál využíva Inkscape (www.inkscape.org), open-source editor vektorovej grafiky. Myslím si, že táto metóda môže