Πίνακας περιεχομένων:

Ρολόι καθρέφτη Infinity με ποτενσιόμετρα: 3 βήματα
Ρολόι καθρέφτη Infinity με ποτενσιόμετρα: 3 βήματα

Βίντεο: Ρολόι καθρέφτη Infinity με ποτενσιόμετρα: 3 βήματα

Βίντεο: Ρολόι καθρέφτη Infinity με ποτενσιόμετρα: 3 βήματα
Βίντεο: Φωτιζόμενο ρολόι καθρέφτης 2024, Ιούλιος
Anonim
Ρολόι καθρέφτη Infinity με ποτενσιόμετρα
Ρολόι καθρέφτη Infinity με ποτενσιόμετρα

Συνάντησα τον καθρέφτη του άπειρου και το βρήκα πολύ δροσερό. Αυτό με ενέπνευσε να φτιάξω έναν καθρέφτη απείρου, αλλά τον χρειαζόμουν για να έχω έναν σκοπό. Έτσι, αποφάσισα να φτιάξω ένα λειτουργικό ρολόι καθρέφτη άπειρου. Αυτός είναι ένας καθρέφτης απείρου που σας επιτρέπει να αλλάξετε τις λειτουργίες, την ταχύτητα και τα χρώματα χρησιμοποιώντας ποτενσιόμετρα. (Σημείωση: Είναι η πρώτη μου φορά που φτιάχνω κάτι τέτοιο)

Προμήθειες

Ας δούμε τι χρειάζεστε για να φτιάξετε αυτό το πράγμα!

Θα χρειαστείτε…

1) 1 Arduino Uno

3) 1 Breadboard

4) 1 διακόπτης διαφάνειας

5) 3 Ποτενσιόμετρα

6) 1 μπαταρία 9V

7) Λωρίδα LED 5 μέτρων WS2811

8) Καλώδια καλωδίων άλτη

9) Ένα ρολόι (Το ρολόι χρησιμοποίησα μεγάλο μοντέρνο ρολόι 12 ιντσών)

10) Ευέλικτο φύλλο καθρέφτη (αυτό που χρησιμοποίησα φύλλο καθρέφτη)

11) Ταινία απορρήτου (αυτή που χρησιμοποίησα One Way Mirror)

12) Μπορεί να απαιτείται συγκόλληση, αυτό εξαρτάται από τα υλικά που έχετε

Βήμα 1: Καλωδίωση

Καλωδίωση
Καλωδίωση
Καλωδίωση
Καλωδίωση

Η καλωδίωση είναι αρκετά απλή

- Ο διακόπτης SPST ενεργοποιεί και απενεργοποιεί τα LED (A0)

- Το αριστερό ποτενσιόμετρο ελέγχει το φως (A1)

- Το μεσαίο ποτενσιόμετρο ελέγχει τις λειτουργίες (A2)

- Το σωστό ποτενσιόμετρο ελέγχει την ταχύτητα (A3)

Βήμα 2: Ο κώδικας

#περιλαμβάνω

#ορίστε τον κωδικό PIN 6

#ορίστε NUM_LEDS 54

#define A0 A0

#define A1 A1

#ορίστε το Α2 Α2

#ορίστε το Α3 Α3

// Παράμετρος 1 = αριθμός εικονοστοιχείων σε λωρίδα

// Παράμετρος 2 = αριθμός pin (οι περισσότεροι είναι έγκυροι)

// Παράμετρος 3 = σημαίες τύπου pixel, προσθέστε μαζί όπως απαιτείται:

// NEO_KHZ800 800 KHz bitstream (τα περισσότερα προϊόντα NeoPixel με LEDs WS2812)

// NEO_KHZ400 400 KHz (κλασικά «v1» (όχι v2) εικονοστοιχεία FLORA, προγράμματα οδήγησης WS2811)

// Τα εικονοστοιχεία NEO_GRB είναι ενσύρματα για bitstream GRB (τα περισσότερα προϊόντα NeoPixel)

// Τα εικονοστοιχεία NEO_RGB είναι ενσύρματα για ροή bitGB RGB (εικονοστοιχεία v1 FLORA, όχι v2)

Λωρίδα Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup () {

strip.begin ();

strip.show (); // Αρχικοποίηση όλων των εικονοστοιχείων σε "απενεργοποίηση"

}

void loop () {

εάν (analogRead (A0)> = 512) {

εάν (analogRead (A2)> = 768) {

εάν (analogRead (A3)> = 768) {

rainbowCycle (80, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A3)> = 512) {

rainbowCycle (60, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else 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) {

εάν (analogRead (A1)> = 768) {

CylonBounce (τυχαία (255), τυχαία (255), τυχαία (255), 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 512) {

CylonBounce (τυχαία (255), 0, 0, 4, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else 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));

}

} else if (analogRead (A2)> = 256) {

εάν (analogRead (A1)> = 768) {

byte r, g, b;

r = τυχαίο (255);

g = τυχαίο (255);

b = τυχαίο (255);

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 512) {

byte r, g, b;

r = τυχαίο (255);

g = 0;

b = 0;

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

} else if (analogRead (A1)> = 256) {

byte r, g, b;

r = 0;

g = τυχαίο (255);

b = 0;

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

αλλού{

byte r, g, b;

r = 0;

g = 0;

b = τυχαίο (255);

meteorRain (r, g, b, 10, 20, true, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3));

}

}

else {if (analogRead (A1)> = 768) {

RunningLights (τυχαία (255), τυχαία (255), τυχαία (255), analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3)).

} else if (analogRead (A1)> = 512) {

RunningLights (τυχαία (255), 1, 1, analogRead (A0), analogRead (A1), analogRead (A2), analogRead (A3)).

} else 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);

}

}

void rainbowCycle (int SpeedDelay, int oldA0, int oldA1, int oldA2, int oldA3) {

byte *c;

uint16_t i, j;

για (j = 0; j <256*5; j ++) {// 5 κύκλοι όλων των χρωμάτων στον τροχό

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

για (i = 0; i <NUM_LEDS; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

c = Τροχός (((i * 256 / NUM_LEDS) + j) & 255);

setPixel (i, *c, *(c+1), *(c+2));

}

showStrip ();

καθυστέρηση (SpeedDelay)?

}

}

byte * Wheel (byte WheelPos) {

στατικό byte c [3];

αν (WheelPos <85) {

c [0] = WheelPos * 3;

c [1] = 255 - WheelPos * 3;

c [2] = 0;

} else if (WheelPos <170) {

WheelPos -= 85;

c [0] = 255 - WheelPos * 3;

c [1] = 0;

c [2] = WheelPos * 3;

} αλλο {

WheelPos -= 170;

c [0] = 0;

c [1] = WheelPos * 3;

c [2] = 255 - WheelPos * 3;

}

επιστροφή c?

}

void CylonBounce (κόκκινο byte, πράσινο byte, μπλε byte, int EyeSize, int oldA0, int oldA1, int oldA2, int oldA3) {

int SpeedDelay;

int ReturnDelay;

εάν (analogRead (A3)> = 768) {SpeedDelay = 80; ReturnDelay = 120;}

else if (analogRead (A3)> = 512) {SpeedDelay = 60; ReturnDelay = 100;}

else if (analogRead (A3)> = 256) {SpeedDelay = 40; ReturnDelay = 80;}

else {SpeedDelay = 20; ReturnDelay = 60;}

για (int i = 0; i <NUM_LEDS-EyeSize-2; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

setAll (0, 0, 0);

setPixel (i, κόκκινο/10, πράσινο/10, μπλε/10)

για (int j = 1; j <= EyeSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+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)

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

για (int j = 1; j <= EyeSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

setPixel (i+j, κόκκινο, πράσινο, μπλε).

}

setPixel (i+EyeSize+1, κόκκινο/10, πράσινο/10, μπλε/10).

showStrip ();

καθυστέρηση (SpeedDelay)?

}

καθυστέρηση (ReturnDelay)?

}

void RunningLights (κόκκινο byte, πράσινο byte, μπλε byte, int oldA0, int oldA1, int oldA2, int oldA3) {

int Θέση = 0;

int WaveDelay;

εάν (analogRead (A3)> = 768) {WaveDelay = 80;}

else if (analogRead (A3)> = 512) {WaveDelay = 60;}

else if (analogRead (A3)> = 256) {WaveDelay = 40;}

else {WaveDelay = 20;}

για (int j = 0; j

{

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

Θέση ++; // = 0; // Θέση + Ποσοστό;

για (int i = 0; i

// ημιτονοειδές κύμα, 3 μετατοπισμένα κύματα κάνουν ουράνιο τόξο!

// float level = sin (i + Position) * 127 + 128;

// setPixel (i, επίπεδο, 0, 0);

// float level = sin (i + Position) * 127 + 128;

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

setPixel (i, ((sin (i + Position) * 127 + 128)/255) * κόκκινο, ((αμαρτία (i + Θέση) * 127 + 128)/255) * πράσινο, ((αμαρτία (i + Θέση) * 127 + 128)/255) * μπλε);

}

showStrip ();

καθυστέρηση (WaveDelay)?

}

}

void meteorRain (byte red, byte green, byte blue, byte meteorSize, byte meteorTrailDecay, boolean meteorRandomDecay, int oldA0, int oldA1, int oldA2, int oldA3) {

setAll (0, 0, 0);

int SpeedDelay;

εάν (analogRead (A3)> = 768) {SpeedDelay = 80;}

else if (analogRead (A3)> = 512) {SpeedDelay = 60;}

else if (analogRead (A3)> = 256) {SpeedDelay = 40;}

else {SpeedDelay = 20;}

για (int i = 0; i <NUM_LEDS+NUM_LEDS; i ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

// εξασθενίστε τη φωτεινότητα όλων των LED σε ένα βήμα

για (int j = 0; j

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

εάν ((! meteorRandomDecay) || (τυχαία (10)> 5)) {

fadeToBlack (j, meteorTrailDecay);

}

}

// σχεδιάζω μετέωρο

για (int j = 0; j <meteorSize; j ++) {

if (oldA0! = analogRead (A0) || ((oldA1-256)> analogRead (A1)) || ((oldA1+256) analogRead (A2)) || ((oldA2+256) analogRead (A3)) | | ((παλιάΑ3+256)

Διακοπή;

}

εάν ((i-j = 0)) {

setPixel (i-j, κόκκινο, πράσινο, μπλε).

}

}

showStrip ();

καθυστέρηση (SpeedDelay)?

}

}

void fadeToBlack (int ledNo, byte fadeValue) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

uint32_t oldColor;

uint8_t r, g, b;

int τιμή?

oldColor = strip.getPixelColor (ledNo);

r = (oldColor & 0x00ff0000UL) >> 16;

g = (oldColor & 0x0000ff00UL) >> 8;

b = (oldColor & 0x000000ffUL);

r = (r <= 10); 0: (int) r- (r*fadeValue/256);

g = (g <= 10); 0: (int) g- (g*fadeValue/256);

b = (b <= 10); 0: (int) b- (b*fadeValue/256);

strip.setPixelColor (ledNo, r, g, b);

#τέλος εαν

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

leds [ledNo].fadeToBlackBy (fadeValue);

#τέλος εαν

}

// *** ΑΝΤΙΚΑΤΑΣΤΗΣΗ ΕΔΩ ***

void showStrip () {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.show ();

#τέλος εαν

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

FastLED.show ();

#τέλος εαν

}

void setPixel (int Pixel, κόκκινο byte, πράσινο byte, μπλε byte) {

#ifdef ADAFRUIT_NEOPIXEL_H

// NeoPixel

strip.setPixelColor (Pixel, strip. Color (κόκκινο, πράσινο, μπλε));

#τέλος εαν

#ifndef ADAFRUIT_NEOPIXEL_H

// FastLED

leds [Pixel].r = κόκκινο;

leds [Pixel].g = πράσινο;

leds [Pixel].b = μπλε;

#τέλος εαν

}

void setAll (κόκκινο byte, πράσινο byte, μπλε byte) {

για (int i = 0; i <NUM_LEDS; i ++) {

setPixel (i, κόκκινο, πράσινο, μπλε)

}

showStrip ();

}

Βήμα 3: Δημιουργία ρολογιού

Δημιουργία του ρολογιού
Δημιουργία του ρολογιού
Δημιουργία του ρολογιού
Δημιουργία του ρολογιού
Δημιουργία του ρολογιού
Δημιουργία του ρολογιού

Θα συνιστούσα να πάρετε ένα γυάλινο ρολόι που είναι επίπεδο στο εσωτερικό. Όταν εφάρμοζα τον εύκαμπτο καθρέφτη στο εσωτερικό του ρολογιού, υπήρχε πρόβλημα λόγω των αριθμών μέσα στο ρολόι που έβγαιναν έξω, ο καθρέφτης κάμπτονταν με αποτέλεσμα το φαινόμενο του καθρέφτη άπειρου να μην συμβαίνει. Πρέπει να έχετε το εύκαμπτο φύλλο καθρέφτη και την ταινία απορρήτου για να είναι όσο το δυνατόν πιο επίπεδη. Εάν παίρνετε ένα ρολόι, βεβαιωθείτε ότι μπορείτε να τοποθετήσετε το LED μέσα χωρίς πρόβλημα.

Βήμα 1: Ανοίξτε το ρολόι και αφαιρέστε το μπροστινό γυαλί

Βήμα 2: Βάλτε την ταινία απορρήτου στο μπροστινό γυαλί (Αυτό το βίντεο σας δείχνει πώς να το κάνετε)

Βήμα 3: Εφαρμόστε τον εύκαμπτο καθρέφτη στο εσωτερικό του ρολογιού (Αφαιρέστε τους δείκτες των ρολογιών πριν το κάνετε αυτό)

Βήμα 4: Κάντε μια τρύπα στη μέση για να τοποθετηθούν ξανά οι δείκτες του ρολογιού

Βήμα 5: Τοποθετήστε τη λωρίδα LED γύρω από τα εσωτερικά τοιχώματα του ρολογιού (χρησιμοποίησα πιστόλι θερμής κόλλας για αυτό το βήμα)

Βήμα 6: Ενεργοποιήστε τη λωρίδα LED και τοποθετήστε το γυαλί πάνω από το ρολόι για να δείτε αν υπάρχει το εφέ καθρέφτη άπειρου

Βήμα 7: Μόλις τελειώσετε με όλα, βάλτε το ρολόι μαζί και αφήστε τα καλώδια να περάσουν στο πίσω μέρος

Βήμα 8: Συγχαρητήρια που ολοκληρώσατε το έργο και όλα πρέπει να λειτουργούν καλά

Εάν έχετε οποιεσδήποτε ερωτήσεις, σχολιάστε τις παρακάτω (ξέρετε ότι μπορεί να μην μπορώ να απαντήσω, αλλά θα κάνω το καλύτερο δυνατό)

Συνιστάται: