Բովանդակություն:

Փայտե LED ժամացույց - անալոգային ոճ. 11 քայլ (նկարներով)
Փայտե LED ժամացույց - անալոգային ոճ. 11 քայլ (նկարներով)

Video: Փայտե LED ժամացույց - անալոգային ոճ. 11 քայլ (նկարներով)

Video: Փայտե LED ժամացույց - անալոգային ոճ. 11 քայլ (նկարներով)
Video: Часы G-Shock до 250 долларов-15 лучших часов Casio G до 250 доллар... 2024, Հուլիսի
Anonim
Փայտե LED ժամացույց - անալոգային ոճ
Փայտե LED ժամացույց - անալոգային ոճ

Դա անալոգային ոճով փայտե LED ժամացույց է: Չգիտեմ, թե ինչու ես նախկինում չէի տեսել դրանցից մեկը, չնայած թվային տեսակները շատ տարածված են: Ինչևէ, ահա մենք գնում ենք:

Քայլ 1:

Պատկեր
Պատկեր
Պատկեր
Պատկեր

Նրբատախտակի ժամացույցի նախագիծը սկսվեց որպես CNC երթուղիչի պարզ մեկնարկային նախագիծ: Ես առցանց պարզ նախագծեր էի նայում և գտա այս լամպը (նկարը վերևում): Ես նաև տեսել էի թվային ժամացույցներ, որոնք փայլում են փայտե երեսպատման միջոցով (նկարը վերևում): Այսպիսով, երկու նախագծերի համատեղումը ակնհայտ գաղափար էր: Ինքս ինձ մարտահրավեր նետելու համար որոշեցի այս նախագծի համար չօգտագործել երեսպատում, այլ միայն փայտ:

Քայլ 2: Դիզայն

Դիզայն
Դիզայն
Դիզայն
Դիզայն

Ես նախագծեցի ժամացույցը Inkscape- ում (նկարը վերևում): Դիզայնը շատ պարզ է ընտրությամբ: Ես որոշեցի չընդունել լարերի հետքերը, քանի որ այս պահին ես վստահ չէի, որ ուզում եմ ճառագայթային կամ պարագծային էլեկտրագծերով գնալ: (Ես որոշեցի վերջապես գնալ պարագծային էլեկտրագծերի միջոցով): Մեկ նեոպիքսել մտնում է փոքր շրջանաձև անցքերից յուրաքանչյուրի մեջ `րոպեի և ժամի ժամանակը ցույց տալու համար, հինգ րոպեանոց ճշգրտությամբ: Մեջտեղում գտնվող շրջանակը դուրս կուղղվի `էլեկտրոնիկան տեղավորելու համար:

Քայլ 3: CNC միացում

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Ես նախագծեցի MasterCAM- ի գործիքային ուղիները և տեխնոուղղիչով ժամացույցը 3/4 դյույմանոց նրբատախտակից մանրացնելու համար: Ես դրա համար օգտագործում եմ 15 «x15» կտոր ՝ նվազագույն վատնումով: Հնարքը կայանում է նրանում, որ հնարավորինս շատ փայտ դուրս հանվի ՝ առանց փայտը ճեղքելու: Թողնել 0.05 "-0.1" լավ ընտրություն է բաց փայտի համար: Եթե վստահ չեք, ավելի լավ է ավելի շատ փայտ թողեք, քանի որ միշտ կարող եք մյուս երեսին ավազ անել: Որոշ հատվածներից ես մի փոքր շատ փայտ հանեցի, բայց, բարեբախտաբար, դրա պատճառով արդյունքները շատ չեն տուժի:

Նշում այն օգտվողների համար, ովքեր չունեն մուտք դեպի CNC.

Այս նախագիծը հեշտությամբ կարելի է անել փորված մամլիչով: Պարզապես պետք է կանգառը դնեք մի վայրում, որտեղ հիմքում մնում եք մոտ 0,1 փայտ: Դուք պետք է ճշգրիտ լինեք, բայց ոչ չափազանց ճշգրիտ: Ի վերջո, իդեալականորեն ոչ ոք չի տեսնի, որ բոլոր LED լուսարձակները վառվեն միևնույն ժամանակ, այնպես որ կարող եք հեռանալ մի փոքր թեքումով:

Քայլ 4: Էլեկտրոնիկա

Էլեկտրոնիկա
Էլեկտրոնիկա
Էլեկտրոնիկա
Էլեկտրոնիկա
Էլեկտրոնիկա
Էլեկտրոնիկա

Էլեկտրոնիկան բավականին պարզ է: Կան 24 նեոպիքսել, տասներկուսը ՝ ժամերը ցույց տալու համար, և տասներկուսը ՝ րոպեները ցույց տալու համար, հինգ րոպեանոց ճշգրտությամբ: Arduino pro mini- ն վերահսկում է նեոպիքսելները և այն ճշգրիտ ժամանակ է ստանում իրական ժամանակի ժամացույցի (RTC) մոդուլի միջոցով DS3231: RTC մոդուլն ունի մետաղադրամի բջիջ ՝ որպես պահեստային, ուստի այն ժամանակ չի կորցնում նույնիսկ այն ժամանակ, երբ հոսանքը անջատված է:

Նյութը ՝

Arduino pro mini (կամ ցանկացած այլ Arduino այդ հարցում)

DS3231 բեկման տախտակ

Neopixels- ը առանձին ճեղքման տախտակներում

Քայլ 5: Էլեկտրոնիկայի հավաքում

Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում
Էլեկտրոնիկայի հավաքում

Ես կապեցի նեոպիքսելները տողի մեջ ՝ առաջին տասներկու լուսարձակների համար օգտագործելով 2,5 դյույմ մետաղալարեր և հաջորդ տասներկուսի համար չորս դյույմանոց մետաղալարեր: Ես կարող էի մի փոքր ավելի փոքր երկարություններ օգտագործել: Լարը պատրաստելուց հետո ես փորձարկեցի այն ՝ համոզվելով, որ զոդումը հոդերը լավ էին: Ես ավելացրեցի մի ակնթարթային անջատիչ `բոլոր լուսարձակները միացնելու համար, պարզապես ցուցադրելու համար:

Քայլ 6: Չոր վազք

Չոր Վազք
Չոր Վազք
Չոր Վազք
Չոր Վազք
Չոր Վազք
Չոր Վազք
Չոր Վազք
Չոր Վազք

Փորձարկումներից հետո, լուսադիոդներ տեղադրելով անցքերի մեջ և միացնելով դրանք բոլորը, ես գոհ էի արդյունքներից: Այսպիսով, ես մի փոքր հղկեցի առջևի երեսը և քսեցի PU վերարկու: Ավարտեցի վերարկուն ավելի ուշ հղկելով, բայց լավ գաղափար է այն թողնել, եթե այն ձեզ համար էսթետիկորեն հաճելի չէ:

Քայլ 7: Էպոքսիդ

Էպոքսիդ
Էպոքսիդ
Էպոքսիդ
Էպոքսիդ

Անցքերի ներսում առաջնորդվող դիրքով որոշ փորձարկումներից հետո ես հասկացա, որ լավագույն քննարկումը ձեռք է բերվում, երբ LED- ները փոսի վերջից գտնվում են մոտ 0,2 հեռավորության վրա: Երբ ինքներդ դա փորձեք, LED- ների պայծառությունը շատ տարբեր կլինի: յուրաքանչյուր փոս. Մի անհանգստացեք դրա մասին. մենք դա շտկելու ենք կոդի մեջ: Սա իմ օգտագործած փորվածքների տեսակի պատճառով է: Եթե ես նորից դա անեի, ես անցքերի համար կօգտագործեի գնդակի վերջնամաս: Բայց, ամեն դեպքում, հեռավորությունը ստանալու համար ես մի քանի էպոքսիդ խառնեցի և մի փոքր դրեցի յուրաքանչյուր անցքի մեջ:

Քայլ 8: Ամեն ինչ միասին դնել

Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը
Այդ ամենը միասին դնելը

LED- ները տեղադրվելու են ժամը 12-ի սլաքի հակառակ դիրքից ժամացույցի սլաքի ուղղությամբ շարժվող ժամացույցի սլաքի բոլոր դիրքերում և այնուհետև դեպի րոպեական սլաքը ՝ կրկին շարժվելով ժամացույցի սլաքի հակառակ ուղղությամբ շարժվող 60 րոպեանոց նշանից: Սա այնպես է, որ երբ մենք դիտարկում ենք առջևից, LED ձևը հայտնվում է ժամացույցի սլաքի ուղղությամբ:

Էպոքսիդից մեկ ժամ բուժվելուց հետո ես էլ ավելի էպոքսիդ դրեցի: Այս անգամ ես LED- ները տեղադրեցի անցքերի մեջ `համոզվելով, որ էպոքսիդով ծածկում եմ լարերը և կպցնում հոդերը: Սա ապահովում է լույսի լավ դիֆուզիոն և ամրացնում լարերը:

Քայլ 9: Կոդ

Կոդ
Կոդ

Կոդը գտնվում է GitHub- ում, ազատորեն փոփոխեք այն ձեր օգտագործման համար: Երբ դուք միացնում եք բոլոր LED- ները նույն մակարդակին, յուրաքանչյուր փոսում շողացող լույսի պայծառությունը շատ տարբեր կլինի: Սա բացվածքների փայտի տարբեր հաստության և փայտի ստվերի տարբերության պատճառով է, ինչպես տեսնում եք, փայտի գույնը բավականին փոխվում է իմ կտորում: Պայծառության այս տարբերությունը շտկելու համար ես կազմեցի led պայծառության մակարդակների մատրիցա: Եվ նվազեցրեց պայծառ LED- ների պայծառությունը: Սա փորձարկման և սխալի գործընթաց է և կարող է տևել մի քանի րոպե, բայց արդյունքները արժանի են դրան:

plywoodClock.ino

// Նրբատախտակի ժամացույց
// Հեղինակ ՝ tinkrmind
// Attribution 4.0 International (CC BY 4.0): Դուք ազատ եք ՝
// Կիսվել - պատճենել և վերաբաշխել նյութը ցանկացած կրիչով կամ ձևաչափով
// Հարմարեցնել - վերափոխել, վերափոխել և կառուցել նյութի վրա ցանկացած նպատակով, նույնիսկ առևտրային առումով:
// Ուռա!
#ներառում
#ներառել «RTClib.h»
RTC_DS3231 rtc;
#ներառել «Adafruit_NeoPixel.h»
#ifdef _AVR_
#ներառում
#էնդիֆ
#սահմանել PIN6
Adafruit_NeoPixel շերտ = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int ժամ Pixel = 0;
int րոպե Pixel = 0;
unsignedlong lastRtcCheck;
String inputString = ""; // տող մուտքային տվյալները պահելու համար
բուլյան տող Complete = false; // արդյոք տողը ամբողջական է
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
իսկ (! Սերիա); // Լեոնարդոյի/Միկրո/eroրոյի համար
#էնդիֆ
// Սա Trinket 5V 16MHz- ի համար է, կարող եք հեռացնել այս երեք տողերը, եթե չօգտագործեք մանրուք
#եթե սահմանված է (_AVR_ATtiny85_)
եթե (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#էնդիֆ
// մանրահատակի ավարտի հատուկ ծածկագիր
Serial.begin (9600);
strip.begin ();
strip.show (); // Նախագծել բոլոր պիքսելները «անջատված»
եթե (! rtc.begin ()) {
Serial.println («Չհաջողվեց գտնել RTC»);
մինչդեռ (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
եթե (rtc.lostPower ()) {
Serial.println («RTC- ն կորցրեց էներգիան, թույլ տվեք սահմանել ժամանակը»);
// հետևյալ տողը RTC- ն սահմանում է այս ուրվագծի կազմման ամսաթվի և ժամի
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// Այս տողը սահմանում է RTC- ն հստակ ամսաթվով և ժամով, օրինակ `սահմանելու համար
// 2014 թվականի հունվարի 21 -ին, առավոտյան ժամը 3 -ին, դուք կարող եք զանգահարել.
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
}
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
// lightUpEven ();
// մինչդեռ (1);
lastRtcCheck = 0;
}
voidloop () {
if (millis () - lastRtcCheck> 2000) {
DateTime now = rtc.now ();
Serial.print (այժմ. Ժամ (), DEC);
Serial.print (':');
Serial.print (այժմ. Րոպե (), DEC);
Serial.print (':');
Serial.print (այժմ. Երկրորդ (), DEC);
Serial.println ();
showTime ();
lastRtcCheck = միլլիս ();
}
եթե (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
եթե (inputString [0] == 'լ') {
Serial.println («Մակարդակ»);
lightUpEven ();
}
եթե (inputString [0] == 'գ') {
Serial.println («Showingուցադրման ժամանակը»);
showTime ();
strip.show ();
}
եթե (inputString [0] == '1') {
Serial.println («Միացնելով բոլոր LED- ները»);
lightUp (շերտ. Գույն (255, 255, 255));
strip.show ();
}
եթե (inputString [0] == '0') {
Serial.println («Մաքրող շերտ»);
պարզ ();
strip.show ();
}
// #3, 255 – ը led 3 համարը կդարձնի 255, 255, 255 մակարդակ
եթե (inputString [0] == '#') {
Լարային ջերմաստիճան;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int ինտենսիվություն = temp.toInt ();
Serial.print («Կարգավորում»);
Serial.print (pixNum);
Serial.print («մակարդակին հասնել»);
Serial.println (ինտենսիվություն);
strip.setPixelColor (pixNum, strip. Color (ինտենսիվություն, ինտենսիվություն, ինտենսիվություն));
strip.show ();
}
// #3, 255, 0, 125 -ը կհանգեցնի 3 -րդ համարի մակարդակին 255, 0, 125
եթե (inputString [0] == '$') {
Լարային ջերմաստիճան;
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 («Կարգավորում»);
Serial.print (pixNum);
Serial.print («R դեպի»);
Serial.print (rIntensity);
Serial.print («G դեպի»);
Serial.print (gIntensity);
Serial.print («B- ից»);
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
եթե (inputString [0] == 'ներ') {
Լարային ջերմաստիճան;
int ժամ, րոպե;
temp = inputString.substring (1);
ժամ = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
րոպե = temp.toInt ();
Serial.print ("Showingուցադրման ժամանակը.");
Serial.print (ժամ);
Serial.print (":");
Serial.print (րոպե);
showTime (ժամ, րոպե);
ուշացում (1000);
}
inputString = "";
stringComplete = false;
}
// ուշացում (1000);
}
voidserialEvent () {
իսկ (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
եթե (inChar == '\ n') {
stringComplete = true;
}
ուշացում (1);
}
}
voidclear () {
համար (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (0, 0, 0));
}
}
voidshowTime () {
DateTime now = rtc.now ();
hourPixel = այժմ. ժամ () % 12;
minutePixel = (այժմ. րոպե () / 5) % 12 + 12;
պարզ ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * մակարդակ [hourPixel], 30 + 30 * մակարդակ [hourPixel], 20 + 20 * մակարդակ [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * մակարդակ [minutePixel], 30 + 30 * մակարդակ [minutePixel], 20 + 20 * մակարդակ [minutePixel]));
strip.setPixelColor (hourPixel, strip. Color (մակարդակ [hourPixel], մակարդակ [hourPixel], մակարդակ [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (մակարդակ [minutePixel], մակարդակ [minutePixel], մակարդակ [minutePixel]));
// lightUp (շերտ. Գույն (255, 255, 255));
strip.show ();
}
voidshowTime (int ժամ, int րոպե) {
hourPixel = ժամ % 12;
minutePixel = (րոպե / 5) % 12 + 12;
պարզ ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * մակարդակ [hourPixel], 30 + 30 * մակարդակ [hourPixel], 20 + 20 * մակարդակ [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * մակարդակ [minutePixel], 30 + 30 * մակարդակ [minutePixel], 20 + 20 * մակարդակ [minutePixel]));
strip.setPixelColor (hourPixel, strip. Color (մակարդակ [hourPixel], մակարդակ [hourPixel], մակարդակ [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (մակարդակ [minutePixel], մակարդակ [minutePixel], մակարդակ [minutePixel]));
// lightUp (շերտ. Գույն (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t գույն) {
համար (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, գույն);
}
strip.show ();
}
voidlightUpEven () {
համար (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (մակարդակ , մակարդակ , մակարդակ ));
}
strip.show ();
}

դիտել rawplywoodClock.ino- ն hosted -ի կողմից հյուրընկալված GitHub- ի կողմից

Քայլ 10. Համակարգչային տեսլական - չափագրում

Համակարգչային տեսլական - չափագրում
Համակարգչային տեսլական - չափագրում
Համակարգչային տեսլական - չափագրում
Համակարգչային տեսլական - չափագրում

Ես գիտակցված ընտրություն կատարեցի ՝ այս նախագծում երեսպատում չօգտագործելու համար: Եթե ես ունենայի, ապա փայտի հաստությունը նույնը կլիներ բոլոր LED- ների առջև: Բայց քանի որ յուրաքանչյուր LED- ի դիմաց ես ունեմ փայտի այլ հաստություն և քանի որ փայտի գույնը նույնպես շատ է տարբերվում, LED լուսավորությունը տարբեր է յուրաքանչյուր LED- ի համար: Որպեսզի բոլոր LED- ները միևնույն պայծառության տեսք ունենան, ես հնարք ստեղծեցի:

Ես գրել եմ որոշ մշակման կոդ (GitHub- ում), որը լուսանկարում է ժամացույցը և իր հերթին վերլուծում յուրաքանչյուր LED- ի պայծառությունը: Այնուհետև այն փոխում է յուրաքանչյուր LED- ի հզորությունը `փորձելով այնպես անել, որ դրանք բոլորը ունենան նույն պայծառությունը, ինչ ամենաթույլ LED- ը: Այժմ, ես գիտեմ, որ սա չափազանց շատ է, բայց պատկերի մշակումը շատ զվարճալի է: Եվ ես հույս ունեմ, որ որպես գրադարան կզարգացնեմ ստուգաչափման կոդը:

Դուք կարող եք տեսնել լուսադիոդի պայծառությունը կալիբրացիայից առաջ և հետո ՝ վերևի լուսանկարներում:

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Սերիական myPort;
Տեսանկարահանել;
finalint numLed = 24;
int ledNum = 0;
// դուք պետք է ունենաք այս գլոբալ փոփոխականները ՝ 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 ընդունելի Սխալ = 3;
int արված;
int numPixelsInLed;
long ledIntensity;
int ledPower;
երկար targetIntensity = 99999999;
voidsetup () {
արել = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
համար (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
Լարային նավահանգիստ = Serial.list () [31];
myPort = newSerial (սա, portName, 9600);
չափը (640, 480);
տեսանյութ = newCapture (սա, լայնությունը, բարձրությունը);
video.start ();
noStroke ();
հարթ();
ուշացում (1000); // Սպասեք, մինչև սերիական նավահանգիստը բացվի
}
voiddraw () {
եթե (տեսանյութ. մատչելի ()) {
եթե (արված [ledNum] == 0) {
clearDisplay ();
ուշացում (1000);
video.read ();
պատկեր (տեսանյութ, 0, 0, լայնություն, բարձրություն); // Տեսախցիկի տեսանյութը նկարեք էկրանին
saveFrame ("data/no_leds.jpg");
եթե (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> ընդունելիՍխալ) {
ledPower [ledNum] -= ուժ (0.75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> ընդունելիՍխալ) {
ledPower [ledNum] += հզորություն (0.75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= acceptError) {
կատարված [ledNum] = 1;
տպել («Led»);
տպել (ledNum);
տպել («կատարված է»);
}
եթե (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
եթե (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
ուշացում (1000);
video.read ();
պատկեր (տեսանյութ, 0, 0, լայնություն, բարձրություն); // Տեսախցիկի տեսանյութը նկարեք էկրանին
ուշացում (10);
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// տպել (char (inByte));
}
String imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (պատկերի անուն);
String originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
եթե (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 ();
ֆոն (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
համար (int x = 0; x <լայնություն; x ++) {
համար (int y = 0; y <բարձրություն; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, լայնություն);
PxPGetPixelLed (x, y, ledImg.pixels, լայնություն);
PxPGetPixelOrg (x, y, originalImg.pixels, լայնություն);
եթե ((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] ++;
} ուրիշ {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, պիքսել, լայնություն);
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
տպել (ledNum);
տպել (',');
տպել (ledPower [ledNum]);
տպել (',');
println (ledIntensity [ledNum]);
ledNum ++;
եթե (ledNum == numLed) {
int donezo = 0;
համար (int i = 0; i <numLed; i ++) {
donezo += արված ;
}
եթե (donezo == numLed) {
println («ԿԱՏԱՐՎԱ Է»);
համար (int i = 0; i <numLed; i ++) {
տպել (i);
տպել ("\ t");
println (ledPower );
}
տպել («int մակարդակ [»);
տպել (ledNum);
տպել ("] = {");
համար (int i = 0; i <numLed-1; i ++) {
տպել (ledPower );
տպել (',');
}
տպել (ledPower [numLed -1]);
println ("};");
lightUpEven ();
իսկ (ճշմարիտ);
}
տպել («Թիրախային ինտենսիվություն.»);
եթե (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // ստանալ պիքսելներից գույները որպես int
aOrg = (այս pixel >> 24) & 0xFF; // մենք պետք է տեղաշարժվենք և դիմակավորենք ՝ յուրաքանչյուր բաղադրիչ միայնակ ստանալու համար
rOrg = (այս Պիքսել >> 16) & 0xFF; // սա ավելի արագ է, քան կարմիր (), կանաչ (), կապույտ () կանչելը
gOrg = (այս pixel >> 8) & 0xFF;
bOrg = այս pixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // ստանալ պիքսելներից գույները որպես int
aDark = (այս pixel >> 24) & 0xFF; // մենք պետք է տեղաշարժվենք և դիմակավորենք ՝ յուրաքանչյուր բաղադրիչ միայնակ ստանալու համար
rDark = (այս pixel >> 16) & 0xFF; // սա ավելի արագ է, քան կարմիր (), կանաչ (), կապույտ () կանչելը
gDark = (այս pixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // ստանալ պիքսելներից գույները որպես int
aLed = (այս pixel >> 24) & 0xFF; // մենք պետք է տեղաշարժվենք և դիմակավորենք ՝ յուրաքանչյուր բաղադրիչ միայնակ ստանալու համար
rLed = (այս Պիքսել >> 16) & 0xFF; // սա ավելի արագ է, քան կարմիր (), կանաչ (), կապույտ () կանչելը
gLed = (այս Պիքսել >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Մենք փաթեթավորում ենք բոլոր 4 կոմպոզիցիաները մեկ ինտերիերում
g = g << 8; // այնպես որ մենք պետք է դրանք տեղափոխենք իրենց տեղերը
գույն argb = a | r | գ | բ; // երկուական «կամ» գործողությունը դրանք բոլորը ավելացնում է մեկ ինտեր
pixelArray [x+y*pixelsWidth] = argb; // վերջապես int- ը te գույներով սահմանում ենք պիքսելների մեջ
}

դիտել rawcalibrateDispllay.pde hosted -ի կողմից հյուրընկալված GitHub- ի կողմից

Քայլ 11: Բաժանման դիտողություններ

Խուսափելու որոգայթներ.

* Փայտով դուք ստանում եք այն, ինչի համար վճարում եք: Այսպիսով, լավ որակի փայտ ձեռք բերեք: Birch նրբատախտակը լավ ընտրություն է. ցանկացած թեթև ամուր փայտ նույնպես լավ կանի: Ես էժանացել եմ փայտի վրա և ափսոսում եմ իմ որոշման համար:

* Ավելի լավ է ավելի քիչ փորել, քան ավելին: Մի քանի անցք չափազանց խորացան իմ կտորի համար: Եվ էպոքսիդն արտահայտվում է առջևի մասում: Դա շատ նկատելի է, երբ նկատում ես:

* Ուղղակի վերջի փոխարեն օգտագործեք գնդակի վերջնամասը: Ես գնդակի վերջնամասով փորձեր չեմ արել, բայց ես վստահ եմ, որ արդյունքները շատ ավելի լավը կլինեն:

Ես ֆլիրտ եմ անում Etsy- ով կամ tindie- ով դրանք վաճառելու մտքով: Ես իսկապես կգնահատեի դա, եթե կարողանայիք մեկնաբանել ստորև, եթե կարծում եք, որ իմաստ ունի:)

Խորհուրդ ենք տալիս: