Mündəricat:

Taxta LED Saat - Analog Stil: 11 Addım (Şəkillərlə birlikdə)
Taxta LED Saat - Analog Stil: 11 Addım (Şəkillərlə birlikdə)

Video: Taxta LED Saat - Analog Stil: 11 Addım (Şəkillərlə birlikdə)

Video: Taxta LED Saat - Analog Stil: 11 Addım (Şəkillərlə birlikdə)
Video: nivanı aşırdıq😥 2024, Noyabr
Anonim
Taxta LED Saat - Analoq Stil
Taxta LED Saat - Analoq Stil

Bu analoq üslublu taxta LED saatdır. Bilmirəm niyə bunlardan birini əvvəllər görməmişəm.. rəqəmsal tiplər çox yayılsa da. Anyhoo, bura gedirik!

Addım 1:

Şəkil
Şəkil
Şəkil
Şəkil

Kontrplak saatı layihəsi CNC router üçün sadə bir başlanğıc layihəsi olaraq başladı. İnternetdə sadə layihələrə baxırdım və bu lampanı tapdım (yuxarıdakı şəkil). Taxta örtükdən parlayan rəqəmsal saatlar da gördüm (yuxarıdakı şəkil). Beləliklə, iki layihəni birləşdirmək açıq bir fikir idi. Özümə meydan oxumaq istəyərkən, bu layihə üçün kaplama deyil, yalnız bir ağac parçası istifadə etməyə qərar verdim.

Addım 2: Dizayn

Dizayn
Dizayn
Dizayn
Dizayn

Saatı Inkscape -də hazırladım (yuxarıdakı şəkil). Dizayn seçimi ilə çox sadədir. Kabellərin izlərini yönləndirməməyə qərar verdim, çünki bu nöqtədə radial və ya perimetr naqilləri ilə getmək istədiyimi bilmirdim. (Nəhayət, perimetr naqilləri ilə getməyə qərar verdim.) Bir dəqiqəlik və saat vaxtını göstərmək üçün kiçik dairəvi deliklərin hər birində beş dəqiqəlik dəqiqliklə bir neopiksel keçir. Ortadakı dairə elektronikaya uyğunlaşdırılacaq.

Addım 3: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

MasterCAM -da alət yolları hazırladım və saatı 3/4 düymlük kontrplakdan çıxarmaq üçün bir technoRouter istifadə etdim. Bunun üçün ən az israfla 15 "x15" ölçüdə bir parça istifadə edirəm. Hiylə odun içərisindən mümkün qədər çox çıxarmaqdır. 0.05 "-0.1" buraxmaq yüngül ağac üçün yaxşı bir seçimdir. Əmin deyilsinizsə, içərisində daha çox odun buraxmaq daha yaxşıdır, çünki hər zaman digər üzünü zımpara edə bilərsiniz. Bəzi hissələrdən bir az çox ağac çıxarmağa başladım, amma şükürlər olsun ki, nəticələr buna görə çox əziyyət çəkmir.

CNC girişi olmayan istifadəçilər üçün qeyd:

Bu layihə bir qazma maşını ilə asanlıqla edilə bilər. Sadəcə dayanacaqda bazada təxminən 0,1 düym qalacaq bir ağac buraxacağınız bir yerə təyin etməlisiniz. Dəqiq olmalısınız, amma çox dəqiq deyil. Axı ideal olaraq heç kim bütün LED -lərin yandığını görməyəcək. Eyni zamanda, bir az yamacla uzaqlaşa bilərsiniz.

Addım 4: Elektronika

Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika

Elektronika olduqca sadədir. Saatları göstərmək üçün on iki, dəqiqələri göstərmək üçün on iki, beş dəqiqəlik dəqiqliklə 24 neopikseldir. Arduino pro mini neopikselləri idarə edir və DS3231 real vaxt saatı (RTC) modulu vasitəsilə dəqiq vaxt əldə edir. RTC modulunda ehtiyat olaraq bir sikkə hücrəsi var, buna görə elektrik kəsildikdə belə vaxt itirmir.

Material:

Arduino pro mini (və ya digər Arduino)

DS3231 qırılma lövhəsi

Fərdi qırılma lövhələrində neopiksellər

Addım 5: Elektronika Quraşdırması

Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi
Elektronika Məclisi

İlk on iki led üçün 2,5 düymlük tellər və sonrakı on iki üçün dörd düymlük tel istifadə edərək neopikselləri bir simlə bağladım. Bir az daha kiçik tel uzunluqlarından istifadə edə bilərdim. İpi düzəltdikdən sonra onu sınadım və lehimdən əmin oldum oynaqlar yaxşı idi. Yalnız göstərmək üçün bütün ledləri açmaq üçün bir anlıq keçid əlavə etdim.

Addım 6: Quru qaçış

Quru Qaçış
Quru Qaçış
Quru Qaçış
Quru Qaçış
Quru Qaçış
Quru Qaçış
Quru Qaçış
Quru Qaçış

Təcrübə etdikdən sonra, LEDləri çuxurlara qoyub hamısını yandırdıqdan sonra nəticələrdən razı qaldım. Buna görə ön üzünü bir az zımpara edərək PU palto tətbiq etdim. Daha sonra palto zımpara ilə bitirdim, amma estetik cəhətdən xoşagəlməz hesab etməsəniz onu tərk etməyiniz yaxşıdır.

Addım 7: Epoksi

Epoksi
Epoksi
Epoksi
Epoksi

Çuxurların içərisindəki led mövqeyi ilə bir az sınaqdan sonra, ən yaxşı müzakirənin, LED -lərin çuxurun ucundan təxminən 0,2 məsafədə olanda əldə edildiyini anladım. Bunu özünüz sınadığınızda, LED -lərin parlaqlığı çox fərqli olacaq. Hər bir çuxur. Bu barədə narahat olmayın, bunu kodda düzəldəcəyik. Bu, istifadə etdiyim matkap tipinə görədir. Bunu bir daha təkrarlasaydım, deliklər üçün top uclu qazma ucundan istifadə edərdim Ancaq hər halda, məsafəni əldə etmək üçün bir az epoksi qarışdırdım və hər çuxura bir az qoydum.

Addım 8: Hamısını bir yerə yığın

Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək

LEDlər, saat əqrəbinin saat yönünün əksinə bütün saat əqrəbləri istiqamətində saat əqrəbinin əksinə hərəkət edən saat mövqeyinin 12-dən başlayaraq 60 dəqiqəlik işarədən yenidən saat əqrəbinin əksinə hərəkət edən yerə yerləşdiriləcək. Bu, ön tərəfdən baxdığımız zaman LED modelinin saat yönünde getdiyini göstərir.

Epoksi bir saat müalicə edildikdən sonra bir az daha epoksi qoydum. Bu dəfə LEDləri deliklərə qoydum, telləri və lehim birləşmələrini epoksi ilə örtməyinizə əmin oldum. Bu, yaxşı işıq yayılmasını təmin edir və telləri təmin edir.

Addım 9: Kod

Kod
Kod

Kod GitHubdadır, istifadə etmək üçün onu dəyişdirməkdən çekinmeyin. Bütün LED -ləri eyni səviyyəyə yandırdığınızda, hər bir çuxurdan keçən işığın parlaqlığı çox fərqli olacaq. Bunun səbəbi, çuxurlarda fərqli ağac qalınlığı və ağacın kölgəsindəki fərqdir. Gördüyünüz kimi ağacın rəngi parçamda bir qədər dəyişir. Parlaqlıqdakı bu fərqi aradan qaldırmaq üçün LED parlaqlıq səviyyələrinin matrisini hazırladım. Və daha parlaq LED -lərin parlaqlığı azaldı. Bu bir sınaq və səhv prosesidir və bir neçə dəqiqə çəkə bilər, amma nəticələr buna dəyər.

plywoodClock.ino

// Kontrplak Saatı
// Müəllif: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Sərbəstsiniz:
// Paylaş - materialı istənilən mühitdə və ya formatda kopyalayın və yenidən paylayın
// Uyğunlaşdırın - materialı istənilən məqsədlə, hətta kommersiya baxımından da düzəldin, dəyişdirin və qurun.
// Ura!
#daxil edin
#"RTClib.h" daxil edin
RTC_DS3231 rtc;
#"Adafruit_NeoPixel.h" daxil edin
#ifdef _AVR_
#daxil edin
#endif
#PINPin6 təyin edin
Adafruit_NeoPixel şeridi = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int hourPixel = 0;
int dəqiqəPixel = 0;
imzasız uzun LastRtcCheck;
String inputString = ""; // daxil olan məlumatları saxlamaq üçün bir simli
boolean stringComplete = yanlış; // sətrin tamam olub -olmaması
int səviyyəsi [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 (! Serial); // Leonardo/Micro/Zero üçün
#endif
// Bu, Trinket 5V 16MHz üçündür, bir Trinket istifadə etmirsinizsə bu üç xətti silə bilərsiniz.
#təyin olunarsa (_AVR_ATtiny85_)
əgər (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#endif
// Zinət əşyasının xüsusi kodu
Serial.begin (9600);
strip.begin ();
strip.show (); // Bütün pikselləri "söndürmək" üçün başladın
əgər (! rtc.begin ()) {
Serial.println ("RTC tapılmadı");
isə (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))));
if (rtc.lostPower ()) {
Serial.println ("RTC gücünü itirdi, vaxtı təyin edək!");
// aşağıdakı xətt RTC -ni bu eskizin tərtib edildiyi tarix və saata təyin edir
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))));
// Bu xətt RTC -ni açıq bir tarix və vaxtla təyin edir, məsələn, qurmaq üçün
// 21 yanvar 2014 -cü il saat 3 -də zəng edərdiniz:
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
}
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
// lightUpEven ();
// isə (1);
lastRtcCheck = 0;
}
voidloop () {
if (millis () - lastRtcCheck> 2000) {
İndi DateTime = rtc.now ();
Serial.print (indi.hour (), DEC);
Serial.print (':');
Serial.print (indi.minute (), DEC);
Serial.print (':');
Serial.print (indi.second (), DEC);
Serial.println ();
showTime ();
lastRtcCheck = millis ();
}
əgər (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Səviyyə");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Vaxt göstərilir");
showTime ();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println ("Bütün LED -lərin yandırılması");
lightUp (şerit Rəng (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("Klirinq zolağı");
aydın ();
strip.show ();
}
// #3, 255, led nömrəsi 3 -ü 255, 255, 255 səviyyəsinə təyin edərdi
if (inputString [0] == '#') {
String tempi;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int intensivliyi = temp.toInt ();
Serial.print ("Ayar");
Serial.print (pixNum);
Serial.print ("səviyyəyə");
Serial.println (intensivlik);
strip.setPixelColor (pixNum, strip. Color (intensivlik, intensivlik, intensivlik));
strip.show ();
}
// #3, 255, 0, 125, 3 nömrəli led nömrəni 255, 0, 125 səviyyəsinə təyin edərdi
əgər (inputString [0] == '$') {
String tempi;
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 ("Ayar");
Serial.print (pixNum);
Serial.print ("R to");
Serial. çap (rIntensity);
Serial.print ("G to");
Serial. çap (gİntensiya);
Serial.print ("B -dən");
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's)) {
String tempi;
int saat, dəqiqə;
temp = inputString.substring (1);
saat = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
dəqiqə = temp.toInt ();
Serial.print ("Göstərilən vaxt:");
Serial.çap (saat);
Serial.print (":");
Serial. çap (dəqiqə);
showTime (saat, dəqiqə);
gecikmə (1000);
}
inputString = "";
stringComplete = yanlış;
}
// gecikmə (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
əgər (inChar == '\ n') {
stringComplete = doğru;
}
gecikmə (1);
}
}
voidclear () {
üçün (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (0, 0, 0));
}
}
voidshowTime () {
DateTime indi = rtc.now ();
hourPixel = indi.hour () % 12;
minutesPixel = (now.minute () / 5) % 12 + 12;
aydın ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * səviyyə [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (dəqiqəPixel, strip. Color (40 + 40 * səviyyə [dəqiqəPixel], 30 + 30 * səviyyə [dəqiqəPixel], 20 + 20 * səviyyə [dəqiqəPixel]));
strip.setPixelColor (hourPixel, strip. Color (səviyyə [hourPixel], səviyyə [hourPixel], səviyyə [hourPixel])));
strip.setPixelColor (dəqiqəPixel, strip. Color (səviyyə [dəqiqəPixel], səviyyə [dəqiqəPixel], Səviyyə [dəqiqəPixel])));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidshowTime (int saat, int dəqiqə) {
hourPixel = saat % 12;
minutesPixel = (dəqiqə / 5) % 12 + 12;
aydın ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * səviyyə [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (dəqiqəPixel, strip. Color (40 + 40 * səviyyə [dəqiqəPixel], 30 + 30 * səviyyə [dəqiqəPixel], 20 + 20 * səviyyə [dəqiqəPixel]));
strip.setPixelColor (hourPixel, strip. Color (səviyyə [hourPixel], səviyyə [hourPixel], səviyyə [hourPixel])));
strip.setPixelColor (dəqiqəPixel, strip. Color (səviyyə [dəqiqəPixel], səviyyə [dəqiqəPixel], Səviyyə [dəqiqəPixel])));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t rəng) {
üçün (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, rəng);
}
strip.show ();
}
voidlightUpEven () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (səviyyə , səviyyə , səviyyə )));
}
strip.show ();
}

GitHub tərəfindən ❤ ev sahibliyi ilə rawplywoodClock.ino -ya baxın

Addım 10: Kompüter Görmə - Kalibrləmə

Kompüter Görmə - Kalibrləmə
Kompüter Görmə - Kalibrləmə
Kompüter Görmə - Kalibrləmə
Kompüter Görmə - Kalibrləmə

Bu layihədə kaplama istifadə etməmək üçün şüurlu bir seçim etdim. Mən olsaydım, ağacın qalınlığı bütün LED -lərin qarşısında eyni olardı. Ancaq hər bir LED -in qarşısında fərqli bir ağac qalınlığı olduğundan və ağacın rəngi də çox dəyişdiyindən, hər bir LED üçün LED parlaqlığı fərqlidir. Bütün LED -lərin eyni parlaqlığa bənzəməsi üçün gözəl bir hiylə hazırladım.

Saatın fotoşəkilini çəkən və hər LED -in parlaqlığını öz növbəsində təhlil edən bir neçə işləmə kodu (GitHub -da) yazdım. Daha sonra hər bir LED -in gücünü dəyişir ki, hamısını ən qaranlıq LED ilə eyni parlaqlığa malik olsun. İndi bilirəm ki, bu həddindən artıq işdir, amma görüntü emalı çox əyləncəlidir! Və kitabxana olaraq kalibrləmə kodunu inkişaf etdirməyi ümid edirəm.

LED parlaqlığını kalibrləmə əvvəli və sonra yuxarıdakı fotoşəkillərdə görə bilərsiniz.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Serial myPort;
Video çəkmək;
son say numLed = 24;
int ledNum = 0;
// PxPGetPixelDark () istifadə etmək üçün bu qlobal dəyişənlərə sahib olmalısınız
int rDark, gDark, bDark, aDark;
int rLed, gLed, bLed, aLed;
int rOrg, gOrg, bOrg, aOrg;
int rTemp, gTemp, bTemp, aTemp;
Şəklimizi göstərin;
int runNumber = 0;
int acceptableError = 3;
int tamamlandı;
int numPixelsInLed;
uzun ledIntensity;
int ledPower;
uzun hədəf sıxlığı = 99999999;
voidsetup () {
tamamlandı = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
üçün (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Serial.list () [31];
myPort = newSerial (bu, portName, 9600);
ölçü (640, 480);
video = newCapture (bu, en, hündürlük);
video.start ();
noStroke ();
hamar ();
gecikmə (1000); // Serial portun açılmasını gözləyin
}
voiddraw () {
əgər (video.available ()) {
əgər (tamam [ledNum] == 0) {
clearDisplay ();
gecikmə (1000);
video.read ();
şəkil (video, 0, 0, en, hündürlük); // Veb kamera videosunu ekrana çəkin
saveFrame ("data/no_leds.jpg");
əgər (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> məqbul Xəta) {
ledPower [ledNum] -= pow (0.75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> məqbul Xəta) {
ledPower [ledNum] += pow (0.75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum))*100/targetIntensity <= məqbul Səhv) {
bitdi [ledNum] = 1;
çap ("Led");
çap (ledNum);
çap ("bitdi");
}
əgər (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
əgər (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
gecikmə (1000);
video.read ();
şəkil (video, 0, 0, en, hündürlük); // Veb kamera videosunu ekrana çəkin
gecikmə (10);
isə (myPort.available ()> 0) {
int inByte = myPort.read ();
// çap (char (inByte));
}
String imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
String originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
əgər (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 ();
fon (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
üçün (int x = 0; x <en; x ++) {
üçün (int y = 0; y <hündürlük; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, width);
PxPGetPixelLed (x, y, ledImg.pixels, width);
PxPGetPixelOrg (x, y, originalImg.pixels, width);
əgər ((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] ++;
} başqa {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, piksel, en);
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
əgər (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
çap (ledNum);
çap (',');
çap (ledPower [ledNum]);
çap (',');
println (ledIntensity [ledNum]);
ledNum ++;
əgər (ledNum == numLed) {
int dozo = 0;
üçün (int i = 0; i <numLed; i ++) {
dozo += bitmiş ;
}
əgər (dozo == numLed) {
println ("BİTDİ");
üçün (int i = 0; i <numLed; i ++) {
çap (i);
çap ("\ t");
println (ledPower );
}
çap ("int səviyyəsi [");
çap (ledNum);
çap ("] = {");
üçün (int i = 0; i <numLed-1; i ++) {
çap (ledPower );
çap (',');
}
çap (ledPower [numLed -1]);
println ("};");
lightUpEven ();
while (doğru);
}
çap ("Hədəf intensivliyi:");
əgər (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelWidth]; // piksellərdən int olaraq rəng əldə etmək
aOrg = (thisPixel >> 24) & 0xFF; // hər bir komponenti tək başına almaq üçün sürüşmə və maska etməliyik
rOrg = (thisPixel >> 16) & 0xFF; // bu qırmızı (), yaşıl (), mavi () adlandırmaqdan daha sürətli
gOrg = (thisPixel >> 8) & 0xFF;
bOrg = thisPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelWidth]; // piksellərdən int olaraq rəng əldə etmək
aDark = (thisPixel >> 24) & 0xFF; // hər bir komponenti tək başına almaq üçün sürüşmə və maska etməliyik
rDark = (thisPixel >> 16) & 0xFF; // bu qırmızı (), yaşıl (), mavi () adlandırmaqdan daha sürətlidir
gDark = (thisPixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelWidth]; // piksellərdən int olaraq rəng əldə etmək
aLed = (thisPixel >> 24) & 0xFF; // hər bir komponenti tək başına almaq üçün sürüşmə və maska etməliyik
rLed = (thisPixel >> 16) & 0xFF; // bu qırmızı (), yaşıl (), mavi () adlandırmaqdan daha sürətli
gLed = (thisPixel >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // 4 bəstəkarın hamısını bir int -ə yığırıq
g = g << 8; // buna görə də onları yerlərinə köçürməliyik
rəng argb = a | r | g | b; // ikili "və ya" əməliyyatı hamısını bir intə əlavə edir
pixelArray [x+y*pikselWidth] = argb; // nəhayət int rənglərini piksellərə təyin edirik
}

GitHub tərəfindən ❤ ilə ev sahibliyi edilən rawcalibrateDispllay.pde -ə baxın

Addım 11: Ayrılıq qeydləri

Qarşısının alınması üçün tələlər:

* Taxta ilə ödədiyinizi alırsınız. Beləliklə, keyfiyyətli taxta alın. Ağcaqayın kontrplak yaxşı bir seçimdir; hər hansı bir yüngül bərk ağac da gözəl olacaq. Ağacda ucuzlaşdım və qərarımdan peşman oldum.

* Daha çox qazmaq daha yaxşıdır. Bir neçə deşik əsərim üçün çox dərinə getdi. Və epoksi ön üzdə görünür. Diqqət yetirdikdə çox nəzərə çarpır.

* Düz bir ucun yerinə bir top uclu matkap istifadə edin. Topu bitlə sınamamışam, amma nəticələrin daha yaxşı olacağına əminəm.

Bunları Etsy və ya tindie -də satmaq fikri ilə flört edirəm. Mənalı olduğunu düşünürsünüzsə aşağıda şərh edə bilsəniz çox minnətdar olaram:)

Tövsiyə: