Përmbajtje:
- Hapi 1:
- Hapi 2: Projektimi
- Hapi 3: CNCing
- Hapi 4: Elektronikë
- Hapi 5: Asambleja e elektronikës
- Hapi 6: Vrapim i thatë
- Hapi 7: Epoksi
- Hapi 8: Vendosja e të gjitha së bashku
- Hapi 9: Kodi
- Hapi 10: Vizioni kompjuterik - Kalibrimi
- Hapi 11: Vërejtje ndarëse
Video: Orë LED prej druri - Stil analog: 11 hapa (me fotografi)
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:28
It'sshtë një orë LED prej druri e stilit analog. Unë nuk e di pse nuk kam parë një nga këto më parë..por pse llojet dixhitale janë shumë të zakonshme. Anyhoo, ja ku po shkojmë!
Hapi 1:
Projekti i orës së kompensatës filloi si një projekt i thjeshtë fillestar për ruterin CNC. Unë po shikoja projekte të thjeshta në internet dhe gjeta këtë llambë (imazhi më sipër). Unë kisha parë edhe orë dixhitale që shkëlqejnë përmes rimesos së drurit (imazhi sipër). Pra, kombinimi i dy projekteve ishte një ide e qartë. Duke kërkuar të sfidoj veten, vendosa të mos përdor rimeso, por vetëm një copë druri për këtë projekt.
Hapi 2: Projektimi
Kam projektuar orën në Inkscape (imazhi më sipër). Dizajni është shumë i thjeshtë sipas zgjedhjes. Unë vendosa kundër gjurmimit të telave, sepse në këtë pikë nuk isha i sigurt nëse do të shkoja me instalime radiale ose perimetrike. (Vendosa të shkoja më në fund me telat rrethues.) Një neopixel futet në secilën nga vrimat e vogla rrethore për të treguar minutën dhe orën, me saktësi pesë minutëshe. Rrethi në mes do të shpartallohet për të akomoduar pajisjet elektronike.
Hapi 3: CNCing
Unë hartova shtigjet e veglave në MasterCAM dhe përdora një teknikRouter për të nxjerrë orën nga kompensatë 3/4 inç. Unë përdor një copë 15 "x15" për këtë, me humbje minimale. Truku qëndron në nxjerrjen e drurit sa më shumë që të jetë e mundur pa e thyer atë. Largimi nga 0.05 "-0.1" është një zgjedhje e mirë për dru të lehta. Nëse nuk jeni të sigurt, është më mirë të lini më shumë dru, sepse gjithmonë mund të lyeni fytyrën tjetër. Përfundova duke hequr pak shumë dru nga disa pjesë, por fatmirësisht rezultatet nuk vuajnë shumë për shkak të kësaj.
Shënim për përdoruesit pa qasje në një CNC:
Ky projekt lehtë mund të bëhet me një stërvitje. Thjesht duhet të vendosni ndalesën në një pikë ku lini rreth 0.1 dru të mbetur në bazë. Ju do të duhet të jeni të saktë, por jo shumë të saktë. Në fund të fundit, në mënyrë ideale askush nuk do t'i shohë të gjitha dritat LED të ndizen në në të njëjtën kohë, kështu që ju mund të largoheni me një pjerrësi të vogël.
Hapi 4: Elektronikë
Elektronika është mjaft e thjeshtë. Ka 24 neopixelë, dymbëdhjetë për të treguar orët dhe dymbëdhjetë për të treguar minutat, me saktësi pesë-minutëshe. Një Arduino pro mini kontrollon neopixelët dhe merr kohë të saktë përmes një moduli të orës në kohë reale (RTC) DS3231. Moduli RTC ka një qelizë monedhe si rezervë, kështu që nuk humbet kohë edhe kur energjia është e fikur.
Materiali:
Arduino pro mini (ose ndonjë Arduino tjetër për këtë çështje)
Bordi i thyerjes DS3231
Neopixel në bordet individuale të prishjes
Hapi 5: Asambleja e elektronikës
Unë i lidha neopixelët në një varg, duke përdorur tela 2.5 për dymbëdhjetë llambat e para dhe tela katër inç për dymbëdhjetë të tjerat. Mund të kisha përdorur gjatësi tela pak më të vogla. Pasi bëra tela, e testova atë, duke u siguruar që saldimi nyjet ishin të mira. Shtova një çelës momental për të ndezur të gjitha led -et, vetëm për tu shfaqur.
Hapi 6: Vrapim i thatë
Pasi eksperimentova, vendosa LED në vrima dhe i ndezi të gjitha, unë isha i kënaqur me rezultatet. Kështu që lëmova pak fytyrën e përparme dhe aplikova një shtresë PU. Përfundova duke e lëmuar pallton më vonë, por është një ide e mirë ta lini nëse nuk ju duket estetikisht e pakëndshme.
Hapi 7: Epoksi
Pas disa testimeve me pozicionin e udhëhequr brenda vrimave, kuptova se diskutimi më i mirë arrihet kur LED -të janë rreth 0.2 larg nga fundi i vrimës. Kur ta provoni këtë vetë, shkëlqimi i LED -ve do të jetë shumë i ndryshëm në çdo vrimë. Mos u shqetësoni për këtë; ne do ta rregullojmë atë në kod. Kjo është për shkak të llojit të stërvitjes që kam përdorur. Nëse do ta bëja përsëri, do të përdorja një stërvitje të topit për vrimat Por, në çdo rast, për të marrë distancën, përzieva pak epoksi dhe vendosa pak në secilën vrimë.
Hapi 8: Vendosja e të gjitha së bashku
LED-të do të vendosen duke filluar nga pozicioni i dorës së orës 12 të orës duke lëvizur në drejtim të akrepave të orës nëpër të gjitha pozicionet e dorës së orës dhe pastaj në dorën e minutës, duke lëvizur përsëri nga shenja e 60 minutës duke lëvizur në drejtim të kundërt. Kjo është kështu që kur shikojmë nga përpara modeli LED shfaqet duke shkuar në drejtim të akrepave të orës.
Pasi epoksi u shërua për një orë, vendosa edhe disa epoksi. Këtë herë, i vendosa LED -et në vrima, duke u siguruar që të mbuloj telat dhe lidhjet me epoksi. Kjo bën një difuzion të mirë të dritës dhe siguron telat.
Hapi 9: Kodi
Kodi është në GitHub, mos ngurroni ta modifikoni për përdorimin tuaj. Kur ndizni të gjitha LED në të njëjtin nivel, shkëlqimi i dritës që shkëlqen do të jetë shumë i ndryshëm në secilën vrimë. Kjo është për shkak të trashësisë së ndryshme të drurit në vrima dhe ndryshimit në hijen e drurit, Siç mund ta shihni, ngjyra e drurit ndryshon mjaft në copën time. Për të korrigjuar këtë ndryshim në shkëlqim, unë bëra një matricë të niveleve të shkëlqimit të udhëhequr. Dhe zvogëloi shkëlqimin e LED -ve më të ndritshëm. Processshtë një proces gjykimi dhe gabimi dhe mund të zgjasë disa minuta, por rezultatet ia vlen.
kompensatëClock.ino
// Ora kompensatë |
// Autori: tinkrmind |
// Atributi 4.0 Ndërkombëtar (CC NGA 4.0). Ju jeni të lirë të: |
// Ndani - kopjoni dhe rishpërndani materialin në çdo medium ose format |
// Përshtateni - rimiksoni, transformoni dhe ndërtoni mbi materialin për çfarëdo qëllimi, qoftë edhe komercial. |
// Hurray! |
#përfshi |
#përfshi "RTClib.h" |
RTC_DS3231 rtc; |
#përfshi "Adafruit_NeoPixel.h" |
#ifdef _AVR_ |
#përfshi |
#endif |
#përcaktoPIN6 |
Rrip Adafruit_NeoPixel = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800); |
int orëPixel = 0; |
int minutePixel = 0; |
i panënshkruar lastRtcCheck; |
String inputString = ""; // një varg për të mbajtur të dhënat hyrëse |
varg booleanComplete = false; // nëse vargu është i plotë |
niveli 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 |
ndërsa (! Serial); // për Leonardo/Micro/Zero |
#endif |
// Kjo është për Trinket 5V 16MHz, ju mund t'i hiqni këto tre rreshta nëse nuk po përdorni një xhingël |
#nëse përcaktohet (_AVR_ATtiny85_) |
nëse (F_CPU == 16000000) clock_prescale_set (clock_div_1); |
#endif |
// Kodi i posaçëm i xhingël |
Serial.filloj (9600); |
strip.filloj (); |
shirit.shfaq (); // Filloni të gjithë pikselët në "jo" |
nëse (! rtc.filloj ()) { |
Serial.println ("Nuk mund të gjej RTC"); |
ndërsa (1); |
} |
pinMode (2, INPUT_PULLUP); |
// rtc.adjust (DataTime (F (_ DATE_), F (_ TIME_))); |
nëse (rtc.lostPower ()) { |
Serial.println ("RTC humbi fuqinë, lejon të caktojmë kohën!"); |
// rreshti i mëposhtëm vendos RTC në datën dhe kohën kur është përpiluar kjo skicë |
rtc.adjust (DataTime (F (_ DATE_), F (_ TIME_))); |
// Kjo linjë vendos RTC me një datë dhe kohë të qartë, për shembull për të vendosur |
// 21 janar 2014 në orën 3 të mëngjesit do të telefononit: |
// rtc.adjust (DataTime (2017, 11, 06, 2, 49, 0)); |
} |
// rtc.adjust (DataTime (2017, 11, 06, 2, 49, 0)); |
// lightUpEven (); |
// ndërsa (1); |
lastRtcCheck = 0; |
} |
voidloop () { |
if (millis () - lastRtcCheck> 2000) { |
DataTime tani = rtc.now (); |
Serial.print (tani. Orë (), DEC); |
Serial.print (':'); |
Serial.print (tani.minute (), DEC); |
Serial.print (':'); |
Serial.print (tani. E dyta (), DEC); |
Serial.println (); |
Koha e shfaqjes(); |
lastRtcCheck = milis (); |
} |
nëse (! digitalRead (2)) { |
lightUpEven (); |
} |
nëse (stringComplete) { |
Serial.println (inputString); |
nëse (inputString [0] == 'l') { |
Serial.println ("Niveli"); |
lightUpEven (); |
} |
nëse (inputString [0] == 'c') { |
Serial.println ("Koha e shfaqjes"); |
Koha e shfaqjes(); |
shirit.shfaq (); |
} |
nëse (inputString [0] == '1') { |
Serial.println ("Ndezja e të gjitha LED -ve"); |
lightUp (shirit. Ngjyra (255, 255, 255)); |
shirit.shfaq (); |
} |
nëse (inputString [0] == '0') { |
Serial.println ("Shiriti i pastrimit"); |
qartë(); |
shirit.shfaq (); |
} |
// #3, 255 do të vendoste numrin led 3 në nivelin 255, 255, 255 |
nëse (inputString [0] == '#') { |
Temperatura e vargut; |
temp = inputString.substring (1); |
int pixNum = temp.toInt (); |
temp = inputString.substring (inputString.indexOf (',') + 1); |
int intensiteti = temp.toInt (); |
Serial.print ("Vendosja"); |
Serial.print (pixNum); |
Serial.print ("në nivel"); |
Serial.println (intensiteti); |
strip.setPixelColor (pixNum, strip. Color (intensiteti, intensiteti, intensiteti)); |
shirit.shfaq (); |
} |
// #3, 255, 0, 125 do të vendosnin numrin led 3 në nivelin 255, 0, 125 |
nëse (inputString [0] == '$') { |
Temperatura e vargut; |
temp = inputString.substring (1); |
int pixNum = temp.toInt (); |
int rIndex = inputString.indexOf (',') + 1; |
temp = inputString.substring (rIndex); |
int rIntensiteti = temp.toInt (); |
intgIndex = inputString.indexOf (',', rIndex + 1) + 1; |
temp = inputString.substring (gIndex); |
intgIntensiteti = temp.toInt (); |
int bIndex = inputString.indexOf (',', gIndex + 1) + 1; |
temp = inputString.substring (bIndex); |
int bIntensiteti = temp.toInt (); |
Serial.print ("Cilësimi"); |
Serial.print (pixNum); |
Serial.print ("R to"); |
Serial.print (rIntensiteti); |
Serial.print ("G to"); |
Serial.print (gIntensiteti); |
Serial.print ("B to"); |
Serial.println (bIntensiteti); |
strip.setPixelColor (pixNum, strip. Color (rIntensiteti, gIntensiteti, bIntensiteti)); |
shirit.shfaq (); |
} |
nëse (inputString [0] == 's') { |
Temperatura e vargut; |
orë int, minutë; |
temp = inputString.substring (1); |
orë = temp.toInt (); |
int rIndex = inputString.indexOf (',') + 1; |
temp = inputString.substring (rIndex); |
minutë = temp.toInt (); |
Serial.print ("Koha e shfaqjes:"); |
Serial.print (orë); |
Serial.print (":"); |
Serial.print (minutë); |
koha e shfaqjes (orë, minutë); |
vonesa (1000); |
} |
inputString = ""; |
stringComplete = false; |
} |
// vonesa (1000); |
} |
voidserialEvent () { |
ndërsa (Seriali i disponueshëm ()) { |
char inChar = (char) Serial.read (); |
inputString += inChar; |
nëse (inChar == '\ n') { |
stringComplete = true; |
} |
vonesa (1); |
} |
} |
voidclear () { |
për (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (0, 0, 0)); |
} |
} |
voidshowTime () { |
DataTime tani = rtc.now (); |
orëPixel = tani. orë () % 12; |
minutePixel = (tani.minute () / 5) % 12 + 12; |
qartë(); |
// strip.setPixelColor (orëPixel, strip. Color (niveli 40 + 40 * [orëPixel], niveli 30 + 30 * [orëPixel], niveli 20 + 20 * [orëPixel])); |
// strip.setPixelColor (minutePixel, strip. Color (niveli 40 + 40 * [minutePixel], niveli 30 + 30 * [minutePixel], niveli 20 + 20 * [minutePixel])); |
strip.setPixelColor (orëPixel, strip. Color (niveli [orëPixel], niveli [orëPixel], niveli [orëPixel])); |
strip.setPixelColor (minutePixel, strip. Color (niveli [minutePixel], niveli [minutePixel], niveli [minutePixel])); |
// lightUp (shirit. Ngjyra (255, 255, 255)); |
shirit.shfaq (); |
} |
voidshowTime (ora int, minuta int) { |
orëPixel = orë % 12; |
minutePixel = (minutë / 5) % 12 + 12; |
qartë(); |
// strip.setPixelColor (orëPixel, strip. Color (niveli 40 + 40 * [orëPixel], niveli 30 + 30 * [orëPixel], niveli 20 + 20 * [orëPixel])); |
// strip.setPixelColor (minutePixel, strip. Color (niveli 40 + 40 * [minutePixel], niveli 30 + 30 * [minutePixel], niveli 20 + 20 * [minutePixel])); |
strip.setPixelColor (orëPixel, strip. Color (niveli [orëPixel], niveli [orëPixel], niveli [orëPixel])); |
strip.setPixelColor (minutePixel, strip. Color (niveli [minutePixel], niveli [minutePixel], niveli [minutePixel])); |
// lightUp (shirit. Ngjyra (255, 255, 255)); |
shirit.shfaq (); |
} |
voidlightUp (ngjyra uint32_t) { |
për (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, ngjyra); |
} |
shirit.shfaq (); |
} |
voidlightUpEven () { |
për (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (niveli , niveli , niveli )); |
} |
shirit.shfaq (); |
} |
shikoni rawplywoodClock.ino të pritur me ❤ nga GitHub
Hapi 10: Vizioni kompjuterik - Kalibrimi
Kam bërë një zgjedhje të vetëdijshme për të mos përdorur rimeso në këtë projekt. Nëse do të kisha, trashësia e drurit do të ishte e njëjtë para të gjitha LED -ve. Por, për shkak se kam një trashësi të ndryshme të drurit para secilës LED dhe sepse ngjyra e drurit ndryshon shumë gjithashtu, shkëlqimi i LED është i ndryshëm për secilën LED. Për të bërë që të gjitha LED -të të kenë të njëjtën shkëlqim, unë krijova një truk të mrekullueshëm.
Shkrova një kod përpunimi (në GitHub) i cili bën një fotografi të orës dhe analizon shkëlqimin e secilës LED me radhë. Pastaj ndryshon fuqinë në secilën LED për t'u përpjekur që të gjithë të kenë të njëjtën shkëlqim si LED më i zbehtë. Tani, e di që kjo është e tepërt, por përpunimi i imazhit është shumë argëtues! Dhe, shpresoj të zhvilloj kodin e kalibrimit si bibliotekë.
Ju mund të shihni shkëlqimin LED para dhe pas kalibrimit në fotot e mësipërme.
calibrateDispllay.pde
importprocessing.video.*; |
importprocessing.serial.*; |
Seriali myPort; |
Regjistroni video; |
finalint numLed = 24; |
int ledNum = 0; |
// duhet të kesh këto variabla globale për të përdorur PxPGetPixelDark () |
int rDark, gDark, bDark, aDark; |
int rLed, gLed, bLed, aLed; |
int rOrg, gOrg, bOrg, aOrg; |
int rTemp, gTemp, bTemp, aTemp; |
PImage ourImage; |
int runNumer = 0; |
int i pranueshëmError = 3; |
int bërë; |
int numPixelsInLed; |
long ledIntensiteti; |
int ledPower; |
synimi i gjatë Intensiteti = 99999999; |
voidsetup () { |
bërë = newint [numLed]; |
numPixelsInLed = newint [numLed]; |
ledIntensiteti = newlong [numLed]; |
ledPower = newint [numLed]; |
për (int i = 0; i <numLed; i ++) { |
ledPower = 255; |
} |
printArray (Serial.list ()); |
Emri i portit të vargut = Lista seriale () [31]; |
myPort = newSerial (kjo, emri i portit, 9600); |
madhësia (640, 480); |
video = newCapture (kjo, gjerësia, lartësia); |
video.fillo (); |
noStroke (); |
qetë (); |
vonesa (1000); // Prisni që porta serike të hapet |
} |
voiddraw () { |
nëse (video.të disponueshme ()) { |
nëse (bërë [ledNum] == 0) { |
clearDisplay (); |
vonesa (1000); |
video.lexo (); |
imazh (video, 0, 0, gjerësi, lartësi); // Vizatoni videon e kamerës në internet në ekran |
saveFrame ("data/no_leds.jpg"); |
nëse (runNumber! = 0) { |
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> pranueshmeError) { |
ledPower [ledNum] -= pow (0.75, runNumber)*100+1; |
} |
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> pranueshmeError) { |
ledPower [ledNum] += pow (0.75, runNumber)*100 +1; |
} |
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= pranueshmeError) { |
bërë [ledNum] = 1; |
print ("Led"); |
print (ledNum); |
shtyp ("e kryer"); |
} |
nëse (ledPower [ledNum]> 255) { |
ledPower [ledNum] = 255; |
} |
nëse (ledPower [ledNum] <0) { |
ledPower [ledNum] = 0; |
} |
} |
setLedPower (ledNum, ledPower [ledNum]); |
vonesa (1000); |
video.lexo (); |
imazh (video, 0, 0, gjerësi, lartësi); // Vizatoni videon e kamerës në internet në ekran |
vonesa (10); |
ndërsa (myPort.available ()> 0) { |
int inByte = myPort.read (); |
// print (char (inByte)); |
} |
Emri i imazhit të vargut = "të dhëna/"; |
emri i imazhit+= str (ledNum); |
Emri i imazhit += "_ led.jpg"; |
saveFrame (Emri i imazhit); |
String originalImageName = "data/org"; |
origjinalImageName+= str (ledNum); |
origjinalImageName += ". jpg"; |
nëse (runNumber == 0) { |
saveFrame (origjinalImageName); |
} |
PImage noLedImg = loadImage ("data/no_leds.jpg"); |
PImage ledImg = loadImage (Emri i imazhit); |
PImage originalImg = loadImage (originalImageName); |
noLedImg.loadPixels (); |
ledImg.loadPixels (); |
origjinalImg.loadPixels (); |
sfond (0); |
loadPixels (); |
ledIntensiteti [ledNum] = 0; |
numPixelsInLed [ledNum] = 0; |
për (int x = 0; x <gjerësia; x ++) { |
për (int y = 0; y <lartësia; y ++) { |
PxPGetPixelDark (x, y, noLedImg.pixels, gjerësi); |
PxPGetPixelLed (x, y, ledImg.pixels, gjerësia); |
PxPGetPixelOrg (x, y, origjinalImg.pixel, gjerësi); |
nëse ((rOrg+gOrg/2+bOrg/3)-(rDark+gDark/2+bDark/3)> 75) { |
ledIntensiteti [ledNum] = ledIntensiteti [ledNum]+(rLed+gLed/2+bLed/3) -(rDark+gDark/2+bDark/3); |
rTemp = 255; |
gTemp = 255; |
bTemp = 255; |
numPixelsInLed [ledNum] ++; |
} tjetër { |
rTemp = 0; |
gTemp = 0; |
bTemp = 0; |
} |
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, piksele, gjerësi); |
} |
} |
ledIntensiteti [ledNum] /= numPixelsInLed [ledNum]; |
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) { |
targetIntensity = ledIntensity [ledNum]; |
} |
updatePixels (); |
} |
print (ledNum); |
print (','); |
print (ledPower [ledNum]); |
print (','); |
println (ledIntensiteti [ledNum]); |
ledNum ++; |
nëse (ledNum == numLed) { |
int donezo = 0; |
për (int i = 0; i <numLed; i ++) { |
donezo += bërë ; |
} |
nëse (donezo == numLed) { |
println ("Bërë"); |
për (int i = 0; i <numLed; i ++) { |
shtyp (i); |
print ("\ t"); |
println (ledPower ); |
} |
print ("niveli int ["); |
print (ledNum); |
print ("] = {"); |
për (int i = 0; i <numLed-1; i ++) { |
print (ledPower ); |
print (','); |
} |
print (ledPower [numLed -1]); |
println ("};"); |
lightUpEven (); |
ndërsa (e vërtetë); |
} |
print ("Intensiteti i synuar:"); |
nëse (runNumber == 0) { |
targetIntensiteti -= 1; |
} |
println (Intensiteti i synuar); |
ledNum = 0; |
runNumber ++; |
} |
} |
} |
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // marrja e ngjyrave si int nga pikselët |
aOrg = (ky Pixel >> 24) & 0xFF; // ne duhet të zhvendosemi dhe të maskojmë për të marrë secilin komponent vetëm |
rOrg = (ky Pixel >> 16) & 0xFF; // kjo është më e shpejtë sesa të thërrasësh të kuqe (), jeshile (), blu () |
gOrg = (ky Pixel >> 8) & 0xFF; |
bOrg = ky Pixel & 0xFF; |
} |
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // marrja e ngjyrave si int nga pikselët |
aDark = (ky Pixel >> 24) & 0xFF; // ne duhet të zhvendosemi dhe të maskojmë për të marrë secilin komponent vetëm |
rDark = (ky Pixel >> 16) & 0xFF; // kjo është më e shpejtë sesa të thërrasësh të kuqe (), jeshile (), blu () |
gDark = (ky Pixel >> 8) & 0xFF; |
bDark = kjo Pixel & 0xFF; |
} |
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // marrja e ngjyrave si int nga pikselët |
aLed = (ky Pixel >> 24) & 0xFF; // ne duhet të zhvendosemi dhe të maskojmë për të marrë secilin komponent vetëm |
rLed = (ky Pixel >> 16) & 0xFF; // kjo është më e shpejtë sesa të thërrasësh të kuqe (), jeshile (), blu () |
gLed = (ky Pixel >> 8) & 0xFF; |
bLed = kjo Pixel & 0xFF; |
} |
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) { |
a = (a << 24); |
r = r << 16; // Ne po i paketojmë të 4 përbërjet në një int |
g = g << 8; // kështu që ne duhet t'i zhvendosim në vendet e tyre |
ngjyra argb = a | r | g | b; // operacioni binar "ose" i shton të gjitha në një int |
pixelArray [x+y*pixelsWidth] = argb; // së fundmi ne vendosim int me ngjyrat te në piksel |
} |
shikoni rawcalibrateDispllay.pde e pritur me ❤ nga GitHub
Hapi 11: Vërejtje ndarëse
Kurthe për të shmangur:
* Me dru, ju merrni atë që paguani. Pra, merrni dru me cilësi të mirë. Kompensatë thupër është një zgjedhje e mirë; çdo dru i fortë i lehtë do të bëjë mirë gjithashtu. Bëra çmim të ulët në dru dhe pendohem për vendimin tim.
* Bettershtë më mirë të shposh më pak se më shumë. Disa vrima shkuan shumë thellë për pjesën time. Dhe epoksi shfaqet në pjesën e përparme të fytyrës. Veryshtë shumë e dukshme sapo ta vini re.
* Përdorni një stërvitje në fund të topit në vend të një fundi të drejtë. Unë nuk kam eksperimentuar me fundin e topit, por jam shumë i sigurt se rezultatet do të jenë shumë më të mira.
Unë jam duke flirtuar me idenë e shitjes së këtyre në Etsy ose tindie. Unë vërtet do ta vlerësoja nëse mund të komentonit më poshtë nëse mendoni se ka kuptim:)
Recommended:
Llambë druri Edison prej druri e kontrolluar - (Video): 5 hapa
Llambë druri Edison prej druri e kontrolluar - (Video): Çmimi i pyetjes 5 dollarë. Kjo është sa kushton Wifi Relay SONOFF (Nga kompania ITEAD), e cila është zemra e kësaj pajisjeje. &Quot; Unë nuk kam dështuar. Sapo kam gjetur 10'000 mënyra që nuk do të funksionojnë. &Quot; - Thomas A. Edison Kjo është e pabesueshme, por kohët e fundit,
Altoparlanti druri i bërë në shtëpi prej druri: 6 hapa
Altoparlanti druri i bërë në shtëpi prej druri: Ky është një tjetër altoparlant i amplifikuar Bluetooth i bërë nga unë. Këtë herë ideja është që të prerë me lazer MDF e mbuluar më parë nga një fletë druri për të treguar modelin e bukur të grilës për skajet e lakuara të kutisë së zërit. Kam përdorur një fletë të lehtë imbuia për të
Orë LED prej druri: 5 hapa (me fotografi)
Ora LED prej druri: Ora LED prej druri duket si një kuti prej druri e mërzitshme, me përjashtim të kohës që shkëlqen në pjesën e përparme të saj. Në vend të një copë plastike gri për të parë, ju keni një copë druri më të bukur. Ai ende ruan të gjitha funksionet e tij, përfshirë
Orë dixhitale prej druri të ngurtë: 11 hapa (me fotografi)
Ora dixhitale prej druri të ngurtë: Si të ndërtoni një orë dixhitale prej druri të mundësuar nga një atmega168 (arduino) me një alarm të integruar dhe lojëra. Fillimisht mendova ta bëja këtë kur pashë një orë LED të mbuluar me një rimeso druri. Më pëlqeu kur e pashë, derisa pashë çmimin. Kjo është ku
Orë ingranazhi prej druri: 9 hapa (me fotografi)
Orë druri me ingranazhe: Kam shtuar video të orës. Unë do të punoj në gdhendjen e dritareve përballë orës. Unë do të ngarkoj fotografi dhe/ose një video të asaj kur të mbaroj. Unë jam marrë me përpunimin e drurit për disa vjet tani. Më pëlqen ideja për të qenë në gjendje të bëj