Mündəricat:
- Addım 1:
- Addım 2: Dizayn
- Addım 3: CNCing
- Addım 4: Elektronika
- Addım 5: Elektronika Quraşdırması
- Addım 6: Quru qaçış
- Addım 7: Epoksi
- Addım 8: Hamısını bir yerə yığın
- Addım 9: Kod
- Addım 10: Kompüter Görmə - Kalibrləmə
- Addım 11: Ayrılıq qeydləri
Video: Taxta LED Saat - Analog Stil: 11 Addım (Şəkillərlə birlikdə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:48
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:
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
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
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 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ı
İ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çış
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
Ç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
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 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ə
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ə:
Taxta LED Saat: 5 addım (şəkillərlə)
Taxta LED Saat: Taxta LED saat, vaxtın ön tərəfdə parlaması istisna olmaqla, darıxdırıcı bir taxta qutuya bənzəyir. Baxmaq üçün bir gri plastik parçası yox, daha gözəl bir ağac parçası var. Hələ də bütün funksiyalarını saxlayır, o cümlədən
C51 4 Bit Elektron Saat - Taxta Saat: 15 Addım (Şəkillərlə)
C51 4 Bit Elektron Saat - Taxta Saat: Bu həftə sonu bir az boş vaxtım oldu, buna görə də bir müddət əvvəl AliExpress -dən aldığım 2.40 dollarlıq 4 bitlik elektron elektron rəqəmsal saatı yığdım
Sevimli və Güclü Taxta Robot Qoluna Birləşmək üçün Bir neçə Taxta Necə İstifadə Edilir: 10 Addım
Sevimli və Güclü Taxta Robot Qoluna Birləşmək üçün Bir neçə Taxta Parçadan Necə İstifadə Edilir: Robot qolunun adı WoodenArmdır. Çox yaraşıqlı görünür! WoodenArm haqqında daha ətraflı məlumat almaq istəyirsinizsə, www.lewansoul.com saytına müraciət edin. İndi WoodenArm haqqında bir giriş edə bilərik, davam edək
Masif Taxta Rəqəmsal Saat: 11 Addım (Şəkillərlə birlikdə)
Bərk Taxta Rəqəmsal Saat: Daxili həyəcan və oyunları olan atmega168 (arduino) ilə işləyən taxta rəqəmsal saat necə qurulacaq. Ağacla örtülmüş bir LED saatı görəndə ilk dəfə bunu etmək barədə düşündüm. Qiyməti görənə qədər bəyəndim. Bu
Taxta dişli saat: 9 addım (şəkillərlə birlikdə)
Taxta Dişli Saatı: Saatın videosunu əlavə etdim. Pəncərələri saatın qarşısında oymaq üzərində işləyəcəyəm. Bitirdikdən sonra şəkillər və/və ya video yükləyəcəyəm. Artıq bir neçə ildir ağac emalı ilə məşğulam. Yaratmaq fikrini sevirəm