תוכן עניינים:
- שלב 1:
- שלב 2: עיצוב
- שלב 3: CNC
- שלב 4: אלקטרוניקה
- שלב 5: הרכבה אלקטרונית
- שלב 6: ריצה יבשה
- שלב 7: אפוקסי
- שלב 8: הרכבת הכל ביחד
- שלב 9: קוד
- שלב 10: ראיית מחשב - כיול
- שלב 11: הערות פרידה
וִידֵאוֹ: שעון LED מעץ - סגנון אנלוגי: 11 שלבים (עם תמונות)
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:17
זהו שעון LED מעץ בסגנון אנלוגי. אני לא יודע למה לא ראיתי אחד כזה לפני.. למרות שהסוגים הדיגיטליים נפוצים מאוד. Anyhoo, קדימה!
שלב 1:
פרויקט שעון דיקט התחיל כפרויקט התחלה פשוט לנתב ה- CNC. הסתכלתי על פרויקטים פשוטים ברשת ומצאתי את המנורה הזו (התמונה למעלה). ראיתי גם שעונים דיגיטליים הזוהרים מבד ציפוי עץ (התמונה למעלה). לכן, שילוב של שני הפרויקטים היה רעיון מובן מאליו. מחפש לאתגר את עצמי, החלטתי לא להשתמש בפורניר אלא רק בחתיכת עץ לפרויקט הזה.
שלב 2: עיצוב
עיצבתי את השעון ב- Inkscape (תמונה למעלה). העיצוב פשוט מאוד מבחירה. החלטתי נגד ניתוב עקבות לחוטים מכיוון שבשלב זה לא הייתי בטוח אם אני רוצה ללכת עם חיווט רדיאלי או היקפי. (החלטתי ללכת עם חיווט היקפי סוף סוף.) ניאופיקסל אחד נכנס לכל אחד מהחורים המעגליים הקטנים להצגת זמן הדקה והשעה, בדיוק של חמש דקות. המעגל באמצע ינותב החוצה כדי להתאים את האלקטרוניקה.
שלב 3: CNC
תכננתי את נתיבי הכלים ב- 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: הערות פרידה
מלכודות שכדאי להימנע מהן:
* עם עץ, אתה מקבל את מה שאתה משלם עבורו. אז קבלו עץ באיכות טובה. דיקט ליבנה הוא בחירה טובה; כל עץ מלא בהיר יסתדר גם כן. הוזלתי את העץ ומתחרט על החלטתי.
* עדיף לקדוח פחות מיותר. כמה חורים הלכו עמוק מדי בשביל היצירה שלי. והאפוקסי מופיע בפנים הקדמיות. זה מאוד מורגש ברגע שאתה שם לב לזה.
* השתמש במקדח בקצה הכדור במקום בקצה ישר. לא התנסיתי בקצה הכדור, אבל אני די בטוח שהתוצאות יהיו הרבה יותר טובות.
אני מפלרטט עם הרעיון למכור את אלה באטסי או בטינדי. אעריך מאוד אם תוכל להגיב למטה אם אתה חושב שזה הגיוני:)
מוּמלָץ:
שעון LED מעץ: 5 שלבים (עם תמונות)
שעון LED מעץ: שעון ה- LED מעץ נראה כמו ארגז עץ משעמם למעט שהזמן בוהק בחזיתו. במקום נתח פלסטיק אפור להסתכל עליו, יש לך חתיכת עץ יפה יותר. הוא עדיין שומר על כל הפונקציות שלו, כולל
שעון POV Led אנלוגי בסגנון אנלוגי עם Arduino Nano: 4 שלבים
שעון POV LED בסגנון אנלוגי עם Arduino Nano: זה נראה נחמד בעיצוב אנלוגי בסגנון שעון POV
שעון שולחן עבודה "מעץ" *מראה מודרני *: 9 שלבים (עם תמונות)
שעון שולחן עבודה "מעץ" *מראה מודרני *: שלום לכולם, זהו מכשיר ההוראה השני שלי! הפעם אנו הולכים לבנות שעון עץ עם תצוגת טמפרטורה ולחות. כמו שמוצג בתמונה, הזמן שלנו יוצג דרך "העץ". מכיוון שהאור אינו חזק מספיק
עיוור ונציאני מעץ ניקסי שעון, אחותה הקטנה של שרה: 7 שלבים (עם תמונות)
תריסי ונציאני עץ שעון ניקסי אקה הקטנה של שרה: לאחרונה קיבלתי אחיזה בכמה תריסי ונציאני מעץ שהיו גדולים מכדי להתאים לחלונות בהם התכוונתי להשתמש בהם. לאחר בנייה קפדנית שלהם נשארתי עם המון קטעים מנותקים ושמרתי אותם לפרק זמן עתידי
Raspberry Pi GPIO מעגלים: שימוש בחיישן אנלוגי LDR ללא ADC (ממיר אנלוגי לדיגיטלי): 4 שלבים
Raspberry Pi GPIO מעגלים: שימוש בחיישן אנלוגי LDR ללא ADC (ממיר אנלוגי לדיגיטלי): במדריך הקודם שלנו, הראנו לך כיצד תוכל לקשר את סיכות ה- GPIO של ה- Raspberry Pi שלך ללדים ולמתגים וכיצד סיכות GPIO יכולות להיות גבוהות או נמוך. אבל מה אם אתה רוצה להשתמש ב- Raspberry Pi שלך עם חיישן אנלוגי? אם נרצה להשתמש ב