תוכן עניינים:

שעון LED מעץ - סגנון אנלוגי: 11 שלבים (עם תמונות)
שעון LED מעץ - סגנון אנלוגי: 11 שלבים (עם תמונות)

וִידֵאוֹ: שעון LED מעץ - סגנון אנלוגי: 11 שלבים (עם תמונות)

וִידֵאוֹ: שעון LED מעץ - סגנון אנלוגי: 11 שלבים (עם תמונות)
וִידֵאוֹ: לשבור את גבולות התודעה: פסיכיאטר מגלה הכל 2024, יולי
Anonim
שעון LED מעץ - סגנון אנלוגי
שעון LED מעץ - סגנון אנלוגי

זהו שעון LED מעץ בסגנון אנלוגי. אני לא יודע למה לא ראיתי אחד כזה לפני.. למרות שהסוגים הדיגיטליים נפוצים מאוד. Anyhoo, קדימה!

שלב 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 אינץ 'של עץ שנותר בבסיס. תצטרך להיות מדויק, אך לא מדויק מדי. אחרי הכל, באופן אידיאלי אף אחד לא יראה את כל הנורות נורות ב באותו הזמן, כך שתוכל לברוח עם מעט שיפוע.

שלב 4: אלקטרוניקה

מכשירי חשמל
מכשירי חשמל
מכשירי חשמל
מכשירי חשמל
מכשירי חשמל
מכשירי חשמל

האלקטרוניקה פשוטה למדי. ישנם 24 neopixels, שתיים עשרה להצגת השעות ו- שתים עשרה להצגת הדקות, בדיוק של חמש דקות. מיני Arduino pro שולט על הניאופיקסלים והוא מקבל זמן מדויק באמצעות מודול שעון בזמן אמת (RTC) DS3231. למודול RTC יש תא מטבע כגיבוי, כך שהוא לא מאבד זמן גם כשהחשמל כבוי.

חוֹמֶר:

Arduino pro mini (או כל Arduino אחר לצורך העניין)

לוח פריצה DS3231

Neopixels בלוחות פריצה בודדים

שלב 5: הרכבה אלקטרונית

הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה

חיברתי את הניאופיקסלים במחרוזת, באמצעות חוטים בגודל 2.5 אינץ 'לשנים עשר הנורות הראשונות וחוט ארבעה אינץ' לשנים עשר הקרובות. יכולתי להשתמש באורכי חוט מעט קטנים יותר. לאחר ביצוע המחרוזת בדקתי אותו, וודא שהלחמה המפרקים היו טובים. הוספתי מתג רגע כדי להדליק את כל הנורות, רק כדי להשוויץ.

שלב 6: ריצה יבשה

ריצה יבשה
ריצה יבשה
ריצה יבשה
ריצה יבשה
ריצה יבשה
ריצה יבשה
ריצה יבשה
ריצה יבשה

לאחר שהתנסיתי, הכנסתי נוריות לחורים והדלקתי את כולם, הייתי מרוצה מהתוצאות. אז שיפשפתי מעט את הפנים הקדמיות והנחתי מעיל PU. בסופו של דבר שיפשפתי את המעיל מאוחר יותר, אבל זה רעיון טוב להשאיר אותו אם אתה לא מוצא אותו אסתטי.

שלב 7: אפוקסי

אפוקסי
אפוקסי
אפוקסי
אפוקסי

לאחר בדיקה כלשהי עם המיקום הוביל בתוך החורים, הבנתי שהדיון הטוב ביותר מושג כאשר הנורות רחוקות בסביבות 0.2 אינץ 'מקצה החור. כאשר תנסה זאת בעצמך, בהירות הנורות תהיה שונה מאוד כל חור. אל תדאג לגבי זה; נתקן אותו בקוד. זה בגלל סוג המקדח שהשתמשתי בו. אם הייתי עושה זאת שוב, הייתי משתמש במקדח לקצה הכדור לחורים אבל בכל מקרה, כדי להגיע למרחק, ערבבתי מעט אפוקסי ושמתי מעט בכל חור.

שלב 8: הרכבת הכל ביחד

לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד
לשים את הכל ביחד

נוריות הנייד יוצבו החל ממיקום היד השעה 12 שעבר לנוע נגד כיוון השעון דרך כל תנוחות השעה ולאחר מכן עד מחוג הדקות, שוב ינועו מסימן 60 הדקות הנעים נגד כיוון השעון. זאת כך שכאשר אנו מתבוננים מלפנים דפוס ה- LED מופיע בכיוון השעון.

לאחר שהאפוקסי נרפא במשך שעה, הכנסתי עוד אפוקסי. הפעם הנחתי את הלדים בחורים, ודאגתי לכסות את החוטים ומפרקי הלחמה באפוקסי. זה גורם להפצת אור טובה ומאבטח את החוטים.

שלב 9: קוד

קוד
קוד

הקוד נמצא ב- GitHub, אל תהסס לשנות אותו לשימושך. כאשר אתה מפעיל את כל הנורות לד אותה רמה, בהירות האור הזורחת תהיה שונה מאוד בכל חור. הסיבה לכך היא עובי העץ השונה בחורים וההבדל בגוון העץ, כפי שניתן לראות צבע העץ משתנה לא מעט ביצירה שלי. כדי לתקן את ההבדל הזה בהירות, הכנתי מטריצה של רמות בהירות LED. והוריד את בהירות הנורות הבהירות יותר. זהו תהליך של ניסוי וטעייה ויכול לקחת מספר דקות, אך התוצאות שוות את זה.

דיקט Clock.ino

// שעון דיקט
// מחבר: tinkrmind
// ייחוס 4.0 בינלאומי (CC BY 4.0). אתה חופשי:
// שתף - העתק והפיץ מחדש את החומר בכל אמצעי או פורמט
// Adapt - רמיקס, טרנספורמציה ובנייה על החומר לכל מטרה, אפילו מסחרית.
// הורי!
#לִכלוֹל
#כלול "RTClib.h"
RTC_DS3231 rtc;
#כלול "Adafruit_NeoPixel.h"
#ifdef _AVR_
#לִכלוֹל
#endif
#definePIN6
רצועת Adafruit_NeoPixel = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int hourPixel = 0;
int minutePixel = 0;
unsRegent longRtcCheck;
String inputString = ""; // מחרוזת לאחסון נתונים נכנסים
string booleanComplete = false; // האם המחרוזת הושלמה
int 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};
הגדרת voids () {
#ifndef ESP8266
בעוד (! סדרתי); // לאונרדו/מיקרו/אפס
#endif
// זה מיועד ל- Trinket 5V 16MHz, אתה יכול להסיר את שלושת השורות האלה אם אינך משתמש ב- Trinket
#if מוגדר (_AVR_ATtiny85_)
אם (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#endif
// סוף קוד תכשיט מיוחד
Serial.begin (9600);
strip.begin ();
strip.show (); // אתחל את כל הפיקסלים ל'כבוי '
אם (! rtc.begin ()) {
Serial.println ("לא הצלחתי למצוא RTC");
בעוד (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
if (rtc.lostPower ()) {
Serial.println ("RTC איבד כוח, מאפשר להגדיר את השעה!");
// השורה הבאה קובעת את ה- RTC לתאריך ושעה שסקיצה זו נערכה
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// שורה זו קובעת את ה- RTC עם תאריך ושעה מפורשים, למשל להגדרה
// 21 בינואר 2014 בשעה 3:00 תתקשר:
// 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 עכשיו = rtc.now ();
Serial.print (now.hour (), DEC);
Serial.print (':');
Serial.print (now.minute (), DEC);
Serial.print (':');
Serial.print (now.second (), DEC);
Serial.println ();
showTime ();
lastRtcCheck = millis ();
}
אם (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("רמה");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("מראה זמן");
showTime ();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println ("הפעלת כל הלדים");
lightUp (strip. Color (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("רצועת סליקה");
ברור();
strip.show ();
}
// #3, 255 יגדיר את מספר ה- LED לרמה 255, 255, 255
if (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
if (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 to");
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 ();
}
if (inputString [0] == 's') {
טמפ 'מחרוזת;
אינט שעה, דקה;
temp = inputString.substring (1);
שעה = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
דקה = temp.toInt ();
Serial.print ("מראה זמן:");
Serial.print (שעה);
Serial.print (":");
Serial.print (דקה);
showTime (שעה, דקה);
עיכוב (1000);
}
inputString = "";
stringComplete = false;
}
// עיכוב (1000);
}
voidserialEvent () {
while (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 עכשיו = rtc.now ();
hourPixel = now.hour () % 12;
minutePixel = (now.minute () / 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 (strip. Color (255, 255, 255));
strip.show ();
}
voidshowTime (שעת אינט, אינט דקה) {
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 (strip. Color (255, 255, 255));
strip.show ();
}
voidlightUp (צבע uint32_t) {
עבור (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, color);
}
strip.show ();
}
voidlightUpEven () {
עבור (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (רמה , רמה , רמה ));
}
strip.show ();
}

הצג rawplywoodClock.ino בהנחיית ❤ מאת GitHub

שלב 10: ראיית מחשב - כיול

ראיית מחשב - כיול
ראיית מחשב - כיול
ראיית מחשב - כיול
ראיית מחשב - כיול

בחרתי במודע שלא להשתמש בפורניר בפרויקט זה. אם היה לי, עובי העץ היה זהה מול כל הלדים. אבל מכיוון שיש לי עובי עץ שונה מול כל לד ומכיוון שצבע העץ משתנה גם הוא, בהירות הלד שונה לכל לד. כדי לגרום לכל הנורות להיות בעלות בהירות זהה, גיבשתי טריק מגניב.

כתבתי קוד עיבוד כלשהו (ב- GitHub) שמצלם את השעון ומנתח את בהירות כל LED בתורו. לאחר מכן הוא משתנה את הכוח לכל נורית כדי לנסות לגרום לכולם להיות בעלי אותה בהירות כמו הנורית העמומה ביותר. עכשיו, אני יודע שזה מוגזם, אבל עיבוד תמונות הוא מאוד כיף! ואני מקווה לפתח את קוד הכיול כספרייה.

אתה יכול לראות את בהירות ה- LED לפני ואחרי הכיול בתמונות למעלה.

כיול Displlay.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 acceptError = 3;
int נעשה;
int numPixelsInLed;
long ledIntensity;
int ledPower;
Intensity target = 99999999;
הגדרת voids () {
done = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
עבור (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Serial.list () [31];
myPort = newSerial (this, portName, 9600);
גודל (640, 480);
video = newCapture (זה, רוחב, גובה);
video.start ();
noStroke ();
חלק();
עיכוב (1000); // המתן לפתיחת יציאה טורית
}
voiddraw () {
if (video.available ()) {
if (done [ledNum] == 0) {
clearDisplay ();
עיכוב (1000);
video.read ();
תמונה (וידאו, 0, 0, רוחב, גובה); // צייר את סרטון מצלמת האינטרנט על המסך
saveFrame ("data/no_leds.jpg");
if (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> acceptError) {
ledPower [ledNum] -= pow (0.75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> acceptError) {
ledPower [ledNum] += pow (0.75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= acceptableError) {
done [ledNum] = 1;
הדפס ("לד");
הדפס (ledNum);
הדפס ("בוצע");
}
if (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
if (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
עיכוב (1000);
video.read ();
תמונה (וידאו, 0, 0, רוחב, גובה); // צייר את סרטון מצלמת האינטרנט על המסך
עיכוב (10);
בעוד (myPort.available ()> 0) {
int inByte = myPort.read ();
// print (char (inByte));
}
String imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
String originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
if (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 <height; 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);
הדפס(', ');
print (ledPower [ledNum]);
הדפס(', ');
println (ledIntensity [ledNum]);
ledNum ++;
if (ledNum == numLed) {
int donezo = 0;
עבור (int i = 0; i <numLed; i ++) {
donezo += done ;
}
if (donezo == numLed) {
println ("בוצע");
עבור (int i = 0; i <numLed; i ++) {
הדפס (i);
הדפס ("\ t");
println (ledPower );
}
print ("int level [");
print (ledNum);
print ("] = {");
עבור (int i = 0; i <numLed-1; i ++) {
print (ledPower );
הדפס(', ');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
בעוד (נכון);
}
print ("עוצמת היעד:");
if (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // קבלת הצבעים כאינט מהפיקסלים
aOrg = (thisPixel >> 24) & 0xFF; // עלינו לשנות ולמסוך כדי לקבל כל רכיב לבד
rOrg = (thisPixel >> 16) & 0xFF; // זה מהיר יותר מאשר להתקשר לאדום (), ירוק (), כחול ()
gOrg = (thisPixel >> 8) & 0xFF;
bOrg = thisPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // קבלת הצבעים כאינט מהפיקסלים
aDark = (thisPixel >> 24) & 0xFF; // עלינו לשנות ולמסוך כדי לקבל כל רכיב לבד
rDark = (thisPixel >> 16) & 0xFF; // זה מהיר יותר מאשר להתקשר לאדום (), ירוק (), כחול ()
gDark = (thisPixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // קבלת הצבעים כאינט מהפיקסלים
aLed = (thisPixel >> 24) & 0xFF; // עלינו לשנות ולמסוך כדי לקבל כל רכיב לבד
rLed = (thisPixel >> 16) & 0xFF; // זה מהיר יותר מאשר להתקשר לאדום (), ירוק (), כחול ()
gLed = (thisPixel >> 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 | g | ב; // הפעלה בינארית "או" מוסיפה את כולם לאינט אחד
pixelArray [x+y*pixelsWidth] = argb; // לבסוף הגדרנו את int עם צבעי הפיקסלים
}

הצג rawcalibrateDispllay.pde המתארח אצל ❤ על ידי GitHub

שלב 11: הערות פרידה

מלכודות שכדאי להימנע מהן:

* עם עץ, אתה מקבל את מה שאתה משלם עבורו. אז קבלו עץ באיכות טובה. דיקט ליבנה הוא בחירה טובה; כל עץ מלא בהיר יסתדר גם כן. הוזלתי את העץ ומתחרט על החלטתי.

* עדיף לקדוח פחות מיותר. כמה חורים הלכו עמוק מדי בשביל היצירה שלי. והאפוקסי מופיע בפנים הקדמיות. זה מאוד מורגש ברגע שאתה שם לב לזה.

* השתמש במקדח בקצה הכדור במקום בקצה ישר. לא התנסיתי בקצה הכדור, אבל אני די בטוח שהתוצאות יהיו הרבה יותר טובות.

אני מפלרטט עם הרעיון למכור את אלה באטסי או בטינדי. אעריך מאוד אם תוכל להגיב למטה אם אתה חושב שזה הגיוני:)

מוּמלָץ: