جدول المحتويات:
- الخطوة 1:
- الخطوة الثانية: التصميم
- الخطوة 3: التصنيع باستخدام الحاسب الآلي
- الخطوة الرابعة: الإلكترونيات
- الخطوة 5: تجميع الإلكترونيات
- الخطوة 6: التشغيل الجاف
- الخطوة 7: الايبوكسي
- الخطوة 8: وضع كل ذلك معًا
- الخطوة 9: الكود
- الخطوة العاشرة: رؤية الكمبيوتر - المعايرة
- الخطوة 11: ملاحظات وداع
فيديو: ساعة خشبية ليد - طراز أنالوج: 11 خطوة (مع صور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:41
إنها ساعة LED خشبية على الطراز التناظري. لا أعرف لماذا لم أر أيًا من هؤلاء من قبل.. على الرغم من أن الأنواع الرقمية شائعة جدًا. Anyhoo ، ها نحن ذا!
الخطوة 1:
بدأ مشروع ساعة الخشب الرقائقي كمشروع بداية بسيط لجهاز التوجيه CNC. كنت أبحث في مشاريع بسيطة عبر الإنترنت ووجدت هذا المصباح (الصورة أعلاه). لقد رأيت أيضًا ساعات رقمية تتألق من خلال قشرة الخشب (الصورة أعلاه). لذا ، كان الجمع بين المشروعين فكرة واضحة. في محاولة لتحدي نفسي ، قررت عدم استخدام القشرة ولكن فقط قطعة من الخشب لهذا المشروع.
الخطوة الثانية: التصميم
لقد صممت الساعة في إنكسكيب (الصورة أعلاه). التصميم بسيط للغاية عن طريق الاختيار. قررت عدم توجيه آثار الأسلاك لأنني في هذه المرحلة لم أكن متأكدًا مما إذا كنت أرغب في استخدام الأسلاك الشعاعية أو المحيطية. (قررت أخيرًا استخدام الأسلاك المحيطية.) يدخل neopixel واحد في كل ثقب من الثقوب الدائرية الصغيرة لعرض الوقت بالدقائق والساعة ، بدقة تبلغ خمس دقائق. سيتم توجيه الدائرة الموجودة في المنتصف لاستيعاب الأجهزة الإلكترونية.
الخطوة 3: التصنيع باستخدام الحاسب الآلي
لقد صممت مسارات الأدوات على MasterCAM ، واستخدمت جهاز توجيه تقني لطحن الساعة من الخشب الرقائقي 3/4 بوصة. أستخدم قطعة مقاس 15 "× 15" لهذا ، بأقل قدر من الهدر. الحيلة هي إخراج أكبر قدر ممكن من الخشب دون اختراق الخشب. يعتبر ترك 0.05 "-0.1" اختيارًا جيدًا للخشب الفاتح. إذا لم تكن متأكدًا ، فمن الأفضل ترك المزيد من الخشب فيه ، لأنه يمكنك دائمًا صنفرة الوجه الآخر. انتهى بي الأمر بإزالة الكثير من الخشب من بعض الأجزاء ، لكن لحسن الحظ ، لا تعاني النتائج كثيرًا بسبب هذا.
ملاحظة للمستخدمين الذين ليس لديهم إمكانية الوصول إلى CNC:
يمكن تنفيذ هذا المشروع بسهولة باستخدام مكبس الحفر. تحتاج فقط إلى ضبط نقطة التوقف عند نقطة تترك فيها حوالي 0.1 بوصة من الخشب المتبقي في القاعدة. يجب أن تكون دقيقًا ، لكن ليس دقيقًا للغاية. بعد كل شيء ، من الناحية المثالية ، لن يرى أحد جميع مصابيح LED تضيء عند في نفس الوقت ، حتى تتمكن من الابتعاد قليلاً عن الانحدار.
الخطوة الرابعة: الإلكترونيات
الإلكترونيات بسيطة إلى حد ما. يوجد 24 نيوبكسل ، اثنا عشر لعرض الساعات واثني عشر لعرض الدقائق ، بدقة خمس دقائق. يتحكم Arduino pro mini في neopixels ويحصل على وقت دقيق من خلال وحدة DS3231 في الوقت الحقيقي (RTC). تحتوي وحدة RTC على خلية عملة كنسخة احتياطية ، لذلك لا تضيع الوقت حتى عند انقطاع التيار الكهربائي.
مادة:
Arduino pro mini (أو أي اردوينو آخر لهذا الأمر)
DS3231 لوح الاختراق
Neopixels في لوحات اندلاع فردية
الخطوة 5: تجميع الإلكترونيات
لقد قمت بتوصيل neopixels في سلسلة ، باستخدام أسلاك 2.5 بوصة لأول اثني عشر مصباحًا وسلكًا مقاس 4 بوصات للثني عشر مصباحًا التالية. كان بإمكاني استخدام أطوال سلك أصغر قليلاً. وبعد صنع الخيط ، اختبرته ، وتأكد من أن اللحام كانت المفاصل جيدة. أضفت مفتاحًا مؤقتًا لتشغيل جميع المصابيح ، فقط للتباهي.
الخطوة 6: التشغيل الجاف
بعد التجربة ، ووضع مصابيح LED في الثقوب وتشغيلها جميعًا ، كنت راضيًا عن النتائج. لذلك قمت برمل الوجه الأمامي قليلاً وطبقت معطفًا من البولي يوريثان. انتهى بي الأمر برمل المعطف في وقت لاحق ، لكن من الجيد تركه إذا لم تجده مستاءً من الناحية الجمالية.
الخطوة 7: الايبوكسي
بعد إجراء بعض الاختبارات مع موضع الصمام داخل الفتحات ، اكتشفت أن أفضل مناقشة يتم تحقيقها عندما تكون مصابيح LED على بعد حوالي 0.2 بوصة من نهاية الفتحة. وعندما تجرب هذا بنفسك ، سيكون سطوع مصابيح LED مختلفًا تمامًا في كل ثقب. لا تقلق بشأن هذا ؛ سنصلحه في الكود. هذا بسبب نوع لقمة المثقاب التي استخدمتها. إذا كنت سأفعل هذا مرة أخرى ، سأستخدم مثقاب نهاية الكرة للثقوب ولكن ، على أي حال ، للحصول على المسافة ، قمت بخلط بعض الإيبوكسي ووضع القليل في كل حفرة.
الخطوة 8: وضع كل ذلك معًا
سيتم وضع مؤشرات LED بدءًا من موضع عقرب الساعة 12 تتحرك عكس اتجاه عقارب الساعة من خلال جميع مواضع عقرب الساعات ثم إلى عقرب الدقائق ، ثم تتحرك مرة أخرى من علامة 60 دقيقة تتحرك عكس اتجاه عقارب الساعة. هذا بحيث عندما ننظر من الأمام ، يظهر نمط LED يسير في اتجاه عقارب الساعة.
بعد علاج الايبوكسي لمدة ساعة ، وضعت بعض الايبوكسي. هذه المرة ، قمت بوضع مصابيح LED في الثقوب ، مع التأكد من تغطية الأسلاك ومفاصل اللحام بالإيبوكسي. هذا يجعل انتشار الضوء جيدًا ويؤمن الأسلاك.
الخطوة 9: الكود
الكود موجود على GitHub ، فلا تتردد في تعديله لاستخدامك. عندما تقوم بتشغيل جميع مصابيح LED على نفس المستوى ، فإن سطوع الضوء الساطع سيكون مختلفًا جدًا في كل ثقب. هذا بسبب اختلاف سماكة الخشب في الثقوب والاختلاف في ظل الخشب ، كما ترون ، يختلف لون الخشب قليلاً في قطعي. لعلاج هذا الاختلاف في السطوع ، قمت بعمل مصفوفة لمستويات سطوع الصمام. وقل سطوع المصابيح الأكثر إشراقًا. إنها عملية تجربة وخطأ ويمكن أن تستغرق عدة دقائق ، لكن النتائج تستحق العناء.
الخشب الرقائقي
// ساعة خشب رقائقي |
// المؤلف: tinkrmind |
// Attribution 4.0 International (CC BY 4.0). أنت حر في: |
// مشاركة - نسخ وإعادة توزيع المواد بأي وسيلة أو تنسيق |
// التكيف - إعادة مزج المواد وتحويلها والبناء عليها لأي غرض ، حتى لأغراض تجارية. |
// يا هلا! |
#يشمل |
# تضمين "RTClib.h" |
RTC_DS3231 rtc ؛ |
# تضمين "Adafruit_NeoPixel.h" |
#ifdef _AVR_ |
#يشمل |
#إنهاء إذا |
# حدد رقم التعريف الشخصي 6 |
شريط Adafruit_NeoPixel = Adafruit_NeoPixel (60 ، PIN ، NEO_GRB + NEO_KHZ800) ؛ |
int hourPixel = 0 ؛ |
دقيقة دقيقة بكسل = 0 ؛ |
lastRtcCheck غير موقعة ؛ |
سلسلة inputString = "" ؛ // سلسلة لاستيعاب البيانات الواردة |
سلسلة منطقية كاملة = خطأ ؛ // ما إذا كانت السلسلة كاملة |
المستوى الدولي [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} ؛ |
الإعداد باطل () { |
#ifndef ESP8266 |
بينما (! المسلسل) ؛ // لليوناردو / مايكرو / صفر |
#إنهاء إذا |
// هذا خاص بـ Trinket 5V 16MHz ، يمكنك إزالة هذه الخطوط الثلاثة إذا كنت لا تستخدم Trinket |
# إذا تم تعريفها (_AVR_AT صغيرة 85_) |
إذا (F_CPU == 16000000) clock_prescale_set (clock_div_1) ؛ |
#إنهاء إذا |
// نهاية الكود الخاص بحلية |
Serial.begin (9600) ؛ |
strip.begin () ، |
عرض الشريط()؛ // تهيئة جميع وحدات البكسل على "إيقاف" |
إذا (! 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 بتاريخ ووقت صريحين ، على سبيل المثال لضبطه |
// 21 كانون الثاني (يناير) 2014 في الساعة 3 صباحًا ، يمكنك الاتصال: |
// rtc.adjust (DateTime (2017 ، 11 ، 06 ، 2 ، 49 ، 0)) ؛ |
} |
// rtc.adjust (DateTime (2017 ، 11 ، 06 ، 2 ، 49 ، 0)) ؛ |
// lightUpEven () ، |
// بينما (1) ؛ |
lastRtcCheck = 0 ؛ |
} |
حلقة فارغة () { |
إذا (مللي () - lastRtcCheck> 2000) { |
DateTime now = rtc.now () ؛ |
Serial.print (now.hour () ، ديسمبر) ؛ |
Serial.print (':') ؛ |
Serial.print (now.minute ()، DEC) ؛ |
Serial.print (':') ؛ |
Serial.print (now.second ()، DEC) ؛ |
Serial.println () ، |
موعد العرض()؛ |
lastRtcCheck = ميلي () ، |
} |
إذا (! digitalRead (2)) { |
lightUpEven () ، |
} |
إذا (سلسلة كاملة) { |
Serial.println (inputString) ؛ |
إذا (inputString [0] == 'l') { |
Serial.println ("المستوى") ؛ |
lightUpEven () ، |
} |
إذا (inputString [0] == 'c') { |
Serial.println ("عرض الوقت") ؛ |
موعد العرض()؛ |
عرض الشريط()؛ |
} |
إذا (inputString [0] == '1') { |
Serial.println ("التبديل على جميع المصابيح") ؛ |
lightUp (شريط اللون (255 ، 255 ، 255)) ؛ |
عرض الشريط()؛ |
} |
إذا (inputString [0] == '0') { |
Serial.println ("شريط المقاصة") ؛ |
صافي()؛ |
عرض الشريط()؛ |
} |
// # 3 ، 255 سيحدد رقم الصمام 3 إلى المستوى 255 ، 255 ، 255 |
إذا (inputString [0] == '#') { |
درجة حرارة السلسلة |
temp = inputString.substring (1) ، |
int pixNum = temp.toInt () ، |
temp = inputString.substring (inputString.indexOf ('،') + 1) ؛ |
كثافة كثافة العمليات = temp.toInt () ؛ |
Serial.print ("الإعداد") ؛ |
Serial.print (pixNum) ؛ |
Serial.print ("إلى المستوى") ؛ |
Serial.println (شدة) ؛ |
strip.setPixelColor (pixNum ، strip. Color (الكثافة ، الكثافة ، الكثافة)) ؛ |
عرض الشريط()؛ |
} |
// # 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) ؛ |
كثافة العمليات = temp.toInt () ؛ |
intgIndex = inputString.indexOf ('،'، rIndex + 1) + 1 ؛ |
temp = inputString.substring (gIndex) ؛ |
كثافة intg = temp.toInt () ، |
int bIndex = inputString.indexOf ('،'، gIndex + 1) + 1 ؛ |
temp = inputString.substring (bIndex) ؛ |
كثافة كثافة العمليات = temp.toInt () ؛ |
Serial.print ("الإعداد") ؛ |
Serial.print (pixNum) ؛ |
Serial.print ("R to") ؛ |
Serial.print (كثافة r) ؛ |
Serial.print ("G to") ؛ |
Serial.print (كثافة g) ؛ |
Serial.print ("B إلى") ؛ |
Serial.println (كثافة b) ؛ |
strip.setPixelColor (pixNum ، strip. Color (r كثافة ، g كثافة ، b كثافة)) ؛ |
عرض الشريط()؛ |
} |
إذا (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 () { |
بينما (Serial.available ()) { |
char inChar = (char) Serial.read () ؛ |
inputString + = inChar ؛ |
إذا (inChar == '\ n') { |
stringComplete = صحيح ؛ |
} |
تأخير (1) ؛ |
} |
} |
voidclear () { |
لـ (uint16_t i = 0 ؛ i <strip.numPixels () ؛ i ++) { |
strip.setPixelColor (i ، strip. Color (0 ، 0 ، 0)) ؛ |
} |
} |
voidshowTime () { |
DateTime now = rtc.now () ؛ |
hourPixel = now.hour ()٪ 12 ؛ |
minutesPixel = (now.minute () / 5)٪ 12 + 12 ؛ |
صافي()؛ |
// strip.setPixelColor (hourPixel، strip. Color (40 + 40 * مستوى [hourPixel] ، 30 + 30 * level [hourPixel] ، 20 + 20 * level [hourPixel])) ؛ |
// strip.setPixelColor (بالدقيقة بكسل ، الشريط. اللون (40 + 40 * مستوى [دقيقة بكسل] ، 30 + 30 * مستوى [دقيقة بكسل] ، 20 + 20 * مستوى [دقيقة بكسل])) ؛ |
strip.setPixelColor (hourPixel، strip. Color (المستوى [hourPixel] والمستوى [hourPixel] والمستوى [hourPixel])) ؛ |
strip.setPixelColor (minutesPixel، strip. Color (المستوى [بالدقيقة بالبكسل] ، المستوى [الدقائق بالبكسل] ، المستوى [الدقائق بالبكسل])) ؛ |
// lightUp (strip. Color (255 ، 255 ، 255)) ؛ |
عرض الشريط()؛ |
} |
voidshowTime (ساعة دولية ، دقيقة داخلية) { |
ساعة بكسل = ساعة٪ 12 ؛ |
دقيقة بكسل = (دقيقة / 5)٪ 12 + 12 ؛ |
صافي()؛ |
// strip.setPixelColor (hourPixel، strip. Color (40 + 40 * مستوى [hourPixel] ، 30 + 30 * level [hourPixel] ، 20 + 20 * level [hourPixel])) ؛ |
// strip.setPixelColor (بالدقيقة بكسل ، الشريط. اللون (40 + 40 * مستوى [دقيقة بكسل] ، 30 + 30 * مستوى [دقيقة بكسل] ، 20 + 20 * مستوى [دقيقة بكسل])) ؛ |
strip.setPixelColor (hourPixel، strip. Color (المستوى [hourPixel] والمستوى [hourPixel] والمستوى [hourPixel])) ؛ |
strip.setPixelColor (minutesPixel، strip. Color (المستوى [بالدقيقة بالبكسل] ، المستوى [الدقائق بالبكسل] ، المستوى [الدقائق بالبكسل])) ؛ |
// lightUp (strip. Color (255 ، 255 ، 255)) ؛ |
عرض الشريط()؛ |
} |
voidlightUp (uint32_t color) { |
لـ (uint16_t i = 0 ؛ i <strip.numPixels () ؛ i ++) { |
strip.setPixelColor (أنا ، لون) ؛ |
} |
عرض الشريط()؛ |
} |
voidlightUpEven () { |
لـ (uint16_t i = 0 ؛ i <strip.numPixels () ؛ i ++) { |
strip.setPixelColor (i، strip. Color (المستوى ، المستوى ، المستوى )) ؛ |
} |
عرض الشريط()؛ |
} |
عرض rawplywoodClock.ino مستضاف مع ❤ بواسطة GitHub
الخطوة العاشرة: رؤية الكمبيوتر - المعايرة
لقد اتخذت قرارًا واعًا بعدم استخدام القشرة في هذا المشروع. إذا كان لدي ، لكان سمك الخشب هو نفسه أمام جميع المصابيح. ولكن ، نظرًا لأن لدي سمكًا مختلفًا من الخشب أمام كل LED ولأن لون الخشب يختلف كثيرًا أيضًا ، فإن سطوع LED يختلف لكل مصباح LED. لجعل جميع مصابيح LED تبدو بنفس السطوع ، ابتكرت خدعة رائعة.
لقد كتبت بعض التعليمات البرمجية للمعالجة (على GitHub) والتي تلتقط صورة للساعة وتحلل سطوع كل LED على حدة. ثم يغير الطاقة لكل 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 ؛ |
طويل كثافة الصمام. |
int ledPower ؛ |
كثافة الهدف الطويل = 99999999 ؛ |
الإعداد باطل() { |
تم = جديد [numLed] ؛ |
numPixelsInLed = جديد [numLed] ، |
ledIntensity = newlong [numLed] ؛ |
ledPower = جديد [numLed] ؛ |
لـ (int i = 0 ؛ i <numLed ؛ i ++) { |
ledPower = 255 ؛ |
} |
printArray (Serial.list ()) ؛ |
String portName = Serial.list () [31] ، |
myPort = newSerial (هذا ، portName ، 9600) ؛ |
الحجم (640 ، 480) ؛ |
video = newCapture (هذا ، العرض ، الارتفاع) ؛ |
video.start () ، |
noStroke () ، |
ناعم()؛ |
تأخير (1000) ؛ // انتظر حتى يتم فتح المنفذ التسلسلي |
} |
voiddraw () { |
إذا (video.available ()) { |
إذا (تم [ledNum] == 0) { |
clearDisplay () ، |
تأخير (1000) ؛ |
video.read () ؛ |
صورة (فيديو ، 0 ، 0 ، عرض ، ارتفاع) ؛ // ارسم فيديو كاميرا الويب على الشاشة |
saveFrame ("data / no_leds.jpg") ؛ |
إذا (runNumber! = 0) { |
إذا ((ledIntensity [ledNum] - targetIntensity) * 100 / targetIntensity> خطأ مقبول) { |
ledPower [ledNum] - = الأسرى (0.75 ، رقم التشغيل) * 100 + 1 ؛ |
} |
إذا ((targetIntensity - ledIntensity [ledNum]) * 100 / targetIntensity> مقبول خطأ) { |
ledPower [ledNum] + = الأسرى (0.75 ، رقم التشغيل) * 100 + 1 ؛ |
} |
إذا (القيمة المطلقة (كثافة الهدف - كثافة الصمام [ledNum]) * 100 / كثافة الهدف <= خطأ مقبول) { |
تم [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) ؛ |
بينما (myPort.available ()> 0) { |
int inByte = myPort.read () ، |
// طباعة (شار (inByte)) ؛ |
} |
String imageName = "data /" ؛ |
اسم الصورة + = str (ledNum) ؛ |
اسم الصورة + = "_ led.jpg" ؛ |
saveFrame (imageName) ، |
String originalImageName = "بيانات / مؤسسة" ؛ |
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) ؛ |
تحميل بكسل () ؛ |
كثافة الصمام [ledNum] = 0 ؛ |
numPixelsInLed [ledNum] = 0 ؛ |
لـ (int x = 0 ؛ x <width ؛ 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] = كثافة led [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] ؛ |
إذا (targetIntensity> ledIntensity [ledNum] && runNumber == 0) { |
targetIntensity = كثافة الصمام [ledNum] ؛ |
} |
updatePixels () ؛ |
} |
طباعة (ledNum) ؛ |
مطبعة('، ')؛ |
طباعة (ledPower [ledNum]) ؛ |
مطبعة('، ')؛ |
println (كثافة led [ledNum]) ؛ |
ledNum ++ ؛ |
إذا (ledNum == numLed) { |
int donezo = 0 ؛ |
لـ (int i = 0 ؛ i <numLed ؛ i ++) { |
donezo + = تم ؛ |
} |
إذا (donezo == numLed) { |
println ("تم") ؛ |
لـ (int i = 0 ؛ i <numLed ؛ i ++) { |
طباعة (ط) ؛ |
طباعة ("\ t") ؛ |
println (ledPower ) ؛ |
} |
طباعة ("مستوى int [") ؛ |
طباعة (ledNum) ؛ |
طباعة ("] = {") ؛ |
لـ (int i = 0 ؛ i <numLed-1 ؛ i ++) { |
طباعة (ledPower ) ؛ |
مطبعة('، ')؛ |
} |
طباعة (ledPower [numLed -1]) ؛ |
println ("} ؛") ؛ |
lightUpEven () ، |
احيانا صحيح)؛ |
} |
طباعة ("الكثافة المستهدفة:") ؛ |
إذا (runNumber == 0) { |
كثافة الهدف - = 1 ؛ |
} |
println (كثافة الهدف) ؛ |
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) { |
أ = (أ << 24) ؛ |
ص = ص << 16 ؛ // نقوم بتعبئة جميع المكونات الأربعة في عدد صحيح واحد |
ز = ز << 8 ؛ // لذلك نحن بحاجة إلى نقلهم إلى أماكنهم |
لون الأرجب = أ | ص | ز | ب؛ // عملية ثنائية "أو" تجمعهم جميعًا في عدد صحيح واحد |
pixelArray [x + y * pixelsWidth] = argb ؛ // finaly قمنا بتعيين int مع ألوان te في البكسل |
} |
عرض rawcalibrateDispllay.pde مستضاف مع ❤ بواسطة GitHub
الخطوة 11: ملاحظات وداع
المزالق التي يجب تجنبها:
* مع الخشب ، تحصل على ما تدفعه مقابل. لذا ، احصل على خشب عالي الجودة. خشب البتولا الرقائقي هو اختيار جيد ؛ أي خشب صلب خفيف سوف يعمل بشكل جيد أيضًا. لقد قمت بتخفيض سعر الخشب وندمت على قراري.
* من الأفضل حفر أقل من أكثر. ذهب زوجان من الثقوب عميقاً للغاية بالنسبة لقطعي. ويظهر الايبوكسي من خلال الوجه الأمامي. إنه ملحوظ جدًا بمجرد أن تلاحظه.
* استخدام مثقاب نهاية الكرة بدلا من نهاية مستقيمة. لم أجرب بتة نهاية الكرة ، لكنني متأكد من أن النتائج ستكون أفضل بكثير.
أنا أمزح مع فكرة بيع هذه على Etsy أو tindie. سأكون ممتنًا حقًا إذا كان بإمكانك التعليق أدناه إذا كنت تعتقد أنه من المنطقي:)
موصى به:
LEDura - ساعة LED أنالوج: 12 خطوة (مع صور)
LEDura - ساعة LED التناظرية: بعد وقت طويل من مجرد القيام بمشروع مختلف ، قررت أن أجعل التدريب بنفسي. بالنسبة للواحدة الأولى ، سأوجهك خلال عملية صنع ساعتك التناظرية المصنوعة من حلقة LED رائعة قابلة للعنونة. الحلقة الداخلية تظهر الساعات ، ou
ساعة زفاف خشبية بإضاءة LED: 8 خطوات (مع صور)
ساعة زفاف خشبية مضاءة بإضاءة LED: لقد بدأت هذا المشروع لصنع ساعة زفاف فريدة من نوعها وفريدة من نوعها لأختي وشقيق زوجي. & nbsp؛ أرادوا أن يصنعوا شيئًا يمكن أن يضيءوا ويظهروا بعض جوانب يوم زفافهم لفترة طويلة قادمة. مررت بالعديد من التصميمات
ساعة خشبية ليد: 5 خطوات (مع صور)
ساعة LED الخشبية: تبدو ساعة LED الخشبية وكأنها صندوق خشبي ممل باستثناء أن الوقت يتوهج من خلال الجزء الأمامي منها. فبدلاً من النظر إلى قطعة من البلاستيك الرمادي ، لديك قطعة خشب أجمل. لا يزال يحتفظ بجميع وظائفه ، بما في ذلك
C51 ساعة إلكترونية 4 بت - ساعة خشبية: 15 خطوة (مع صور)
C51 4 Bits Electronic Clock - ساعة خشبية: قضيت بعض وقت الفراغ في نهاية هذا الأسبوع ، لذا تقدمت وقمت بتجميع هذه الساعة الرقمية الإلكترونية ذات الأربع بتات 2.40 دولار أسترالي والتي اشتريتها من AliExpress منذ فترة
ساعة سطح المكتب "خشبية" * مظهر عصري *: 9 خطوات (مع صور)
ساعة سطح المكتب "الخشبية" * بمظهر عصري *: مرحبًا بالجميع ، هذا هو ثاني تعليم لي! هذه المرة سنقوم ببناء ساعة خشبية مع عرض درجة الحرارة والرطوبة. كما هو موضح في الصورة ، سيتم عرض وقتنا من خلال & quot؛ الخشب & quot ؛ نظرًا لأن الضوء ليس قويًا بما يكفي