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

Ξύλινο ρολόι LED - Αναλογικό στυλ: 11 βήματα (με εικόνες)
Ξύλινο ρολόι LED - Αναλογικό στυλ: 11 βήματα (με εικόνες)

Βίντεο: Ξύλινο ρολόι LED - Αναλογικό στυλ: 11 βήματα (με εικόνες)

Βίντεο: Ξύλινο ρολόι LED - Αναλογικό στυλ: 11 βήματα (με εικόνες)
Βίντεο: Part 1 - The Time Machine Audiobook by H. G. Wells (Chs 01-06) 2024, Ιούλιος
Anonim
Ξύλινο ρολόι LED - Αναλογικό στυλ
Ξύλινο ρολόι LED - Αναλογικό στυλ

Είναι ένα ξύλινο ρολόι αναλογικού στιλ LED. Δεν ξέρω γιατί δεν έχω ξαναδεί ένα από αυτά.. αν και οι ψηφιακοί τύποι είναι πολύ συνηθισμένοι. Τέλος πάντων, πάμε!

Βήμα 1:

Εικόνα
Εικόνα
Εικόνα
Εικόνα

Το έργο ρολογιού από κόντρα πλακέ ξεκίνησε ως ένα απλό πρόγραμμα εκκίνησης για το δρομολογητή CNC. Κοίταζα απλά έργα στο διαδίκτυο και βρήκα αυτόν τον λαμπτήρα (εικόνα παραπάνω). Είχα επίσης δει ψηφιακά ρολόγια που λάμπουν μέσα από ξύλινο καπλαμά (εικόνα παραπάνω). Έτσι, ο συνδυασμός των δύο έργων ήταν μια προφανής ιδέα. Θέλοντας να προκαλέσω τον εαυτό μου, αποφάσισα να μην χρησιμοποιήσω καπλαμά αλλά μόνο ένα κομμάτι ξύλου για αυτό το έργο.

Βήμα 2: Σχεδιασμός

Σχέδιο
Σχέδιο
Σχέδιο
Σχέδιο

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

Βήμα 3: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Σχεδίασα τις διαδρομές εργαλείων στο MasterCAM και χρησιμοποίησα ένα technoRouter για να αλέσω το ρολόι από κόντρα πλακέ 3/4 ιντσών. Χρησιμοποιώ ένα κομμάτι 15 "x15" για αυτό, με ελάχιστη σπατάλη. Το κόλπο είναι να ξεδιπλώσετε όσο το δυνατόν περισσότερο ξύλο χωρίς να σπάσετε το ξύλο. Φεύγοντας 0,05 "-0,1" είναι μια καλή επιλογή για ελαφρύ ξύλο. Εάν δεν είστε σίγουροι, είναι καλύτερα να αφήσετε περισσότερο ξύλο, γιατί μπορείτε πάντα να τρίψετε το άλλο πρόσωπο. Κατέληξα να αφαιρέσω λίγο πολύ ξύλο από κάποια μέρη, αλλά ευτυχώς τα αποτελέσματα δεν υποφέρουν πολύ εξαιτίας αυτού.

Σημείωση για χρήστες χωρίς πρόσβαση σε CNC:

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

Βήμα 4: Ηλεκτρονικά

ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ
ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ
ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ
ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ
ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ
ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ

Τα ηλεκτρονικά είναι αρκετά απλά. Υπάρχουν 24 neopixel, δώδεκα για την εμφάνιση των ωρών και δώδεκα για την εμφάνιση των λεπτών, με πεντάλεπτη ακρίβεια. Ένα Arduino pro mini ελέγχει τα neopixel και λαμβάνει ακριβή χρόνο μέσω μιας μονάδας ρολογιού πραγματικού χρόνου (RTC) DS3231. Η μονάδα RTC έχει ένα κελί νομίσματος ως εφεδρικό, οπότε δεν χάνει χρόνο ακόμη και όταν η τροφοδοσία είναι απενεργοποιημένη.

Υλικό:

Arduino pro mini (ή οποιοδήποτε άλλο Arduino για αυτό το θέμα)

DS3231 breakout board

Neopixels σε μεμονωμένους πίνακες διαρροής

Βήμα 5: Συναρμολόγηση ηλεκτρονικών συσκευών

Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών
Συναρμολόγηση Ηλεκτρονικών

Συνέδεσα τα νεοπίξελ σε μια χορδή, χρησιμοποιώντας καλώδια 2,5 για τα πρώτα δώδεκα led και σύρμα τεσσάρων ιντσών για τα επόμενα δώδεκα. Θα μπορούσα να είχα χρησιμοποιήσει ελαφρώς μικρότερα μήκη σύρματος. Αφού έφτιαξα τη χορδή, τη δοκίμασα, βεβαιώνοντας ότι η συγκόλληση Οι αρθρώσεις ήταν καλές. Πρόσθεσα έναν στιγμιαίο διακόπτη για να ενεργοποιήσω όλα τα led, μόνο και μόνο για επίδειξη.

Βήμα 6: Στεγνό τρέξιμο

Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο
Ξηρό τρέξιμο

Αφού πειραματίστηκα, έβαλα LED στις οπές και τα άναψα όλα, ήμουν ικανοποιημένος με τα αποτελέσματα. Έτσι τρίψαμε λίγο το μπροστινό πρόσωπο και έβαλα ένα παλτό PU. Κατέληξα να τρίβω το παλτό αργότερα, αλλά είναι καλή ιδέα να το αφήσετε αν δεν το θεωρείτε αισθητικά δυσάρεστο.

Βήμα 7: Εποξειδικό

Εποξειδικό
Εποξειδικό
Εποξειδικό
Εποξειδικό

Μετά από μερικές δοκιμές με τη θέση led μέσα στις οπές, κατάλαβα ότι η καλύτερη συζήτηση επιτυγχάνεται όταν τα LED είναι περίπου 0,2 μακριά από το τέλος της οπής. Όταν το δοκιμάσετε μόνοι σας, η φωτεινότητα των LED θα είναι πολύ διαφορετική κάθε τρύπα. Μην ανησυχείτε για αυτό. θα το διορθώσουμε με κωδικό. Αυτό οφείλεται στον τύπο του τρυπανιού που χρησιμοποίησα. Αν το έκανα ξανά αυτό, θα χρησιμοποιούσα ένα τρυπάνι με τερματικό για τις τρύπες Αλλά, σε κάθε περίπτωση, για να πάρω την απόσταση, ανακάτεψα λίγο εποξειδικό και έβαλα λίγο σε κάθε τρύπα.

Βήμα 8: Το βάζουμε όλα μαζί

Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί

Οι λυχνίες LED θα τοποθετηθούν ξεκινώντας από τη θέση του χεριού των 12 ωρών κινούμενη αριστερόστροφα σε όλες τις θέσεις των ωρών και στη συνέχεια στο λεπτό δείκτη, μετακινώντας ξανά από το σημάδι των 60 λεπτών κινούμενο αριστερόστροφα. Αυτό συμβαίνει έτσι ώστε όταν βλέπουμε από μπροστά το μοτίβο LED εμφανίζεται δεξιόστροφα.

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

Βήμα 9: Κωδικός

Κώδικας
Κώδικας

Ο κώδικας είναι στο GitHub, μη διστάσετε να τον τροποποιήσετε για χρήση σας. Όταν ενεργοποιείτε όλες τις λυχνίες LED στο ίδιο επίπεδο, η φωτεινότητα του φωτός που διαπερνά θα είναι πολύ διαφορετική σε κάθε τρύπα. Αυτό οφείλεται στο διαφορετικό πάχος του ξύλου στις τρύπες και τη διαφορά στη σκιά του ξύλου, όπως μπορείτε να δείτε το χρώμα του ξύλου ποικίλλει αρκετά στο κομμάτι μου. Για να διορθώσω αυτήν τη διαφορά στη φωτεινότητα, έφτιαξα ένα πίνακα επιπέδων φωτεινότητας led. Και μείωσε τη φωτεινότητα των φωτεινότερων LED. Είναι μια διαδικασία δοκιμής και σφάλματος και μπορεί να διαρκέσει αρκετά λεπτά, αλλά τα αποτελέσματα αξίζουν τον κόπο.

plywoodClock.ino

// Ρολόι από κόντρα πλακέ
// Συγγραφέας: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Είστε ελεύθεροι να:
// Κοινή χρήση - αντιγράψτε και αναδιανείμετε το υλικό σε οποιοδήποτε μέσο ή μορφή
// Προσαρμογή - αναμίξτε, μεταμορφώστε και βασιστείτε στο υλικό για οποιονδήποτε σκοπό, ακόμη και εμπορικά.
// Χουράι!
#περιλαμβάνω
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#περιλαμβάνω
#τέλος εαν
#definePIN6
Λωρίδα Adafruit_NeoPixel = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int hourPixel = 0;
int minutePixel = 0;
unsignedlong lastRtcCheck;
String inputString = ""; // μια συμβολοσειρά για τη συγκράτηση των εισερχόμενων δεδομένων
boolean stringComplete = false; // εάν η συμβολοσειρά είναι πλήρης
int επίπεδο [24] = {31, 51, 37, 64, 50, 224, 64, 102, 95, 255, 49, 44, 65, 230, 80, 77, 102, 87, 149, 192, 67, 109, 68, 77};
voidsetup () {
#ifndef ESP8266
ενώ (! Σειριακό)? // για Leonardo/Micro/Zero
#τέλος εαν
// Αυτό είναι για Trinket 5V 16MHz, μπορείτε να αφαιρέσετε αυτές τις τρεις γραμμές εάν δεν χρησιμοποιείτε Trinket
#if καθορισμένα (_AVR_ATtiny85_)
εάν (F_CPU == 16000000) clock_prescale_set (clock_div_1)?
#τέλος εαν
// Ειδικός κωδικός τέλους μπιχλιμπιδιού
Serial.begin (9600);
strip.begin ();
strip.show (); // Αρχικοποίηση όλων των εικονοστοιχείων σε "απενεργοποίηση"
εάν (! rtc.begin ()) {
Serial.println ("Δεν βρέθηκε RTC");
ενώ (1)?
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
εάν (rtc.lostPower ()) {
Serial.println ("Το RTC έχασε το ρεύμα, αφήνει να ρυθμιστεί η ώρα!");
// η ακόλουθη γραμμή ορίζει το RTC στην ημερομηνία και ώρα κατάρτισης αυτού του σκίτσου
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// Αυτή η γραμμή ορίζει το RTC με ρητή ημερομηνία και ώρα, για παράδειγμα για να ορίσετε
// 21 Ιανουαρίου 2014 στις 3 το πρωί θα καλέσετε:
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
}
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
// lightUpEven ();
// ενώ (1);
lastRtcCheck = 0;
}
voidloop () {
if (millis () - lastRtcCheck> 2000) {
DateTime now = rtc.now ();
Serial.print (now.hour (), DEC);
Serial.print (':');
Serial.print (now.minute (), DEC);
Serial.print (':');
Serial.print (now.second (), DEC);
Serial.println ();
showTime ();
lastRtcCheck = millis ();
}
αν (! digitalRead (2)) {
lightUpEven ();
}
εάν (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Επίπεδο");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Εμφάνιση χρόνου");
showTime ();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println ("Ενεργοποίηση όλων των LED");
lightUp (λωρίδα. Χρώμα (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("Λωρίδα εκκαθάρισης");
Σαφή();
strip.show ();
}
// #3, 255 θα θέσει τον αριθμό led 3 στο επίπεδο 255, 255, 255
if (inputString [0] == '#') {
Θερμοκρασία συμβολοσειράς
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int ένταση = temp.toInt ();
Serial.print ("Ρύθμιση");
Serial.print (pixNum);
Serial.print ("στο επίπεδο");
Serial.println (ένταση);
strip.setPixelColor (pixNum, strip. Color (ένταση, ένταση, ένταση));
strip.show ();
}
// #3, 255, 0, 125 θα θέσει τον αριθμό led 3 στο επίπεδο 255, 0, 125
if (inputString [0] == '$') {
Θερμοκρασία συμβολοσειράς
temp = inputString.substring (1);
int pixNum = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
int rIntensity = temp.toInt ();
intgIndex = inputString.indexOf (',', rIndex + 1) + 1;
temp = inputString.substring (gIndex);
intgIntensity = temp.toInt ();
int bIndex = inputString.indexOf (',', gIndex + 1) + 1;
temp = inputString.substring (bIndex);
int bIntensity = temp.toInt ();
Serial.print ("Ρύθμιση");
Serial.print (pixNum);
Serial.print ("R to");
Serial.print (rIntensity);
Serial.print ("G to");
Serial.print (gIntensity);
Serial.print ("B έως");
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's') {
Θερμοκρασία συμβολοσειράς
int ώρα, λεπτό?
temp = inputString.substring (1);
ώρα = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
λεπτό = temp.toInt ();
Serial.print ("Showingρα προβολής:");
Serial.print (ώρα)
Serial.print (":");
Serial.print (λεπτό);
showTime (ώρα, λεπτό)
καθυστέρηση (1000)?
}
inputString = "";
stringComplete = false;
}
// καθυστέρηση (1000);
}
voidserialEvent () {
ενώ (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
εάν (inChar == '\ n') {
stringComplete = true;
}
καθυστέρηση (1)?
}
}
voidclear () {
για (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (0, 0, 0));
}
}
voidshowTime () {
DateTime now = rtc.now ();
hourPixel = now.hour () % 12;
minutePixel = (τώρα.λεπτά () / 5) % 12 + 12;
Σαφή();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * επίπεδο [hourPixel], 30 + 30 * επίπεδο [hourPixel], 20 + 20 * επίπεδο [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * επίπεδο [minutePixel], 30 + 30 * επίπεδο [minutePixel], 20 + 20 * επίπεδο [minutePixel]));
strip.setPixelColor (hourPixel, strip. Color (επίπεδο [hourPixel], επίπεδο [hourPixel], επίπεδο [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (επίπεδο [minutePixel], επίπεδο [minutePixel], επίπεδο [minutePixel]));
// lightUp (λωρίδα. Χρώμα (255, 255, 255));
strip.show ();
}
voidshowTime (int ώρα, int λεπτό) {
hourPixel = ώρα % 12;
minutePixel = (λεπτό / 5) % 12 + 12;
Σαφή();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * επίπεδο [hourPixel], 30 + 30 * επίπεδο [hourPixel], 20 + 20 * επίπεδο [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * επίπεδο [minutePixel], 30 + 30 * επίπεδο [minutePixel], 20 + 20 * επίπεδο [minutePixel]));
strip.setPixelColor (hourPixel, strip. Color (επίπεδο [hourPixel], επίπεδο [hourPixel], επίπεδο [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (επίπεδο [minutePixel], επίπεδο [minutePixel], επίπεδο [minutePixel]));
// lightUp (λωρίδα. Χρώμα (255, 255, 255));
strip.show ();
}
voidlightUp (χρώμα uint32_t) {
για (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, χρώμα);
}
strip.show ();
}
voidlightUpEven () {
για (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (επίπεδο , επίπεδο , επίπεδο ));
}
strip.show ();
}

προβολή rawplywoodClock.ino που φιλοξενείται με ❤ από το GitHub

Βήμα 10: Όραμα υπολογιστή - Βαθμονόμηση

Όραμα υπολογιστή - βαθμονόμηση
Όραμα υπολογιστή - βαθμονόμηση
Όραμα υπολογιστή - βαθμονόμηση
Όραμα υπολογιστή - βαθμονόμηση

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

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

Μπορείτε να δείτε τη φωτεινότητα LED πριν και μετά τη βαθμονόμηση στις παραπάνω φωτογραφίες.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Σειριακό myPort;
Λήψη βίντεο.
finalint numLed = 24;
int ledNum = 0;
// πρέπει να έχετε αυτές τις γενικές μεταβλητές για να χρησιμοποιήσετε το PxPGetPixelDark ()
int rDark, gDark, bDark, aDark;
int rLed, gLed, bLed, aLed;
int rOrg, gOrg, bOrg, aOrg;
int rTemp, gTemp, bTemp, aTemp;
PImage ourImage?
int runNumber = 0;
int acceptError = 3;
int έγινε?
int numPixelsInLed;
long ledIntensity?
int ledPower;
long targetIntensity = 99999999;
voidsetup () {
έγινε = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
για (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Serial.list () [31];
myPort = newSerial (αυτό, portName, 9600);
μέγεθος (640, 480).
βίντεο = newCapture (αυτό, πλάτος, ύψος);
video.start ();
noStroke ();
λείος();
καθυστέρηση (1000)? // Περιμένετε να ανοίξει η σειριακή θύρα
}
voiddraw () {
εάν (βίντεο.διαθέσιμο ()) {
εάν (έγινε [ledNum] == 0) {
clearDisplay ();
καθυστέρηση (1000)?
video.read ();
εικόνα (βίντεο, 0, 0, πλάτος, ύψος)? // Σχεδιάστε το βίντεο της κάμερας στην οθόνη
saveFrame ("data/no_leds.jpg");
αν (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> acceptError) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> acceptError) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= acceptError) {
έγινε [ledNum] = 1;
εκτύπωση ("Led");
εκτύπωση (ledNum);
εκτύπωση ("έγινε");
}
εάν (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
εάν (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
καθυστέρηση (1000)?
video.read ();
εικόνα (βίντεο, 0, 0, πλάτος, ύψος)? // Σχεδιάστε το βίντεο της κάμερας στην οθόνη
καθυστέρηση (10)?
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// εκτύπωση (char (inByte));
}
String imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
String originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
αν (runNumber == 0) {
saveFrame (originalImageName);
}
PImage noLedImg = loadImage ("data/no_leds.jpg");
PImage ledImg = loadImage (imageName);
PImage originalImg = loadImage (originalImageName);
noLedImg.loadPixels ();
ledImg.loadPixels ();
originalImg.loadPixels ();
φόντο (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
για (int x = 0; x <πλάτος; x ++) {
για (int y = 0; y <ύψος; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, πλάτος);
PxPGetPixelLed (x, y, ledImg.pixels, πλάτος).
PxPGetPixelOrg (x, y, originalImg.pixels, πλάτος);
εάν ((rOrg+gOrg/2+bOrg/3)-(rDark+gDark/2+bDark/3)> 75) {
ledIntensity [ledNum] = ledIntensity [ledNum]+(rLed+gLed/2+bLed/3) -(rDark+gDark/2+bDark/3);
rTemp = 255;
gTemp = 255;
bTemp = 255;
numPixelsInLed [ledNum] ++;
} αλλο {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pixel, πλάτος).
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
εκτύπωση (ledNum);
Τυπώνω(', ');
εκτύπωση (ledPower [ledNum]);
Τυπώνω(', ');
println (ledIntensity [ledNum]);
ledNum ++;
εάν (ledNum == numLed) {
int donezo = 0;
για (int i = 0; i <numLed; i ++) {
donezo += τελείωσε ;
}
εάν (donezo == numLed) {
println ("DONE");
για (int i = 0; i <numLed; i ++) {
εκτύπωση (i)?
εκτύπωση ("\ t");
println (ledPower );
}
εκτύπωση ("int level [");
εκτύπωση (ledNum);
εκτύπωση ("] = {");
για (int i = 0; i <numLed-1; i ++) {
εκτύπωση (ledPower );
Τυπώνω(', ');
}
εκτύπωση (ledPower [numLed -1]);
println ("};");
lightUpEven ();
ενώ (αληθινό)?
}
εκτύπωση ("Ένταση στόχου:");
αν (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // λήψη των χρωμάτων ως int από τα εικονοστοιχεία
aOrg = (αυτό το pixel >> 24) & 0xFF; // πρέπει να αλλάξουμε και να καλύψουμε τη μάσκα για να πάρουμε κάθε στοιχείο μόνο του
rOrg = (thisPixel >> 16) & 0xFF; // αυτό είναι γρηγορότερο από το να καλείτε κόκκινο (), πράσινο (), μπλε ()
gOrg = (thisPixel >> 8) & 0xFF;
bOrg = thisPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // λήψη των χρωμάτων ως int από τα εικονοστοιχεία
aDark = (thisPixel >> 24) & 0xFF; // πρέπει να αλλάξουμε και να καλύψουμε τη μάσκα για να πάρουμε κάθε στοιχείο μόνο του
rDark = (thisPixel >> 16) & 0xFF; // αυτό είναι γρηγορότερο από το να καλείτε κόκκινο (), πράσινο (), μπλε ()
gDark = (αυτό το pixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // λήψη των χρωμάτων ως int από τα εικονοστοιχεία
aLed = (thisPixel >> 24) & 0xFF; // πρέπει να αλλάξουμε και να καλύψουμε τη μάσκα για να πάρουμε κάθε στοιχείο μόνο του
rLed = (thisPixel >> 16) & 0xFF; // αυτό είναι γρηγορότερο από το να καλείτε κόκκινο (), πράσινο (), μπλε ()
gLed = (thisPixel >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Συσκευάζουμε και τα 4 σύνθετα σε ένα int
g = g << 8; // οπότε πρέπει να τα μεταφέρουμε στις θέσεις τους
χρώμα argb = a | r | ζ | σι; // δυαδική "ή" λειτουργία τα προσθέτει όλα σε ένα int
pixelArray [x+y*pixelsWidth] = argb; // τελικώς ορίζουμε τα int με τα χρώματα στα pixel
}

προβολή rawcalibrateDispllay.pde που φιλοξενείται με ❤ από το GitHub

Βήμα 11: Παρατηρήσεις χωρισμού

Παγίδες που πρέπει να αποφύγετε:

* Με το ξύλο, παίρνετε αυτό που πληρώνετε. Λοιπόν, πάρτε ξύλο καλής ποιότητας. Το κόντρα πλακέ σημύδας είναι μια καλή επιλογή. οποιοδήποτε ελαφρύ μασίφ ξύλο θα κάνει επίσης ωραία επίσης. Έχω φθηνά στο ξύλο και μετανιώνω για την απόφασή μου.

* Είναι καλύτερα να τρυπάτε λιγότερο από περισσότερο. Μερικές από τις τρύπες πήγαν πολύ βαθιά για το κομμάτι μου. Και το εποξικό εμφανίζεται στο μπροστινό μέρος. Είναι πολύ αισθητό μόλις το παρατηρήσετε.

* Χρησιμοποιήστε ένα τρυπάνι με σφαιρική άκρη αντί για ευθεία άκρη. Δεν έχω πειραματιστεί με το άκρο της μπάλας, αλλά είμαι σίγουρος ότι τα αποτελέσματα θα είναι πολύ καλύτερα.

Φλερτάρω με την ιδέα να τα πουλήσω σε Etsy ή tindie. Θα το εκτιμούσα πολύ αν μπορούσατε να σχολιάσετε παρακάτω αν νομίζετε ότι είναι λογικό:)

Συνιστάται: