İçindekiler:

Ahşap LED Saat - Analog Stil: 11 Adım (Resimli)
Ahşap LED Saat - Analog Stil: 11 Adım (Resimli)

Video: Ahşap LED Saat - Analog Stil: 11 Adım (Resimli)

Video: Ahşap LED Saat - Analog Stil: 11 Adım (Resimli)
Video: BUNU YAŞAMAYAN YOKTUR 😂 #emirbeşli #shorts 2024, Aralık
Anonim
Ahşap LED Saat - Analog Stil
Ahşap LED Saat - Analog Stil

Analog tarzda ahşap bir LED saattir. Bunlardan birini neden daha önce görmediğimi bilmiyorum.. Dijital türleri çok yaygın olmasına rağmen. Her neyse, işte başlıyoruz!

Aşama 1:

resim
resim
resim
resim

Kontrplak saat projesi, CNC router için basit bir başlangıç projesi olarak başladı. Çevrimiçi basit projelere bakıyordum ve bu lambayı buldum (yukarıdaki resim). Ayrıca ahşap kaplamadan parlayan dijital saatler de görmüştüm (yukarıdaki resim). Dolayısıyla, iki projeyi birleştirmek bariz bir fikirdi. Kendime meydan okumak için bu proje için kaplama değil, sadece bir tahta parçası kullanmaya karar verdim.

2. Adım: Tasarım

Tasarım
Tasarım
Tasarım
Tasarım

Saati Inkscape'de tasarladım (yukarıdaki resim). Tasarım seçime göre çok basittir. Kablolar için yönlendirme izlerine karşı karar verdim çünkü bu noktada radyal kabloyla mı yoksa çevresel kabloyla mı gitmek istediğimden emin değildim. (Sonunda çevresel kablolamaya karar verdim.) Dakika ve saat zamanını beş dakikalık hassasiyetle göstermek için küçük dairesel deliklerin her birine bir neopiksel giriyor. Ortadaki daire, elektroniği yerleştirmek için yönlendirilecektir.

Adım 3: CNC İşleme

CNC işleme
CNC işleme
CNC işleme
CNC işleme
CNC işleme
CNC işleme
CNC işleme
CNC işleme

Takım yollarını MasterCAM üzerinde tasarladım ve saati 3/4 inç kontrplaktan frezelemek için bir technoRouter kullandım. Bunun için minimum israfla 15"x15"lik bir parça kullanıyorum. İşin püf noktası, ahşabı kırmadan mümkün olduğu kadar ahşabı yönlendirmektir. 0.05"-0.1" bırakmak, hafif ahşap için iyi bir seçimdir. Emin değilseniz, daha fazla odun bırakmak daha iyidir, çünkü diğer yüzü her zaman zımparalayabilirsiniz. Sonunda bazı kısımlardan biraz fazla odun çıkardım, ama şükürler olsun ki sonuçlar bundan dolayı çok fazla acı çekmiyor.

CNC'ye erişimi olmayan kullanıcılar için not:

Bu proje bir matkap ile kolayca yapılabilir. Durdurma noktasını, tabanda yaklaşık 0,1 inçlik ahşabın kaldığı bir noktaya ayarlamanız yeterlidir. Kesin olmanız gerekir, ancak çok hassas değil. Sonuçta, ideal olarak hiç kimse tüm LED'lerin yandığını görmez. aynı zamanda, böylece küçük bir eğimle kurtulabilirsiniz.

Adım 4: Elektronik

Elektronik
Elektronik
Elektronik
Elektronik
Elektronik
Elektronik

Elektronik oldukça basittir. Beş dakikalık hassasiyetle saatleri göstermek için on iki ve dakikaları göstermek için on iki olmak üzere 24 neopiksel vardır. Bir Arduino pro mini, neopikselleri kontrol eder ve bir DS3231 gerçek zamanlı saat (RTC) modülü aracılığıyla doğru zamanı alır. RTC modülü yedek olarak bir madeni para hücresine sahiptir, bu nedenle güç kapalıyken bile zaman kaybetmez.

Malzeme:

Arduino pro mini (veya bu konuda başka herhangi bir Arduino)

DS3231 koparma kartı

Bireysel koparma panolarında neopikseller

Adım 5: Elektronik Montaj

Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj

Neopikselleri ilk on iki led için 2,5 kablo ve sonraki on iki led için dört inç kablo kullanarak bir diziye bağladım. Biraz daha küçük kablo uzunlukları kullanabilirdim. Dizeyi yaptıktan sonra, lehimin doğru olduğundan emin olarak test ettim. Eklemler iyiydi, tüm ledleri yakmak için bir anlık anahtar ekledim, gösteriş olsun diye.

Adım 6: Kuru Çalıştırma

Kuru Çalışma
Kuru Çalışma
Kuru Çalışma
Kuru Çalışma
Kuru Çalışma
Kuru Çalışma
Kuru Çalışma
Kuru Çalışma

Denedikten, LED'leri deliklere yerleştirdikten ve hepsini açtıktan sonra sonuçlardan memnun kaldım. Bu yüzden ön yüzü biraz zımparaladım ve bir PU kat uyguladım. Paltoyu daha sonra zımparaladım, ancak estetik olarak hoşunuza gitmediyse, açık bırakmak iyi bir fikirdir.

Adım 7: Epoksi

Epoksi
Epoksi
Epoksi
Epoksi

Deliklerin içindeki led konumu ile bazı testler yaptıktan sonra, en iyi tartışmanın LED'ler deliğin ucundan yaklaşık 0,2 uzakta olduğunda elde edildiğini düşündüm. Bunu kendiniz denediğinizde, LED'lerin parlaklığı çok farklı olacaktır. Her delik için endişelenmeyin, kodda düzelteceğiz. Bu, kullandığım matkap ucunun türünden kaynaklanıyor. Bunu tekrar yapsaydım, delikler için bir bilye uçlu matkap kullanırdım. Ama her durumda, mesafeyi elde etmek için biraz epoksi karıştırdım ve her deliğe biraz koydum.

8. Adım: Hepsini Bir Araya Getirmek

Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy

LED'ler, tüm akrep pozisyonları boyunca saat yönünün tersine hareket eden saat 12 akrep pozisyonundan başlayarak ve daha sonra yelkovana, yine saat yönünün tersine hareket eden 60 dakika işaretinden hareket ederek yerleştirilecektir. Bu, önden baktığımızda LED deseninin saat yönünde ilerlediğini görünecek şekildedir.

Epoksi bir saat kürlendikten sonra biraz daha epoksi koydum. Bu sefer LED'leri deliklere yerleştirdim, telleri ve lehim bağlantılarını epoksi ile kapladığından emin oldum. Bu, iyi bir ışık yayılımı sağlar ve kabloları sabitler.

9. Adım: Kod

kod
kod

Kod GitHub'da, kullanımınız için değiştirmekten çekinmeyin. Tüm LED'leri aynı seviyeye getirdiğinizde, her delikten parlayan ışığın parlaklığı çok farklı olacaktır. Bunun nedeni, deliklerdeki ahşabın farklı kalınlıkları ve ahşabın gölgesindeki farklılıktır, Gördüğünüz gibi ahşabın rengi benim parçamda biraz değişiyor. Parlaklıktaki bu farkı gidermek için bir led parlaklık seviyeleri matrisi yaptım. Ve daha parlak LED'lerin parlaklığını azalttı. Bu bir deneme yanılma sürecidir ve birkaç dakika sürebilir, ancak sonuçlar buna değer.

kontrplakClock.ino

// Kontrplak Saat
// Yazar: tinkrmind
// Atıf 4.0 Uluslararası (CC BY 4.0). Şunları yapmakta özgürsünüz:
// Paylaş - materyali herhangi bir ortamda veya biçimde kopyalayın ve yeniden dağıtın
// Uyarla - ticari olarak bile olsa herhangi bir amaç için malzemeyi yeniden karıştırın, dönüştürün ve üzerine inşa edin.
// Yaşasın!
#Dahil etmek
#include"RTClib.h"
RTC_DS3231 rtc;
#include"Adafruit_NeoPixel.h"
#ifdef _AVR_
#Dahil etmek
#endif
#definePIN6
Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
int saatPiksel = 0;
int dakikaPiksel = 0;
imzasız uzun lastRtcCheck;
String inputString = ""; // gelen verileri tutacak bir dize
boolean stringComplete = false; // dizenin tamamlanıp tamamlanmadığı
int seviye[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};
geçersiz kurulum () {
#ifndef ESP8266
while (!Seri); // Leonardo/Mikro/Sıfır için
#endif
// Bu Biblo 5V 16MHz içindir, Biblo kullanmıyorsanız bu üç satırı kaldırabilirsiniz
#if tanımlı (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// Biblo sonu özel kodu
Seri.başla(9600);
strip.begin();
şerit.göster(); // Tüm pikselleri 'kapalı' olarak başlat
if (! rtc.begin()) {
Serial.println("RTC bulunamadı");
iken (1);
}
pinMode(2, INPUT_PULLUP);
// rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));
if (rtc.lostPower()) {
Serial.println("RTC güç kaybetti, zamanı ayarlayalım!");
// aşağıdaki satır, RTC'yi bu çizimin derlendiği tarih ve saate ayarlar
rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));
// Bu satır, RTC'yi açık bir tarih ve saatle ayarlar, örneğin
// 21 Ocak 2014, saat 3'te arayacaksınız:
// rtc.adjust(DateTime(2017, 11, 06, 2, 49, 0));
}
// rtc.adjust(DateTime(2017, 11, 06, 2, 49, 0));
// lightUpEven();
// süre (1);
lastRtcCheck = 0;
}
boşluk döngüsü () {
if (millis() - lastRtcCheck >2000) {
DateTime şimdi = rtc.now();
Seri.print(şimdi.saat(), Aralık);
Seri.print(':');
Seri.print(şimdi.dakika(), Aralık);
Seri.print(':');
Seri.print(şimdi.ikinci(), Aralık);
Seri.println();
gösteri zamanı();
lastRtcCheck = millis();
}
if (!digitalRead(2)) {
lightUpEven();
}
if (stringComplete) {
Serial.println(inputString);
if (inputString[0] == 'l') {
Serial.println("Seviye");
lightUpEven();
}
if (inputString[0] == 'c') {
Serial.println("Zaman gösteriliyor");
gösteri zamanı();
şerit.göster();
}
if (inputString[0] == '1') {
Serial.println("Tüm LED'lerin Açılması");
lightUp(şerit. Renk(255, 255, 255);
şerit.göster();
}
if (inputString[0] == '0') {
Serial.println("Temizleme şeridi");
açık();
şerit.göster();
}
// #3, 255, led numarası 3'ü seviye 255, 255, 255'e ayarlar
if (inputString[0] == '#') {
dize sıcaklığı;
temp = inputString.substring(1);
int pixNum = temp.toInt();
temp = inputString.substring(inputString.indexOf(', ') + 1);
int yoğunluk = temp.toInt();
Serial.print("Ayarlar");
Serial.print(pixNum);
Serial.print("seviyeye");
Seri.println(yoğunluk);
strip.setPixelColor(pixNum, strip. Color(yoğunluk, yoğunluk, yoğunluk));
şerit.göster();
}
// #3, 255, 0, 125, led numarası 3'ü seviye 255, 0, 125'e ayarlar
if (inputString[0] == '$') {
dize sıcaklığı;
temp = inputString.substring(1);
int pixNum = temp.toInt();
int rIndex = inputString.indexOf(', ') + 1;
temp = inputString.substring(rIndex);
int rYoğunluk = 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 bYoğunluk = temp.toInt();
Serial.print("Ayarlar");
Serial.print(pixNum);
Serial.print(" R'den ");
Serial.print(rYoğunluk);
Serial.print(" G'den ");
Serial.print(gYoğunluk);
Serial.print(" B'den ");
Serial.println(bYoğunluk);
strip.setPixelColor(pixNum, strip. Color(rYoğunluk, gYoğunluk, bYoğunluk));
şerit.göster();
}
if (inputString[0] == 's') {
dize sıcaklığı;
int saat, dakika;
temp = inputString.substring(1);
saat = temp.toInt();
int rIndex = inputString.indexOf(', ') + 1;
temp = inputString.substring(rIndex);
dakika = temp.toInt();
Serial.print("Zaman gösteriliyor: ");
Seri.baskı(saat);
Seri.print(":");
Seri.baskı(dakika);
showTime(saat, dakika);
gecikme(1000);
}
inputString = "";
stringComplete = yanlış;
}
// gecikme(1000);
}
voidserialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = doğru;
}
gecikme(1);
}
}
voidclear() {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip. Color(0, 0, 0));
}
}
voidshowTime() {
DateTime şimdi = rtc.now();
saatPixel = şimdi.saat() % 12;
dakikaPiksel = (şimdi.dakika() / 5) % 12 + 12;
açık();
// strip.setPixelColor(hourPixel, strip. Color(40 + 40 * seviye[saatPixel], 30 + 30 * seviye[saatPixel], 20 + 20 * seviye[saatPixel]));
// strip.setPixelColor(dakikaPixel, strip. Color(40 + 40 * seviye[dakikaPiksel], 30 + 30 * seviye[dakikaPiksel], 20 + 20 * seviye[dakikaPiksel]));
strip.setPixelColor(hourPixel, strip. Color(level[hourPixel], level[hourPixel], level[hourPixel]));
strip.setPixelColor(dakikaPixel, strip. Color(seviye[dakikaPixel], seviye[dakikaPixel], seviye[dakikaPixel]));
// lightUp(şerit. Renk(255, 255, 255);
şerit.göster();
}
voidshowTime(int saat, int dakika) {
saatPiksel = saat %12;
dakikaPiksel = (dakika / 5) % 12 + 12;
açık();
// strip.setPixelColor(hourPixel, strip. Color(40 + 40 * seviye[saatPixel], 30 + 30 * seviye[saatPixel], 20 + 20 * seviye[saatPixel]));
// strip.setPixelColor(dakikaPixel, strip. Color(40 + 40 * seviye[dakikaPiksel], 30 + 30 * seviye[dakikaPiksel], 20 + 20 * seviye[dakikaPiksel]));
strip.setPixelColor(hourPixel, strip. Color(level[hourPixel], level[hourPixel], level[hourPixel]));
strip.setPixelColor(dakikaPixel, strip. Color(seviye[dakikaPixel], seviye[dakikaPixel], seviye[dakikaPixel]));
// lightUp(şerit. Renk(255, 255, 255);
şerit.göster();
}
voidlightUp(uint32_t renk) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, renk);
}
şerit.göster();
}
voidlightUpEven() {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip. Color(seviye, seviye, seviye));
}
şerit.göster();
}

GitHub tarafından ❤ ile barındırılan rawplywoodClock.ino'yu görüntüle

Adım 10: Bilgisayarla Görü - Kalibrasyon

Bilgisayarla Görme - Kalibrasyon
Bilgisayarla Görme - Kalibrasyon
Bilgisayarla Görme - Kalibrasyon
Bilgisayarla Görme - Kalibrasyon

Bu projede kaplama kullanmamak için bilinçli bir seçim yaptım. Yapsaydım, ahşap kalınlığı tüm LED'lerin önünde aynı olurdu. Ancak, her LED'in önünde farklı bir ahşap kalınlığına sahip olduğumdan ve ahşap rengi de çok değiştiğinden, LED parlaklığı her LED için farklıdır. Tüm LED'lerin aynı parlaklıkta görünmesini sağlamak için şık bir numara geliştirdim.

Saatin fotoğrafını çeken ve sırayla her LED'in parlaklığını analiz eden bazı işlem kodları (GitHub'da) yazdım. Ardından, hepsinin en sönük LED ile aynı parlaklığa sahip olmasını sağlamak için her bir LED'in gücünü değiştirir. Bunun abartılı olduğunu biliyorum ama görüntü işleme çok eğlenceli! Ve kalibrasyon kodunu bir kütüphane olarak geliştirmeyi umuyorum.

Yukarıdaki fotoğraflarda kalibrasyon öncesi ve sonrası LED parlaklığını görebilirsiniz.

kalibreDisplay.pde

importprocessing.video.*;
importprocessing.seri.*;
Seri myPort;
Video yakala;
finalint numLed =24;
int ledNum = 0;
// PxPGetPixelDark()'ı kullanmak için bu global değişkenlere sahip olmalısınız
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 kabul edilebilirHata =3;
int yapıldı;
int numPixelsInLed;
uzun ledYoğunluk;
int ledPower;
uzun hedefYoğunluk =99999999;
voidsetup() {
done =yeniint[numLed];
numPixelsInLed =newint[numLed];
ledYoğunluk =yeniuzun[numLed];
ledPower =newint[numLed];
for (int i=0; i<numLed; i++) {
ledGüç =255;
}
printArray(Serial.list());
String portName =Serial.list()[31];
myPort =newSerial(bu, portAdı, 9600);
boyut(640, 480);
video =newCapture(bu, genişlik, yükseklik);
video.start();
noStroke();
düz();
gecikme(1000); // Seri portun açılmasını bekleyin
}
voiddraw() {
if (video.available()) {
if (done[ledNum] ==0) {
clearDisplay();
gecikme(1000);
video.read();
resim(video, 0, 0, genişlik, yükseklik); // Web kamerası videosunu ekrana çizin
saveFrame("data/no_leds.jpg");
if (runNumber !=0) {
if ((ledIntensity[ledNum] - targetIntensity)*100/targetIntensity > kabul edilebilirHata) {
ledPower[ledNum] -=pow(0.75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity[ledNum])*100/targetIntensity > kabul edilebilirHata) {
ledPower[ledNum] +=pow(0.75, runNumber)*100+1;
}
if (abs(targetIntensity - ledIntensity[ledNum])*100/targetIntensity <= kabul edilebilirHata) {
bitti[ledNum] =1;
print("Led");
print(ledNum);
print("bitti");
}
if (ledPower[ledNum] >255) {
ledGüç[ledNum] =255;
}
if (ledPower[ledNum] <0) {
ledPower[ledNum]=0;
}
}
setLedPower(ledNum, ledPower[ledNum]);
gecikme(1000);
video.read();
resim(video, 0, 0, genişlik, yükseklik); // Web kamerası videosunu ekrana çizin
gecikme(10);
while (myPort.available() >0) {
int inByte = myPort.read();
//print(char(inByte));
}
String imageName ="veri/";
imageName+=str(ledNum);
resimAdı +="_led.jpg";
saveFrame(imageName);
String orijinalImageName ="veri/org";
orijinalImageName+=str(ledNum);
orijinalResimAdı +=".jpg";
if (runNumber ==0) {
saveFrame(orijinalResimAdı);
}
PImage noLedImg =loadImage("data/no_leds.jpg");
PImage ledImg =loadImage(imageName);
PImage orijinalImg =loadImage(orijinalImageName);
noLedImg.loadPixels();
ledImg.loadPixels();
orijinalImg.loadPixels();
arka plan (0);
loadPixels();
ledYoğunluk[ledNum] =0;
numPixelsInLed[ledNum] =0;
for (int x =0; x<genişlik; x++) {
for (int y =0; y<yükseklik; y++) {
PxPGetPixelDark(x, y, noLedImg.pixels, genişlik);
PxPGetPixelLed(x, y, ledImg.pixels, genişlik);
PxPGetPixelOrg(x, y, orijinalImg.piksel, genişlik);
if ((rOrg+gOrg/2+bOrg/3)-(rDark+gDark/2+bDark/3) >75) {
ledYoğunluk[ledNum] = ledYoğunluk[ledNum] +(rLed+gLed/2+bLed/3) -(rDark+gDark/2+bDark/3);
rSıcaklık=255;
gSıcaklık=255;
bSıcaklık=255;
numPixelsInLed[ledNum]++;
} Başka {
rTemp=0;
gTemp=0;
bSıcaklık=0;
}
PxPSetPixel(x, y, rTemp, gTemp, bTemp, 255, piksel, genişlik);
}
}
ledYoğunluk[ledNum] /= numPixelsInLed[ledNum];
if (targetIntensity > ledIntensity[ledNum] && runNumber ==0) {
hedefYoğunluk = ledYoğunluk[ledNum];
}
güncellemePixels();
}
print(ledNum);
Yazdır(', ');
print(ledPower[ledNum]);
Yazdır(', ');
println(ledYoğunluk[ledNum]);
ledNum++;
if (ledNum == numLed) {
int donzo =0;
for (int i=0; i<numLed; i++) {
donezo += bitti;
}
if (donezo == numLed) {
println("BİTTİ");
for (int i=0; i<numLed; i++) {
yazdır(i);
yazdır("\t");
println(ledPower);
}
print("int seviye[");
print(ledNum);
print("] = {");
for (int i=0; i<numLed-1; i++) {
print(ledPower);
Yazdır(', ');
}
print(ledPower[numLed -1]);
println("};");
lightUpEven();
while (doğru);
}
print("Hedef yoğunluk: ");
if (runNumber ==0) {
hedefYoğunluk -=1;
}
println(hedef Yoğunluk);
ledNum =0;
runNumber++;
}
}
}
voidPxPGetPixelOrg(intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel=pixelArray[x+y*pixelsWidth]; // renkleri piksellerden int olarak almak
aOrg = (buPixel >>24) &0xFF; // her bileşeni tek başına almak için kaydırmamız ve maskelememiz gerekiyor
rOrg = (buPixel >>16) &0xFF; // bu red(), green(), blue() çağırmaktan daha hızlıdır
gOrg = (buPixel >>8) &0xFF;
bOrg = buPixel &0xFF;
}
voidPxPGetPixelDark(intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel=pixelArray[x+y*pixelsWidth]; // renkleri piksellerden int olarak almak
aDark = (buPixel >>24) &0xFF; // her bileşeni tek başına almak için kaydırmamız ve maskelememiz gerekiyor
rDark = (buPixel >>16) &0xFF; // bu red(), green(), blue() çağırmaktan daha hızlıdır
gDark = (bu Piksel >>8) &0xFF;
bDark = thisPixel &0xFF;
}
voidPxPGetPixelLed(intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel=pixelArray[x+y*pixelsWidth]; // renkleri piksellerden int olarak almak
aLed = (buPixel >>24) &0xFF; // her bileşeni tek başına almak için kaydırmamız ve maskelememiz gerekiyor
rLed = (buPixel >>16) &0xFF; // bu red(), green(), blue() çağırmaktan daha hızlıdır
gLed = (buPixel >>8) &0xFF;
bLed = thisPixel &0xFF;
}
voidPxPSetPixel(intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
bir =(a <<24);
r = r <<16; // 4 bileşenin tümünü tek bir int'de paketliyoruz
g = g <<8; // bu yüzden onları yerlerine kaydırmamız gerekiyor
renk argb = bir | r | g | B; // ikili "veya" işlemi hepsini bir int'ye ekler
pixelArray[x+y*pixelsWidth]= argb; // son olarak int'yi te renklerle piksellere ayarladık
}

GitHub tarafından ❤ ile barındırılan rawcalibrateDispllay.pde dosyasını görüntüleyin

Adım 11: Ayrılık Açıklamaları

Kaçınılması gereken tuzaklar:

* Ahşap ile ödediğinizin karşılığını alırsınız. Bu yüzden kaliteli ahşap alın. Huş kontrplak iyi bir seçimdir; herhangi bir hafif masif ahşap da güzel bir şekilde yapacaktır. Ahşabı ucuza aldım ve kararımdan pişman oldum.

* Daha az delmek, daha fazla delmekten daha iyidir. Birkaç delik benim parçam için fazla derine gitti. Ve epoksi ön yüzde kendini gösteriyor. Bunu fark ettiğinizde çok fark edilir.

* Düz uç yerine bilye uçlu matkap ucu kullanın. Top ucu ile deneme yapmadım ama sonuçların çok daha iyi olacağına eminim.

Bunları Etsy'de veya tindie'de satma fikriyle flört ediyorum. Mantıklı olduğunu düşünüyorsanız aşağıya yorum yaparsanız çok sevinirim:)

Önerilen: