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

LED Spiral Tree: 4 Βήματα (με Εικόνες)
LED Spiral Tree: 4 Βήματα (με Εικόνες)

Βίντεο: LED Spiral Tree: 4 Βήματα (με Εικόνες)

Βίντεο: LED Spiral Tree: 4 Βήματα (με Εικόνες)
Βίντεο: Η γκουγκου δεν σεβεται τον πατερα της 2024, Νοέμβριος
Anonim
Σπειροειδές δέντρο LED
Σπειροειδές δέντρο LED
Σπειροειδές δέντρο LED
Σπειροειδές δέντρο LED
Σπειροειδές δέντρο LED
Σπειροειδές δέντρο LED

Λατρεύω όλα τα είδη λωρίδων LED. Έφτιαξα ένα ωραίο φως ουράνιου τόξου μαζί τους. Ακόμα και τα μη διευθυνσιοδοτούμενα είναι χρήσιμα. Έφτιαξα ένα φωτεινό υπαίθριο φως ομπρέλα αγοράς συνδέοντάς τα με τις πλευρές unbrella, οπότε όταν φύσηξε το σπιράλ μου αποφάσισα να τυλίξω ένα μήκος λωρίδας led γύρω από αυτό.

Βήμα 1: Ελεγκτής

Ελεγκτής
Ελεγκτής
Ελεγκτής
Ελεγκτής
Ελεγκτής
Ελεγκτής

Αποφάσισα να χρησιμοποιήσω led χωρίς RGB. Αυτό σημαίνει ότι μπορώ να έχω προγραμματισμένο αποτέλεσμα, αλλά όλα τα led αλλάζουν χρώμα ταυτόχρονα. Αυτό σημαίνει επίσης ότι θα χρειαστεί ένας ελεγκτής. Θα μπορούσα να χρησιμοποιήσω arduino uno και έκανα τις αρχικές δοκιμές χρησιμοποιώντας ασπίδα RGB, αλλά κατέληξα να χρησιμοποιώ μια προσαρμοσμένη μονά πλακέτα με γυμνό τσιπ Atmega328. Απλώς έπρεπε να αλλάξω τον προγραμματιστή -στόχο και να προγραμματίσω απευθείας το τσιπ.

Μου είχαν μείνει πολλά από αυτά τα χαρτόνια από άλλα έργα λαμπτήρων. Μη διστάσετε να χρησιμοποιήσετε έναν φτηνό ενσωματωμένο προγραμματισμένο ελεγκτή όπως έκανα στην ομπρέλα μου.

Κατέληξα να χρησιμοποιώ ένα αργό crossfade demo ως βάση για το δέντρο.

/** Κωδικός για διασταύρωση 3 LED, κόκκινο, πράσινο και μπλε (RGB) * Για να δημιουργήσετε ξεθώριασμα, πρέπει να κάνετε δύο πράγματα: * 1. Περιγράψτε τα χρώματα που θέλετε να εμφανίζονται * 2. Καταχωρίστε τη σειρά που θέλετε να ξεθωριάσουν * * ΠΕΡΙΓΡΑΦΗ ΧΡΩΜΑΤΟΣ: * Ένα χρώμα είναι απλώς μια συστοιχία τριών ποσοστών, 0-100, * που ελέγχει τα κόκκινα, πράσινα και μπλε LED * * Το κόκκινο είναι το κόκκινο LED εντελώς, μπλε και πράσινο σβηστό * int κόκκινο = {100, 0, 0} * Αμυδρό λευκό είναι και οι τρεις λυχνίες LED σε ποσοστό 30% * int dimWhite = {30, 30, 30} * κλπ. * * Ορισμένα κοινά χρώματα παρέχονται παρακάτω ή φτιάξτε τα δικά σας * * ΑΚΟΥΣΤΕ ΤΟ ΠΑΡΑΓΓΕΛΙΑ: * Στο κύριο μέρος του προγράμματος, πρέπει να αναφέρετε τη σειρά * στην οποία θέλετε να εμφανίζονται τα χρώματα, π.χ. * crossFade (κόκκινο) * crossFade (πράσινο) * crossFade (μπλε) * * Αυτά τα χρώματα θα εμφανίζονται με αυτή τη σειρά, ξεθωριάζουν από * ένα χρώμα και στο επόμενο * * Επιπλέον, υπάρχουν 5 προαιρετικές ρυθμίσεις που μπορείτε να προσαρμόσετε: * 1. Το αρχικό χρώμα έχει οριστεί σε μαύρο (έτσι το πρώτο χρώμα ξεθωριάζει in), αλλά * μπορείτε να ορίσετε το αρχικό χρώμα να είναι οποιοδήποτε άλλο χρώμα * 2. Ο εσωτερικός βρόχος εκτελείται για 1020 ενσωματώσεις. η μεταβλητή «αναμονής» * ορίζει την κατά προσέγγιση διάρκεια μιας μεμονωμένης διασταύρωσης. Θεωρητικά, * μια «αναμονή» 10 ms θα πρέπει να κάνει crossFade ~ 10 δευτερολέπτων. Στην πράξη *, οι άλλες λειτουργίες που εκτελεί ο κώδικας είναι αργές * έως seconds 11 δευτερόλεπτα στον πίνακα μου. YMMV. * 3. Εάν η ένδειξη «επανάληψη» έχει οριστεί στο 0, το πρόγραμμα θα κάνει βρόχο επ 'αόριστον. * εάν έχει οριστεί σε έναν αριθμό, θα κάνει βρόχο σε αυτόν τον αριθμό φορές, * και στη συνέχεια θα σταματήσει στο τελευταίο χρώμα της ακολουθίας. (Ορίστε την "επιστροφή" στο 1, * και κάντε το τελευταίο χρώμα μαύρο αν θέλετε να εξαφανιστεί στο τέλος.) * 4. Υπάρχει μια προαιρετική μεταβλητή "κράτημα", η οποία περνάει το πρόγραμμα * για "κράτημα" χιλιοστά του δευτερολέπτου όταν ένα χρώμα είναι πλήρες, * αλλά πριν ξεκινήσει το επόμενο χρώμα. * 5. Ορίστε τη σημαία DEBUG σε 1 εάν θέλετε η έξοδος εντοπισμού σφαλμάτων να αποστέλλεται * στη σειριακή οθόνη. * * Τα εσωτερικά του προγράμματος δεν είναι περίπλοκα, αλλά * είναι λίγο περίεργα - οι εσωτερικές λειτουργίες εξηγούνται * κάτω από τον κύριο βρόχο. * * Απρίλιος 2007, Κλέι Σίρκι *

/ Έξοδος

int grnPin = 9; // Πράσινο LED, συνδεδεμένο με την ψηφιακή ακίδα 10 int redPin = 10; // Κόκκινο LED, συνδεδεμένο με την ψηφιακή ακίδα 9 int bluPin = 11; // Μπλε LED, συνδεδεμένο με την ψηφιακή ακίδα 11

// Πίνακες χρωμάτων

int μαύρο [3] = {0, 0, 0}; int λευκό [3] = {100, 100, 100}; int κόκκινο [3] = {100, 0, 0}; int πράσινο [3] = {0, 100, 0}; int μπλε [3] = {0, 0, 100}; int κίτρινο [3] = {40, 95, 0}; int dimWhite [3] = {30, 30, 30}; // και τα λοιπά.

// Ορίστε το αρχικό χρώμα

int redVal = μαύρο [0]; int grnVal = μαύρο [1]; int bluVal = μαύρο [2];

int αναμονή = 3; // 10ms εσωτερική καθυστέρηση crossFade? αύξηση για πιο αργές εξασθενίσεις

int hold = 0; // Προαιρετικό κράτημα όταν ολοκληρωθεί ένα χρώμα, πριν από το επόμενο crossFade int DEBUG = 0; // μετρητής DEBUG. αν οριστεί σε 1, θα γράψει τιμές πίσω μέσω σειριακού int loopCount = 60; // Πόσο συχνά πρέπει να αναφέρει η DEBUG; int επανάληψη = 0; // Πόσες φορές πρέπει να κάνουμε βρόχο πριν σταματήσουμε; (0 χωρίς στάση) int j = 0; // Μετρητής βρόχου για επανάληψη

// Αρχικοποίηση μεταβλητών χρώματος

int prevR = redVal; int prevG = grnVal; int prevB = bluVal;

// Ρυθμίστε τις εξόδους LED

void setup () {pinMode (redPin, OUTPUT); // ορίζει τις ακίδες ως pinMode εξόδου (grnPin, OUTPUT). pinMode (bluPin, OUTPUT);

if (DEBUG) {// Αν θέλουμε να δούμε τιμές για εντοπισμό σφαλμάτων…

Serial.begin (9600); //… ρυθμίστε τη σειριακή έξοδο}}

// Κύριο πρόγραμμα: απαριθμήστε τη σειρά των διασταυρώσεων

void loop () {crossFade (κόκκινο); crossFade (πράσινο) crossFade (μπλε) crossFade (κίτρινο)

εάν (επανάληψη) {// Κάνουμε βρόχο έναν πεπερασμένο αριθμό φορών;

j += 1; εάν (j> = επανάληψη) {// Είμαστε ακόμα εκεί; έξοδο (ι) · // Αν ναι, σταματήστε. }}}

/* ΠΑΡΑΚΑΤΩ ΑΥΤΗ Η ΓΡΑΜΜΗ ΕΙΝΑΙ ΤΟ ΜΑΘΗΜΑ - ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΤΟ ΑΛΛΑΞΕΤΕ ΑΥΤΟ ΓΙΑ ΤΑ ΒΑΣΙΚΑ

* * Το πρόγραμμα λειτουργεί ως εξής: * Φανταστείτε ένα crossfade που μετακινεί το κόκκινο LED από 0-10, * το πράσινο από 0-5 και το μπλε από 10 σε 7, σε * δέκα βήματα. * Θα θέλαμε να μετρήσουμε τα 10 βήματα και να αυξήσουμε ή * να μειώσουμε τις τιμές χρωμάτων σε ομοιόμορφα βήματα. * Φανταστείτε ότι το + δείχνει αύξηση της τιμής κατά 1 και a - * ισοδυναμεί με μείωση. Το ξεθώριασμα των 10 βημάτων μας θα μοιάζει με: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + + G + + + + + * B - - - * * Το κόκκινο ανεβαίνει από 0 έως 10 σε δέκα βήματα, το πράσινο από * 0-5 σε 5 βήματα και το μπλε πέφτει από 10 σε 7 σε τρία βήματα. * * Στο πραγματικό πρόγραμμα, τα ποσοστά χρώματος μετατρέπονται σε * 0-255 τιμές και υπάρχουν 1020 βήματα (255 * 4). * * Για να καταλάβετε πόσο μεγάλο βήμα πρέπει να είναι μεταξύ ενός σημείου επάνω ή * κάτω από μία από τις τιμές LED, καλούμε calcStep (), * που υπολογίζει το απόλυτο κενό μεταξύ των αρχικών και τελικών τιμών, * και στη συνέχεια διαιρεί αυτό το κενό με 1020 για να καθορίσει το μέγεθος του βήματος * μεταξύ των προσαρμογών στην τιμή. */

int calcStep (int prevValue, int endValue) {

int step = endValue - prevValue; // Ποιο είναι το συνολικό κενό; εάν (βήμα) {// Εάν είναι μηδενικό, βήμα = 1020/βήμα. // διαίρεση με 1020} βήμα επιστροφής. }

/* Η επόμενη συνάρτηση είναι το CalcVal. Όταν η τιμή του βρόχου, * φτάνει το μέγεθος του βήματος που είναι κατάλληλο για ένα από τα * χρώματα, αυξάνει ή μειώνει την τιμή αυτού του χρώματος κατά 1. * (τα R, G και B υπολογίζονται το καθένα ξεχωριστά.) */

int calcVal (int step, int val, int i) {

εάν ((βήμα) && i % βήμα == 0) {// Εάν το βήμα είναι μη μηδενικό και ήρθε η ώρα να αλλάξει μια τιμή, εάν (βήμα> 0) {// αυξήστε την τιμή εάν το βήμα είναι θετικό… val += 1; } else if (βήμα 255) {val = 255; } else if (val <0) {val = 0; } επιστροφή val; }

/* crossFade () μετατρέπει το ποσοστό των χρωμάτων σε a

* Εύρος 0-255, στη συνέχεια βρόχος 1020 φορές, έλεγχος για να δείτε αν * η τιμή πρέπει να ενημερώνεται κάθε φορά και, στη συνέχεια, γράφετε * τις τιμές χρώματος στις σωστές ακίδες. */

void crossFade (int χρώμα [3]) {

// Μετατροπή σε 0-255 int R = (χρώμα [0] * 255) / 100; int G = (χρώμα [1] * 255) / 100; int B = (χρώμα [2] * 255) / 100;

int stepR = calcStep (prevR, R);

int stepG = calcStep (prevG, G); int βήμαB = υπολογισμός Βήμα (prevB, B);

για (int i = 0; i <= 1020; i ++) {redVal = calcVal (stepR, redVal, i); grnVal = υπολογισμόςVal (stepG, grnVal, i); bluVal = calcVal (stepB, bluVal, i);

analogWrite (redPin, redVal); // Γράψτε τις τρέχουσες τιμές στις ακίδες LED

analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal);

καθυστέρηση (αναμονή)? // Παύση για «αναμονή» χιλιοστά του δευτερολέπτου πριν συνεχίσετε τον βρόχο

if (DEBUG) {// Αν θέλουμε σειριακή έξοδο, εκτυπώστε το στο

if (i == 0 ή i % loopCount == 0) {// αρχή, και κάθε loopCount φορές Serial.print ("Loop/RGB: #"); Serial.print (i); Serial.print ("|"); Serial.print (redVal); Serial.print (" /"); Serial.print (grnVal); Serial.print (" /"); Serial.println (bluVal); } DEBUG += 1; }} // Ενημέρωση τρεχουσών τιμών για τον επόμενο βρόχο prevR = redVal; prevG = grnVal; prevB = bluVal; καθυστέρηση (αναμονή)? // Παύση για προαιρετική «αναμονή» χιλιοστά του δευτερολέπτου προτού συνεχίσετε τον βρόχο}

Βήμα 2: Τυλίγοντας το δέντρο

Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο
Τυλίγοντας το Δέντρο

Χρησιμοποίησα αδιάβροχες λωρίδες αφού αυτές θα είναι σε εξωτερικούς χώρους. Κράτησαν από μόνα τους, αλλά παρακολούθησα γρήγορα με καλώδια για να βεβαιωθώ ότι θα παραμείνουν στη θέση τους. Απλό και εύκολο hack. Η ικανότητα τροφοδοσίας της λωρίδας διευκόλυνε την τροφοδοσία της τροφοδοσίας στο κάτω μέρος και την παροχή ενέργειας από την κορυφή στο αστέρι.

Βήμα 3: Μην ξεχνάτε το αστέρι στην κορυφή

Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή
Μην ξεχνάτε το αστέρι στην κορυφή

Για το αστέρι χρησιμοποίησα ένα ζευγάρι τσιπ 10W για να τραβήξω την προσοχή. Τα κόλλησα σε ένα φύλλο χαλκού ως ψύκτρα. Θα μπορούσα να είχα χρησιμοποιήσει περισσότερη λωρίδα, αφού περίσσεψε λίγο.

Βήμα 4: Δοκιμάστε το

Image
Image

Η πρώτη προσπάθεια είχε πολύ γρήγορη ταχύτητα….

Μόλις το ηρέμησα φαινόταν πολύ καλό.

Συνιστάται: