Mục lục:

Đồng hồ LED bằng gỗ - Kiểu tương tự: 11 bước (có hình ảnh)
Đồng hồ LED bằng gỗ - Kiểu tương tự: 11 bước (có hình ảnh)

Video: Đồng hồ LED bằng gỗ - Kiểu tương tự: 11 bước (có hình ảnh)

Video: Đồng hồ LED bằng gỗ - Kiểu tương tự: 11 bước (có hình ảnh)
Video: Phong Thủy Phòng Khách: Tối Kỵ khi treo Đồng Hồ kẻo Rước Nghèo vào nhà! 0989349119 2024, Tháng mười một
Anonim
Đồng hồ LED bằng gỗ - Phong cách tương tự
Đồng hồ LED bằng gỗ - Phong cách tương tự

Đó là một đồng hồ LED bằng gỗ kiểu analog. Tôi không biết tại sao tôi chưa nhìn thấy một trong số những thứ này trước đây.. mặc dù các loại kỹ thuật số rất phổ biến. Anyhoo, chúng tôi bắt đầu!

Bước 1:

Hình ảnh
Hình ảnh
Hình ảnh
Hình ảnh

Dự án đồng hồ ván ép bắt đầu như một dự án khởi động đơn giản cho bộ định tuyến CNC. Tôi đã xem xét các dự án đơn giản trên mạng và tìm thấy chiếc đèn này (hình trên). Tôi cũng đã từng thấy những chiếc đồng hồ kỹ thuật số sáng bóng bằng gỗ veneer (hình trên). Vì vậy, việc kết hợp hai dự án là một ý tưởng hiển nhiên. Để thử thách bản thân, tôi quyết định không sử dụng veneer mà chỉ sử dụng một tấm gỗ cho dự án này.

Bước 2: Thiết kế

Thiết kế
Thiết kế
Thiết kế
Thiết kế

Tôi đã thiết kế đồng hồ trong Inkscape (hình trên). Thiết kế rất đơn giản theo sự lựa chọn. Tôi quyết định chống lại các dấu vết định tuyến cho các dây vì tại thời điểm này tôi không chắc mình muốn đi với hệ thống dây xuyên tâm hay chu vi. (Cuối cùng, tôi quyết định đi dây theo chu vi.) Một neopixel đi trong mỗi lỗ tròn nhỏ để hiển thị giờ phút và giờ, với độ chính xác năm phút. Vòng tròn ở giữa sẽ được chuyển ra ngoài để chứa các thiết bị điện tử.

Bước 3: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Tôi đã thiết kế các đường chạy dao trên MasterCAM và sử dụng công nghệ điện tử để gia công đồng hồ từ ván ép 3/4 inch. Tôi sử dụng một mảnh 15 "x15" cho việc này, với sự lãng phí tối thiểu. Bí quyết là bạn phải di chuyển ra ngoài càng nhiều gỗ càng tốt mà không làm thủng gỗ. Để lại 0,05 "-0,1" là một lựa chọn tốt cho gỗ nhẹ. Nếu bạn không chắc chắn, tốt hơn nên để lại nhiều gỗ hơn, vì bạn luôn có thể chà nhám mặt còn lại. Cuối cùng tôi đã loại bỏ quá nhiều gỗ từ một số bộ phận, nhưng may mắn thay, kết quả không bị ảnh hưởng quá nhiều vì điều này.

Lưu ý cho người dùng không có quyền truy cập vào CNC:

Dự án này có thể dễ dàng được thực hiện bằng máy khoan. Bạn chỉ cần đặt điểm dừng tại điểm mà bạn để lại khoảng 0,1 gỗ ở phần đế. Bạn sẽ phải chính xác, nhưng không quá chính xác. Sau cùng, lý tưởng nhất là không ai thấy tất cả các đèn LED sáng lên ở đồng thời, vì vậy bạn có thể tránh xa một chút cẩu thả.

Bước 4: Điện tử

Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử

Các thiết bị điện tử khá đơn giản. Có 24 neopixel, mười hai để hiển thị giờ và mười hai để hiển thị phút, với độ chính xác năm phút. Arduino pro mini điều khiển các neopixel và nó có được thời gian chính xác thông qua mô-đun đồng hồ thời gian thực (RTC) DS3231. Mô-đun RTC có một ô đồng xu để dự phòng, vì vậy nó không mất thời gian ngay cả khi mất điện.

Vật liệu:

Arduino pro mini (hoặc bất kỳ Arduino nào khác cho vấn đề đó)

Bảng đột phá DS3231

Neopixels trong bảng đột phá riêng lẻ

Bước 5: Lắp ráp điện tử

Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử
Lắp ráp điện tử

Tôi đã kết nối các neopixel trong một chuỗi, sử dụng dây 2,5 cho mười hai đèn led đầu tiên và dây bốn inch cho mười hai đèn tiếp theo. Tôi có thể đã sử dụng độ dài dây nhỏ hơn một chút. Sau khi tạo dây, tôi đã kiểm tra nó, đảm bảo mối hàn khớp tốt. Tôi đã thêm một công tắc tạm thời để bật tất cả các đèn led, chỉ để hiển thị.

Bước 6: Chạy khô

Chạy khô
Chạy khô
Chạy khô
Chạy khô
Chạy khô
Chạy khô
Chạy khô
Chạy khô

Sau khi thử nghiệm, đặt đèn LED vào các lỗ và bật tất cả chúng lên, tôi hài lòng với kết quả. Vì vậy, tôi chà nhám mặt trước một chút và phủ một lớp sơn PU. Sau đó, tôi đã chà nhám chiếc áo khoác đi, nhưng bạn nên để nó lại nếu bạn không thấy nó không hài lòng về mặt thẩm mỹ.

Bước 7: Epoxy

Epoxy
Epoxy
Epoxy
Epoxy

Sau một số thử nghiệm với vị trí đèn LED bên trong các lỗ, tôi nhận thấy rằng cuộc thảo luận tốt nhất đạt được khi các đèn LED cách cuối lỗ khoảng 0,2 . Khi bạn tự mình thử điều này, độ sáng của đèn LED sẽ rất khác nhau trong từng lỗ. Đừng lo lắng về điều này; chúng tôi sẽ sửa nó trong mã. Điều này là do loại mũi khoan tôi đã sử dụng. Nếu tôi phải làm điều này một lần nữa, tôi sẽ sử dụng một mũi khoan đầu bi cho các lỗ Nhưng, trong mọi trường hợp, để có được khoảng cách, tôi trộn một ít epoxy và cho một ít vào mỗi lỗ.

Bước 8: Kết hợp tất cả lại với nhau

Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau
Để tất cả chúng cùng nhau

Các đèn LED sẽ được đặt bắt đầu từ vị trí 12 giờ di chuyển ngược chiều kim đồng hồ qua tất cả các vị trí kim giờ và sau đó đến kim phút, một lần nữa di chuyển từ mốc 60 phút di chuyển ngược chiều kim đồng hồ. Điều này để khi chúng ta nhìn từ phía trước, mẫu đèn LED sẽ xuất hiện theo chiều kim đồng hồ.

Sau khi epoxy đóng rắn trong một giờ, tôi đổ thêm một ít epoxy vào. Lần này, tôi đặt các đèn LED vào các lỗ, đảm bảo bao phủ các dây và mối nối hàn bằng epoxy. Điều này giúp khuếch tán ánh sáng tốt và giữ chặt các dây dẫn.

Bước 9: Mã

Mã số
Mã số

Mã có trên GitHub, vui lòng sửa đổi mã để bạn sử dụng. Khi bạn bật tất cả các đèn LED ở cùng một mức, độ sáng của ánh sáng chiếu qua sẽ rất khác nhau ở mỗi lỗ. Điều này là do độ dày khác nhau của gỗ trong các lỗ và sự khác biệt về độ bóng của gỗ, Như bạn có thể thấy màu gỗ thay đổi khá nhiều trong mảnh của tôi. Để khắc phục sự khác biệt về độ sáng này, tôi đã tạo một ma trận các mức độ sáng của đèn led. Và giảm độ sáng của đèn LED sáng hơn. Đó là một quá trình thử và sai và có thể mất vài phút, nhưng kết quả rất xứng đáng.

plywoodClock.ino

// Đồng hồ ván ép
// Tác giả: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Bạn có thể tự do:
// Chia sẻ - sao chép và phân phối lại tài liệu ở bất kỳ phương tiện hoặc định dạng nào
// Thích ứng - phối lại, biến đổi và xây dựng dựa trên tài liệu cho bất kỳ mục đích nào, kể cả về mặt thương mại.
// Tiếng hoan hô!
#bao gồm
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#bao gồm
#endif
# xác địnhPIN6
Dải Adafruit_NeoPixel = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int giờPixel = 0;
int phútPixel = 0;
unsignedlong lastRtcCheck;
Chuỗi inputString = ""; // một chuỗi để chứa dữ liệu đến
boolean stringComplete = false; // liệu chuỗi đã hoàn thành chưa
int cấp [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
while (! nối tiếp); // cho Leonardo / Micro / Zero
#endif
// Đây là cho Trinket 5V 16MHz, bạn có thể loại bỏ ba dòng này nếu bạn không sử dụng Trinket
#if được xác định (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#endif
// Kết thúc mã đặc biệt của trang sức
Serial.begin (9600);
dải.begin ();
dải.show (); // Khởi tạo tất cả các pixel thành 'tắt'
if (! rtc.begin ()) {
Serial.println ("Không tìm thấy RTC");
trong khi (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
if (rtc.lostPower ()) {
Serial.println ("RTC bị mất nguồn, hãy đặt thời gian!");
// dòng sau đặt RTC thành ngày và giờ mà bản phác thảo này được biên dịch
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// Dòng này đặt RTC với ngày và giờ rõ ràng, chẳng hạn để đặt
// Ngày 21 tháng 1 năm 2014 lúc 3 giờ sáng, bạn sẽ gọi:
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
}
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
// lightUpEven ();
// trong khi (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 ();
}
if (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Cấp độ");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Đang hiển thị thời gian");
showTime ();
dải.show ();
}
if (inputString [0] == '1') {
Serial.println ("Bật tất cả các đèn LED");
lightUp (dải. Color (255, 255, 255));
dải.show ();
}
if (inputString [0] == '0') {
Serial.println ("Dải xóa");
sạch();
dải.show ();
}
// # 3, 255 sẽ đặt số dẫn đầu 3 thành cấp 255, 255, 255
if (inputString [0] == '#') {
String temp;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int Cường độ = temp.toInt ();
Serial.print ("Cài đặt");
Serial.print (pixNum);
Serial.print ("to level");
Serial.println (cường độ);
dải.setPixelColor (pixNum, dải. Color (cường độ, cường độ, cường độ));
dải.show ();
}
// # 3, 255, 0, 125 sẽ đặt số dẫn đầu 3 thành cấp 255, 0, 125
if (inputString [0] == '$') {
String temp;
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 ("Cài đặt");
Serial.print (pixNum);
Serial.print ("R to");
Serial.print (rIntensity);
Serial.print ("G to");
Serial.print (gIntensity);
Serial.print ("B to");
Serial.println (bIntensity);
dải.setPixelColor (pixNum, dải. Color (rIntensity, gIntensity, bIntensity));
dải.show ();
}
if (inputString [0] == 's') {
String temp;
int giờ, phút;
temp = inputString.substring (1);
giờ = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
phút = temp.toInt ();
Serial.print ("Đang hiển thị thời gian:");
Serial.print (giờ);
Serial.print (":");
Serial.print (phút);
showTime (giờ, phút);
chậm trễ (1000);
}
inputString = "";
stringComplete = false;
}
// delay (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString + = inChar;
if (inChar == '\ n') {
stringComplete = true;
}
trì hoãn (1);
}
}
voidclear () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
dải.setPixelColor (i, dải. Color (0, 0, 0));
}
}
voidshowTime () {
DateTime now = rtc.now ();
giờPixel = now.hour ()% 12;
phútPixel = (now.minute () / 5)% 12 + 12;
sạch();
// dải.setPixelColor (giờPixel, dải. Color (40 + 40 * cấp [giờPixel], 30 + 30 * cấp [giờPixel], 20 + 20 * cấp [giờPixel]));
// dải.setPixelColor (phútPixel, dải. Color (40 + 40 * cấp [phútPixel], 30 + 30 * cấp [phútPixel], 20 + 20 * cấp [phútPixel]));
strip.setPixelColor (giờPixel, dải. Color (mức [giờPixel], mức [giờPixel], mức [giờPixel]));
dải.setPixelColor (phútPixel, dải. Color (mức [phútPixel], mức [phútPixel], mức [phútPixel]));
// lightUp (dải. Color (255, 255, 255));
dải.show ();
}
voidshowTime (int giờ, int phút) {
giờPixel = giờ% 12;
phútPixel = (phút / 5)% 12 + 12;
sạch();
// dải.setPixelColor (giờPixel, dải. Color (40 + 40 * cấp [giờPixel], 30 + 30 * cấp [giờPixel], 20 + 20 * cấp [giờPixel]));
// dải.setPixelColor (phútPixel, dải. Color (40 + 40 * cấp [phútPixel], 30 + 30 * cấp [phútPixel], 20 + 20 * cấp [phútPixel]));
strip.setPixelColor (giờPixel, dải. Color (mức [giờPixel], mức [giờPixel], mức [giờPixel]));
dải.setPixelColor (phútPixel, dải. Color (mức [phútPixel], mức [phútPixel], mức [phútPixel]));
// lightUp (dải. Color (255, 255, 255));
dải.show ();
}
voidlightUp (uint32_t color) {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
dải.setPixelColor (i, màu);
}
dải.show ();
}
voidlightUpEven () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
dải.setPixelColor (i, dải. Color (cấp , cấp , cấp ));
}
dải.show ();
}

xem rawplywoodClock.ino được lưu trữ với ❤ bởi GitHub

Bước 10: Thị giác máy tính - Hiệu chỉnh

Thị giác máy tính - Hiệu chuẩn
Thị giác máy tính - Hiệu chuẩn
Thị giác máy tính - Hiệu chuẩn
Thị giác máy tính - Hiệu chuẩn

Tôi đã có một lựa chọn có ý thức để không sử dụng veneer trong dự án này. Nếu tôi có, độ dày của gỗ sẽ giống nhau ở phía trước của tất cả các đèn LED. Tuy nhiên, vì tôi có độ dày của gỗ khác nhau ở phía trước của mỗi đèn LED và vì màu gỗ cũng thay đổi rất nhiều, độ sáng của đèn LED khác nhau đối với mỗi đèn LED. Để làm cho tất cả các đèn LED có cùng độ sáng, tôi đã nghĩ ra một thủ thuật tiện lợi.

Tôi đã viết một số mã xử lý (trên GitHub) để chụp ảnh đồng hồ và lần lượt phân tích độ sáng của từng đèn LED. Sau đó, nó thay đổi công suất cho từng đèn LED để cố gắng làm cho tất cả chúng có cùng độ sáng với đèn LED mờ nhất. Bây giờ, tôi biết điều này là quá mức cần thiết, nhưng xử lý hình ảnh rất thú vị! Và, tôi hy vọng sẽ phát triển mã hiệu chuẩn như một thư viện.

Bạn có thể thấy độ sáng của đèn LED trước và sau khi hiệu chỉnh trong các bức ảnh trên.

hiệu chỉnhDispllay.pde

importprocessing.video. *;
importprocessing.serial. *;
Nối tiếp myPort;
Quay video;
finalint numLed = 24;
int ledNum = 0;
// bạn phải có những thay đổi chung này để sử dụng 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 xong;
int numPixelsInLed;
long ledIntensity;
int ledPower;
long targetIntensity = 99999999;
voidsetup () {
xong = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
for (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Serial.list () [31];
myPort = newSerial (this, portName, 9600);
kích thước (640, 480);
video = newCapture (this, width, height);
video.start ();
noStroke ();
mịn màng();
chậm trễ (1000); // Chờ cổng nối tiếp mở
}
voiddraw () {
if (video.available ()) {
if (done [ledNum] == 0) {
clearDisplay ();
chậm trễ (1000);
video.read ();
hình ảnh (video, 0, 0, chiều rộng, chiều cao); // Vẽ video webcam lên màn hình
saveFrame ("data / no_leds.jpg");
if (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) {
xong [ledNum] = 1;
print ("Led");
in (ledNum);
print ("xong");
}
if (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
if (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
chậm trễ (1000);
video.read ();
hình ảnh (video, 0, 0, chiều rộng, chiều cao); // Vẽ video webcam lên màn hình
chậm trễ (10);
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// print (char (inByte));
}
String imageName = "data /";
imageName + = str (ledNum);
imageName + = "_ led.jpg";
saveFrame (imageName);
String originalImageName = "data / org";
originalImageName + = str (ledNum);
originalImageName + = ". jpg";
if (runNumber == 0) {
saveFrame (originalImageName);
}
PImage noLedImg = loadImage ("data / no_leds.jpg");
PImage ledImg = loadImage (imageName);
PImage originalImg = loadImage (tên ban đầu);
noLedImg.loadPixels ();
ledImg.loadPixels ();
originalImg.loadPixels ();
nền (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
for (int x = 0; x <width; x ++) {
for (int y = 0; y <height; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, width);
PxPGetPixelLed (x, y, ledImg.pixels, chiều rộng);
PxPGetPixelOrg (x, y, originalImg.pixels, chiều rộng);
nếu ((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] ++;
} khác {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pixel, chiều rộng);
}
}
ledIntensity [ledNum] / = numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
in (ledNum);
in(', ');
in (ledPower [ledNum]);
in(', ');
println (ledIntensity [ledNum]);
ledNum ++;
if (ledNum == numLed) {
int donezo = 0;
for (int i = 0; i <numLed; i ++) {
donezo + = xong ;
}
if (donezo == numLed) {
println ("XONG");
for (int i = 0; i <numLed; i ++) {
in (i);
print ("\ t");
println (ledPower );
}
print ("int level [");
in (ledNum);
print ("] = {");
for (int i = 0; i <numLed-1; i ++) {
in (ledPower );
in(', ');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
while (đúng);
}
print ("Cường độ mục tiêu:");
if (runNumber == 0) {
targetIntensity - = 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x + y * pixelWidth]; // lấy màu dưới dạng int từ các pixel
aOrg = (thisPixel >> 24) & 0xFF; // chúng ta cần phải shift và mask để lấy riêng từng thành phần
rOrg = (thisPixel >> 16) & 0xFF; // điều này nhanh hơn gọi red (), green (), blue ()
gOrg = (thisPixel >> 8) & 0xFF;
bOrg = thisPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x + y * pixelWidth]; // lấy màu dưới dạng int từ các pixel
aDark = (thisPixel >> 24) & 0xFF; // chúng ta cần phải shift và mask để lấy riêng từng thành phần
rDark = (thisPixel >> 16) & 0xFF; // điều này nhanh hơn gọi red (), green (), blue ()
gDark = (thisPixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x + y * pixelWidth]; // lấy màu dưới dạng int từ các pixel
aLed = (thisPixel >> 24) & 0xFF; // chúng ta cần phải shift và mask để lấy riêng từng thành phần
rLed = (thisPixel >> 16) & 0xFF; // điều này nhanh hơn gọi red (), green (), blue ()
gLed = (thisPixel >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Chúng tôi đang đóng gói tất cả 4 thành phần thành một int
g = g << 8; // vì vậy chúng ta cần chuyển chúng đến vị trí của chúng
color argb = a | r | g | NS; // phép toán nhị phân "hoặc" thêm tất cả chúng vào một int
pixelArray [x + y * pixelWidth] = argb; // finaly chúng tôi đặt int với các màu te thành các pixel
}

xem rawcalibrateDispllay.pde được lưu trữ với ❤ bởi GitHub

Bước 11: Nhận xét chia tay

Những sai lầm để tránh:

* Với gỗ, bạn nhận được những gì bạn phải trả cho. Vì vậy, hãy lấy gỗ có chất lượng tốt. Ván ép bạch dương là một lựa chọn tốt; bất kỳ loại gỗ rắn nhẹ nào cũng sẽ hoạt động tốt. Tôi đã bán rẻ gỗ và hối hận về quyết định của mình.

* Tốt hơn là bạn nên khoan ít hơn nhiều. Một vài lỗ thủng quá sâu so với mảnh ghép của tôi. Và lớp epoxy thể hiện qua mặt trước. Nó rất đáng chú ý khi bạn nhận thấy nó.

* Sử dụng mũi khoan đầu bi thay vì đầu thẳng. Tôi chưa thử nghiệm chút nào về đầu bóng, nhưng tôi khá chắc chắn rằng kết quả sẽ tốt hơn nhiều.

Tôi đang tán tỉnh ý tưởng bán những thứ này trên Etsy hoặc tindie. Tôi thực sự đánh giá cao nó nếu bạn có thể bình luận bên dưới nếu bạn nghĩ nó có ý nghĩa:)

Đề xuất: