2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12
ฉันเจอกระจกอินฟินิตี้และพบว่ามันเจ๋งจริงๆ สิ่งนี้เป็นแรงบันดาลใจให้ฉันสร้างกระจกอินฟินิตี้ แต่ฉันต้องการให้มันมีวัตถุประสงค์ ดังนั้นฉันจึงตัดสินใจสร้างนาฬิกากระจกอินฟินิตี้ที่ใช้งานได้ นี่คือกระจกอินฟินิตี้ที่ช่วยให้คุณสามารถเปลี่ยนโหมด ความเร็ว และสีได้โดยใช้โพเทนชิโอมิเตอร์ (หมายเหตุ: นี่เป็นครั้งแรกที่ฉันทำสิ่งนี้)
เสบียง
มาดำดิ่งลงไปในสิ่งที่คุณต้องทำเพื่อสิ่งนี้กัน!
คุณจะต้องการ…
1) 1 Arduino Uno
3) 1 เขียงหั่นขนม
4) 1 สวิตช์สไลด์
5) 3 โพเทนชิโอมิเตอร์
6) แบตเตอรี่ 9V 1 ก้อน
7) 5 เมตร WS2811 LED Strip
8) สายจัมเปอร์
9) นาฬิกา (นาฬิกาที่ฉันใช้นาฬิกาสมัยใหม่ขนาดใหญ่ 12 นิ้ว)
10) แผ่นกระจกยืดหยุ่น (อันที่ฉันใช้แผ่นกระจก)
11) ฟิล์มความเป็นส่วนตัว (อันที่ฉันใช้กระจกทางเดียว)
12) อาจต้องใช้การบัดกรี ทั้งนี้ขึ้นอยู่กับวัสดุที่คุณมี
ขั้นตอนที่ 1: การเดินสายไฟ
การเดินสายไฟค่อนข้างง่าย
- สวิตช์ SPST เปิดและปิดไฟ LED (A0)
- โพเทนชิออมิเตอร์ด้านซ้ายควบคุมแสง (A1)
- โพเทนชิออมิเตอร์กลางควบคุมโหมด (A2)
- โพเทนชิออมิเตอร์ด้านขวาควบคุมความเร็ว (A3)
ขั้นตอนที่ 2: รหัส
#รวม
#กำหนด PIN 6
#define NUM_LEDS 54
#define A0 A0
#define A1 A1
#define A2 A2
#define A3 A3
// พารามิเตอร์ 1 = จำนวนพิกเซลในแถบ
// พารามิเตอร์ 2 = หมายเลขพิน (ส่วนใหญ่ถูกต้อง)
// พารามิเตอร์ 3 = แฟล็กประเภทพิกเซล รวมเข้าด้วยกันตามต้องการ:
// NEO_KHZ800 800 KHz bitstream (ผลิตภัณฑ์ NeoPixel ส่วนใหญ่ที่มีไฟ LED WS2812)
// NEO_KHZ400 400 KHz (คลาสสิก 'v1' (ไม่ใช่ v2) พิกเซล FLORA, ไดรเวอร์ WS2811)
// NEO_GRB Pixels ต่อสายสำหรับ GRB bitstream (ผลิตภัณฑ์ NeoPixel ส่วนใหญ่)
// NEO_RGB Pixels ต่อสายสำหรับ RGB bitstream (v1 FLORA พิกเซล ไม่ใช่ v2)
แถบ Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
การตั้งค่าเป็นโมฆะ () {
แถบ.begin();
แถบ.show(); // เริ่มต้นพิกเซลทั้งหมดเป็น 'ปิด'
}
วงเป็นโมฆะ () {
ถ้า (อ่านแบบแอนะล็อก (A0)>=512){
ถ้า(analogRead(A2)>=768){
ถ้า (อ่านแบบแอนะล็อก (A3)>=768){
rainbowCycle (80, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}อื่น if(analogRead(A3)>=512){
rainbowCycle (60, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}อื่น if(analogRead(A3)>=256){
rainbowCycle (40, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
อื่น{
rainbowCycle (20, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
} else if(analogRead(A2)>=512){
ถ้า (อ่านแบบแอนะล็อก (A1)>=768){
CylonBounce(สุ่ม(255), สุ่ม(255), สุ่ม(255), 4, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}อื่น if(analogRead(A1)>=512){
CylonBounce(สุ่ม(255), 0, 0, 4, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}อื่น if(analogRead(A1)>=256){
CylonBounce(0, สุ่ม(255), 0, 4, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}
อื่น{
CylonBounce(0, 0, สุ่ม(255), 4, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}
}อื่น if(analogRead(A2)>=256){
ถ้า (อ่านแบบแอนะล็อก (A1)>=768){
ไบต์ r, g, b;
r = สุ่ม (255);
ก. = สุ่ม (255);
b = สุ่ม (255);
meteorRain(r, g, b, 10, 20, true, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}อื่น if(analogRead(A1)>=512){
ไบต์ r, g, b;
r = สุ่ม (255);
ก. = 0;
ข = 0;
meteorRain(r, g, b, 10, 20, true, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}อื่น if(analogRead(A1)>=256){
ไบต์ r, g, b;
r = 0;
ก. = สุ่ม (255);
ข = 0;
meteorRain(r, g, b, 10, 20, true, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}
อื่น{
ไบต์ r, g, b;
r = 0;
ก. = 0;
b = สุ่ม (255);
meteorRain(r, g, b, 10, 20, true, analogRead(A0), analogRead(A1), analogRead(A2), analogRead(A3));
}
}
อื่น{ if(analogRead(A1)>=768){
RunningLights (สุ่ม (255), สุ่ม (255), สุ่ม (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}อื่น if(analogRead(A1)>=512){
RunningLights (สุ่ม (255), 1, 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}อื่น if(analogRead(A1)>=256){
RunningLights (1, สุ่ม (255), 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
อื่น{
RunningLights (1, 1, สุ่ม (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));
}
}
}อื่น{
setAll(0, 0, 0);
}
}
เป็นโมฆะ rainbowCycle (int SpeedDelay, int oldA0, int oldA1, int oldA2, int oldA3) {
ไบต์ *c;
uint16_t ผม, เจ;
สำหรับ (j=0; j<256*5; j++) { // 5 รอบของสีทั้งหมดบนล้อ
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
สำหรับ (i=0; i< NUM_LEDS; i++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
setPixel(i, *c, *(c+1), *(c+2));
}
showStrip();
ล่าช้า (SpeedDelay);
}
}
ไบต์ * ล้อ (ไบต์ WheelPos) {
ไบต์คงที่ c[3];
ถ้า (WheelPos <85) {
c[0]=WheelPos * 3;
c[1]=255 - WheelPos * 3;
ค[2]=0;
} else if (WheelPos <170) {
WheelPos -= 85;
c[0]=255 - WheelPos * 3;
ค[1]=0;
c[2]=WheelPos * 3;
} อื่น {
WheelPos -= 170;
ค[0]=0;
c[1]=WheelPos * 3;
c[2]=255 - WheelPos * 3;
}
กลับค;
}
เป็นโมฆะ CylonBounce (ไบต์สีแดง, ไบต์สีเขียว, ไบต์สีน้ำเงิน, int EyeSize, int oldA0, int oldA1, int oldA2, int oldA3){
int ความเร็วดีเลย์;
int ReturnDelay;
ถ้า(analogRead(A3)>=768){SpeedDelay=80;ReturnDelay=120;}
อื่น if(analogRead(A3)>=512){SpeedDelay=60;ReturnDelay=100;}
อื่น if(analogRead(A3)>=256){SpeedDelay=40;ReturnDelay=80;}
อื่น{SpeedDelay=20;ReturnDelay=60;}
สำหรับ (int i = 0; i < NUM_LEDS-EyeSize-2; i++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
setAll(0, 0, 0);
setPixel(i, แดง/10, เขียว/10, น้ำเงิน/10);
สำหรับ (int j = 1; j <= EyeSize; j++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
setPixel(i+j, แดง, เขียว, น้ำเงิน);
}
setPixel(i+EyeSize+1, แดง/10, เขียว/10, น้ำเงิน/10);
showStrip();
ล่าช้า (SpeedDelay);
}
ล่าช้า (ReturnDelay);
สำหรับ (int i = NUM_LEDS-EyeSize-2; i > 0; i--) {
setAll(0, 0, 0);
setPixel(i, แดง/10, เขียว/10, น้ำเงิน/10);
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
สำหรับ (int j = 1; j <= EyeSize; j++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
setPixel(i+j, แดง, เขียว, น้ำเงิน);
}
setPixel(i+EyeSize+1, แดง/10, เขียว/10, น้ำเงิน/10);
showStrip();
ล่าช้า (SpeedDelay);
}
ล่าช้า (ReturnDelay);
}
เป็นโมฆะ RunningLights (ไบต์สีแดง, ไบต์สีเขียว, ไบต์สีน้ำเงิน, int oldA0, int oldA1, int oldA2, int oldA3) {
ตำแหน่ง int=0;
ภายใน WaveDelay;
ถ้า(analogRead(A3)>=768){WaveDelay=80;}
อื่น if(analogRead(A3)>=512){WaveDelay=60;}
อื่น if(analogRead(A3)>=256){WaveDelay=40;}
อื่น{WaveDelay=20;}
สำหรับ(int j=0; j
{
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
ตำแหน่ง++; // = 0; //ตำแหน่ง + อัตรา;
สำหรับ(int i=0; i
// คลื่นไซน์ 3 คลื่นออฟเซ็ตสร้างรุ้ง!
//ระดับลอย = บาป(i+ตำแหน่ง) * 127 + 128;
//setPixel(i, ระดับ, 0, 0);
//ระดับลอย = บาป(i+ตำแหน่ง) * 127 + 128;
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
setPixel(i, ((sin(i+Position) * 127 + 128)/255)*สีแดง, ((บาป(i+ตำแหน่ง) * 127 + 128)/255)*สีเขียว, ((บาป(i+ตำแหน่ง) * 127 + 128)/255)*สีน้ำเงิน);
}
showStrip();
ล่าช้า (WaveDelay);
}
}
โมฆะ meteorRain (ไบต์สีแดง ไบต์สีเขียว ไบต์สีน้ำเงิน ไบต์ meteorSize ไบต์ meteorTrailDecay บูลีน meteorRandomDecay int oldA0, int oldA1, int oldA2, int oldA3) {
setAll(0, 0, 0);
int ความเร็วดีเลย์;
ถ้า(analogRead(A3)>=768){SpeedDelay=80;}
อื่น if(analogRead(A3)>=512){SpeedDelay=60;}
อื่น if(analogRead(A3)>=256){SpeedDelay=40;}
อื่น{SpeedDelay=20;}
สำหรับ (int i = 0; i < NUM_LEDS+NUM_LEDS; i++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
// หรี่ไฟ LED ทั้งหมดในขั้นตอนเดียว
สำหรับ(int j=0; j
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
if((!meteorRandomDecay) || (สุ่ม(10)>5)) {
fadeToBlack(j, meteorTrailDecay);
}
}
//วาดดาวตก
สำหรับ (int j = 0; j <meteorSize; j++) {
ถ้า(oldA0!=analogRead(A0)||((oldA1-256)>analogRead(A1))||((oldA1+256)analogRead(A2))||((oldA2+256)analogRead(A3))| |((เก่าA3+256)
หยุดพัก;
}
ถ้า((i-j =0)) {
setPixel(i-j, แดง, เขียว, น้ำเงิน);
}
}
showStrip();
ล่าช้า (SpeedDelay);
}
}
เป็นโมฆะ fadeToBlack (int ledNo, ไบต์ fadeValue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
uint32_t oldColor;
uint8_t r, g, b;
มูลค่าที่แท้จริง;
oldColor = strip.getPixelColor (ledNo);
r = (สีเก่า & 0x00ff0000UL) >> 16;
g = (สีเก่า & 0x0000ff00UL) >> 8;
b = (สีเก่า & 0x000000ffUL);
ร=(ร<=10)? 0: (int) r-(r*fadeValue/256);
ก.=(ก.<=10)? 0: (int) g-(g*fadeValue/256);
ข=(ข<=10)? 0: (int) b-(b*fadeValue/256);
strip.setPixelColor(ledNo, r, g, b);
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
ไฟ LED[ledNo].fadeToBlackBy(fadeValue);
#endif
}
// *** แทนที่ที่นี่ ***
เป็นโมฆะ showStrip () {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
แถบ.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
เป็นโมฆะ setPixel (พิกเซล int, ไบต์สีแดง, ไบต์สีเขียว, ไบต์สีน้ำเงิน) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip. Color(แดง เขียว น้ำเงิน));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
ไฟ LED[พิกเซล].r = สีแดง;
ไฟ LED[พิกเซล].g = สีเขียว;
ไฟ LED [พิกเซล].b = สีน้ำเงิน;
#endif
}
เป็นโมฆะ setAll (ไบต์สีแดง ไบต์สีเขียว ไบต์สีน้ำเงิน) {
สำหรับ (int i = 0; i < NUM_LEDS; i++) {
setPixel(i, แดง, เขียว, น้ำเงิน);
}
showStrip();
}
ขั้นตอนที่ 3: การสร้างนาฬิกา
ฉันขอแนะนำให้ซื้อนาฬิกาแก้วที่แบนด้านใน เมื่อฉันใช้กระจกแบบยืดหยุ่นกับด้านในของนาฬิกา มีปัญหาเนื่องจากตัวเลขในนาฬิกาโผล่ออกมา กระจกโค้งงอส่งผลให้กระจกเงาไร้ขอบไม่เกิดขึ้น คุณต้องมีแผ่นกระจกแบบยืดหยุ่นและฟิล์มป้องกันความเป็นส่วนตัวให้แบนราบได้มากที่สุด หากคุณได้รับนาฬิกา ตรวจสอบให้แน่ใจว่าคุณสามารถวาง LED ไว้ข้างในได้โดยไม่มีปัญหา
ขั้นตอนที่ 1: เปิดนาฬิกาและถอดกระจกด้านหน้าออก
ขั้นตอนที่ 2: ติดฟิล์มความเป็นส่วนตัวที่กระจกด้านหน้า (วิดีโอนี้แสดงวิธีการทำ)
ขั้นตอนที่ 3: ใช้กระจกยืดหยุ่นด้านในนาฬิกา (ถอดเข็มนาฬิกาออกก่อนทำสิ่งนี้)
ขั้นตอนที่ 4: ทำรูตรงกลางเพื่อใส่เข็มนาฬิกากลับเข้าที่
ขั้นตอนที่ 5: วางแถบ LED รอบผนังด้านในของนาฬิกา (ฉันใช้ปืนกาวร้อนสำหรับขั้นตอนนี้)
ขั้นตอนที่ 6: เปิดแถบ LED และวางกระจกบนนาฬิกาเพื่อดูว่ามีเอฟเฟกต์กระจกอินฟินิตี้หรือไม่
ขั้นตอนที่ 7: เมื่อคุณทำทุกอย่างเสร็จแล้ว ให้ใส่นาฬิกาเข้าด้วยกันแล้วปล่อยให้สายไฟลอดไปทางด้านหลัง
ขั้นตอนที่ 8: ยินดีด้วยที่คุณทำโปรเจ็กต์เสร็จเรียบร้อยแล้ว และทุกอย่างน่าจะใช้ได้ดี
หากคุณมีคำถามใด ๆ โปรดแสดงความคิดเห็นด้านล่าง (รู้ว่าฉันอาจไม่สามารถตอบได้ แต่ฉันจะทำให้ดีที่สุด)
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง