Სარჩევი:
- Ნაბიჯი 1:
- ნაბიჯი 2: დიზაინი
- ნაბიჯი 3: CNCing
- ნაბიჯი 4: ელექტრონიკა
- ნაბიჯი 5: ელექტრონიკის შეკრება
- ნაბიჯი 6: მშრალი სირბილი
- ნაბიჯი 7: ეპოქსია
- ნაბიჯი 8: ყველაფერს ერთად ათავსებთ
- ნაბიჯი 9: კოდი
- ნაბიჯი 10: კომპიუტერული ხედვა - კალიბრაცია
- ნაბიჯი 11: გამოყოფის შენიშვნები
ვიდეო: ხის LED საათი - ანალოგური სტილი: 11 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:20
ეს არის ანალოგი სტილის ხის LED საათი. არ ვიცი რატომ არ მინახავს აქამდე ერთი.. მიუხედავად იმისა, რომ ციფრული ტიპები ძალიან გავრცელებულია. ყოველ შემთხვევაში, ჩვენ მივდივართ!
Ნაბიჯი 1:
პლაივუდის საათის პროექტი დაიწყო როგორც მარტივი დამწყები პროექტი CNC როუტერისთვის. მე ვუყურებდი მარტივ პროექტებს ინტერნეტში და ვიპოვე ეს ნათურა (სურათი ზემოთ). მე ასევე მქონდა ნანახი ციფრული საათები, რომლებიც ბრწყინავს ხის საფარით (სურათი ზემოთ). ამრიგად, ორი პროექტის გაერთიანება აშკარა იდეა იყო. საკუთარი თავის გამოწვევის მიზნით, გადავწყვიტე, რომ ამ პროექტისთვის არ გამომეყენებინა ვინირი, არამედ მხოლოდ ხის ნაჭერი.
ნაბიჯი 2: დიზაინი
მე შევქმენი საათი Inkscape– ში (სურათი ზემოთ). დიზაინი ძალიან მარტივია არჩევანის მიხედვით. მე გადავწყვიტე მავთულხლართების კვალის გადაადგილების წინააღმდეგ, რადგან ამ დროს მე არ ვიყავი დარწმუნებული, მინდოდა თუ არა რადიალური ან პერიმეტრის გაყვანილობა. (მე გადავწყვიტე პერიმეტრის გაყვანილობა საბოლოოდ.) თითო ნეოპიქსელი მიდის თითოეულ პატარა წრიულ ხვრელში წუთისა და საათის დროის საჩვენებლად, ხუთწუთიანი სიზუსტით. შუაში არსებული წრე გაივლის ელექტრონიკის შესანახად.
ნაბიჯი 3: CNCing
მე დავაპროექტე ინსტრუმენტარული გზები MasterCAM– ზე და გამოვიყენე technoRouter საათი 3/4 დიუმიანი პლაივუდიდან საათის ამოსაღებად. ამისათვის ვიყენებ 15 "x15" ნაწილს, მინიმალური ხარჯვით. ხრიკი მდგომარეობს იმაში, რომ რაც შეიძლება მეტი ხე გამოვიტანოთ ხის გარღვევის გარეშე. დატოვება 0.05 "-0.1" არის კარგი არჩევანი მსუბუქი ხისათვის. თუ არ ხართ დარწმუნებული, უმჯობესია დატოვოთ მეტი ხე, რადგან თქვენ ყოველთვის შეგიძლიათ ქვიშა სხვა სახეზე. მე დავასრულე ცოტაოდენი ხის ამოღება ზოგიერთი ნაწილიდან, მაგრამ საბედნიეროდ შედეგები ამის გამო ძალიან არ იტანჯება.
შენიშვნა მომხმარებლებისთვის CNC– ზე წვდომის გარეშე:
ეს პროექტი ადვილად შეიძლება გაკეთდეს საბურღი პრესით. თქვენ უბრალოდ უნდა დააყენოთ გაჩერება იმ წერტილში, სადაც დატოვებთ დაახლოებით 0,1 ხეს ძირში. თქვენ უნდა იყოთ ზუსტი, მაგრამ არც ისე ზუსტი. ყოველივე ამის შემდეგ, იდეალურად არავინ დაინახავს ყველა LED- ების განათებას ამავე დროს, ასე რომ თქვენ შეგიძლიათ მოშორდეთ პატარა დახრილობას.
ნაბიჯი 4: ელექტრონიკა
ელექტრონიკა საკმაოდ მარტივია. არის 24 ნეოპიქსელი, თორმეტი საათების საჩვენებლად და თორმეტი წუთის საჩვენებლად, ხუთწუთიანი სიზუსტით. Arduino pro mini აკონტროლებს ნეოპიქსელებს და ის იღებს ზუსტ დროს DS3231 რეალური დროის საათის (RTC) მოდულის საშუალებით. RTC მოდულს აქვს მონეტის უჯრედი, როგორც სარეზერვო, ასე რომ ის არ კარგავს დროს მაშინაც კი, როდესაც დენი გამორთულია.
მასალა:
Arduino pro mini (ან სხვა Arduino ამ საკითხში)
DS3231 გარღვევის დაფა
ნეოპიქსელები ინდივიდუალური გარღვევის დაფებში
ნაბიჯი 5: ელექტრონიკის შეკრება
მე დავუკავშირე ნეოპიქსელები სტრიქონში, 2.5 მავთულის გამოყენებით პირველი თორმეტი ლიდერისთვის და ოთხი დიუმიანი მავთულისთვის მომდევნო თორმეტისთვის. მე შემეძლო გამომეყენებინა ოდნავ პატარა მავთულის სიგრძე. სიმების გაკეთების შემდეგ, მე გამოვცადე იგი სახსრები კარგი იყო. მე დავამატე წამიერი გადამრთველი, რომ ჩართო ყველა led, მხოლოდ საჩვენებლად.
ნაბიჯი 6: მშრალი სირბილი
ექსპერიმენტის შემდეგ, ხვრელებში LED- ების ჩასმა და მათი ჩართვა, მე კმაყოფილი ვიყავი შედეგებით. ასე რომ, მე ოდნავ მოვიქექე წინა სახე და გამოვიყენე PU ქურთუკი. მე დავამთავრე ქურთუკის მოშორება მოგვიანებით, მაგრამ კარგი იდეაა დატოვოთ იგი, თუ ესთეტიკურად არ მოგწონთ.
ნაბიჯი 7: ეპოქსია
ხვრელების შიგნით ლიდერი პოზიციის შემოწმების შემდეგ, მივხვდი, რომ საუკეთესო დისკუსია მიიღწევა მაშინ, როდესაც LED- ები ხვრელის ბოლოდან დაშორებულია 0.2 -ით. როდესაც ამას თავად ცდილობთ, LED- ების სიკაშკაშე ძალიან განსხვავებული იქნება თითოეული ხვრელი. არ ინერვიულოთ ამის შესახებ; ჩვენ შევასწორებთ მას კოდით. ეს არის იმის გამო, რომ ტიპის საბურღი ვიყენებდი. თუ ამას კიდევ გავიმეორებ, ხვრელებისთვის გამოვიყენებდი ბურთის საბურღს მაგრამ, ნებისმიერ შემთხვევაში, მანძილის მისაღებად მე შეურიე ეპოქსია და ცოტა ჩავდე თითოეულ ხვრელში.
ნაბიჯი 8: ყველაფერს ერთად ათავსებთ
LED- ები განთავსდება 12 საათის საათის პოზიციიდან საათის ისრის საწინააღმდეგოდ მოძრაობისას საათის საათის ყველა პოზიციაში და შემდეგ წუთში, ისევ მოძრაობს 60 წუთის ნიშნიდან საათის ისრის საწინააღმდეგოდ. ეს ხდება ისე, რომ როდესაც ჩვენ ვუყურებთ წინა ნაწილიდან, LED შაბლონი გამოჩნდება საათის ისრის მიმართულებით.
მას შემდეგ, რაც ეპოქსია ერთი საათის განმავლობაში კურნავდა, ჩავდე კიდევ რამდენიმე ეპოქსია. ამჯერად, მე განათავსეთ LED- ები ხვრელებში, დარწმუნდით, რომ დაფარეთ მავთულები და შეაერთეთ სახსრები ეპოქსიდთან ერთად. ეს ქმნის კარგ სინათლის დიფუზიას და უზრუნველყოფს მავთულხლართებს.
ნაბიჯი 9: კოდი
კოდი არის GitHub– ზე, მოგერიდებათ შეცვალოთ იგი თქვენი გამოყენებისთვის. როდესაც თქვენ ჩართავთ ყველა LED- ს იმავე დონეზე, სინათლის სიკაშკაშე, რომელიც ანათებს, ძალიან განსხვავდება თითოეულ ხვრელში. ეს არის იმის გამო, რომ ხვრელებში ხის სხვადასხვა სისქე და ხის ჩრდილში განსხვავებაა, როგორც ხედავთ, ხის ფერი საკმაოდ ცვალებადია ჩემს ნაჭერში. სიკაშკაშის ამ განსხვავების გამოსასწორებლად, მე შევქმენი led სიკაშკაშის დონის მატრიცა. და შემცირდა ნათელი LED- ების სიკაშკაშე. ეს არის საცდელი და შეცდომის პროცესი და შეიძლება რამდენიმე წუთი დასჭირდეს, მაგრამ შედეგები ღირს.
პლაივუდი საათი.ინო
// პლაივუდის საათი |
// ავტორი: tinkrmind |
// ატრიბუცია 4.0 საერთაშორისო (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 საათი პიქსელი = 0; |
int წუთი პიქსელი = 0; |
ხელმოუწერელი lastRtcCheck; |
სიმებიანი inputString = ""; // სტრიქონი შემომავალი მონაცემების შესანახად |
ლოგიკური სტრიქონი სრული = ყალბი; // არის თუ არა სტრიქონი სრული |
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 |
ხოლო (! სერიული); // ლეონარდოს/მიკრო/ნულისთვის |
#დაასრულე თუ |
// ეს არის Trinket 5V 16MHz– ისთვის, შეგიძლიათ წაშალოთ ეს სამი ხაზი, თუ არ იყენებთ Trinket– ს |
#განსაზღვრული (_AVR_ATtiny85_) |
თუ (F_CPU == 16000000) clock_prescale_set (clock_div_1); |
#დაასრულე თუ |
// წვრილმანი სპეციალური კოდის დასასრული |
სერიული.დაწყება (9600); |
ზოლები. დაწყება (); |
ზოლები. ჩვენება (); // ყველა პიქსელის ინიციალიზაცია "გამორთვის" |
თუ (! 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) { |
თარიღი ახლა = rtc.now (); |
Serial.print (ახლა. საათი (), DEC); |
Serial.print (':'); |
Serial.print (now.minute (), DEC); |
Serial.print (':'); |
Serial.print (ახლა. მეორე (), DEC); |
Serial.println (); |
შოუს დრო(); |
lastRtcCheck = მილი (); |
} |
თუ (! digitalRead (2)) { |
lightUpEven (); |
} |
if (stringComplete) { |
Serial.println (inputString); |
if (inputString [0] == 'ლ') { |
Serial.println ("დონე"); |
lightUpEven (); |
} |
if (inputString [0] == 'c') { |
Serial.println ("დროის ჩვენება"); |
შოუს დრო(); |
ზოლები. ჩვენება (); |
} |
if (inputString [0] == '1') { |
Serial.println ("ყველა LED- ების ჩართვა"); |
lightUp (ზოლები. ფერი (255, 255, 255)); |
ზოლები. ჩვენება (); |
} |
if (inputString [0] == '0') { |
Serial.println ("გასუფთავების ზოლები"); |
გასაგებია (); |
ზოლები. ჩვენება (); |
} |
// #3, 255 დააყენებს led ნომერს 3 დონეს 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 (ინტენსივობა, ინტენსივობა, ინტენსივობა)); |
ზოლები. ჩვენება (); |
} |
// #3, 255, 0, 125 დააყენებდა led ნომერს 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 ("G to"); |
სერიული. ბეჭდვა (gIntensity); |
Serial.print ("B to"); |
Serial.println (ინტენსივობა); |
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity)); |
ზოლები. ჩვენება (); |
} |
if (inputString [0] == 's') { |
სიმებიანი ტემპერატურა; |
int საათი, წუთი; |
temp = inputString.substring (1); |
საათი = temp.toInt (); |
int rIndex = inputString.indexOf (',') + 1; |
temp = inputString.substring (rIndex); |
წუთი = temp.toInt (); |
Serial.print ("ჩვენების დრო:"); |
სერიული. ბეჭდვა (საათი); |
Serial.print (":"); |
სერიული. ბეჭდვა (წუთი); |
შოუს დრო (საათი, წუთი); |
დაგვიანება (1000); |
} |
inputString = ""; |
stringComplete = false; |
} |
// დაგვიანება (1000); |
} |
voidserialEvent () { |
ხოლო (Serial.available ()) { |
char inChar = (char) Serial.read (); |
inputString += inChar; |
თუ (inChar == '\ n') { |
stringComplete = true; |
} |
დაგვიანება (1); |
} |
} |
voidclear () { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (0, 0, 0)); |
} |
} |
voidshowTime () { |
თარიღი ახლა = 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)); |
ზოლები. ჩვენება (); |
} |
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)); |
ზოლები. ჩვენება (); |
} |
voidlightUp (uint32_t ფერი) { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, ფერი); |
} |
ზოლები. ჩვენება (); |
} |
voidlightUpEven () { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (დონე , დონე , დონე )); |
} |
ზოლები. ჩვენება (); |
} |
ნახვა rawplywoodClock.ino უმასპინძლა ❤ ერთად GitHub
ნაბიჯი 10: კომპიუტერული ხედვა - კალიბრაცია
მე გავაკეთე შეგნებული არჩევანი, რომ არ გამოვიყენო ვინირი ამ პროექტში. მე რომ მქონდეს, ხის სისქე იგივე იქნებოდა ყველა LED- ის წინ. მაგრამ, რადგან მე მაქვს სხვადასხვა სისქის ხე თითოეული LED- ის წინ და რადგანაც ხის ფერი ძალიან განსხვავდება, LED სიკაშკაშე განსხვავებულია თითოეული LED- ისთვის. იმისათვის, რომ ყველა LED- ები ერთი და იგივე სიკაშკაშის იყოს, მე შევიმუშავე მშვენიერი ხრიკი.
მე დავწერე დამუშავების კოდი (GitHub– ზე), რომელიც იღებს საათის ფოტოს და თავის მხრივ აანალიზებს თითოეული LED– ის სიკაშკაშეს. შემდეგ იცვლება თითოეული LED- ის სიმძლავრე, რათა მათ ჰქონდეთ იგივე სიკაშკაშე, როგორც ყველაზე დაბალ LED. ახლა, მე ვიცი, რომ ეს ზედმეტია, მაგრამ სურათის დამუშავება ძალიან სახალისოა! და, მე იმედი მაქვს, რომ განვავითარებ კალიბრაციის კოდს, როგორც ბიბლიოთეკას.
თქვენ შეგიძლიათ ნახოთ LED სიკაშკაშე კალიბრაციამდე და მის შემდეგ ფოტოებში.
calibrateDispllay.pde
იმპორტი დამუშავება. ვიდეო.*; |
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; |
ხანგრძლივი ledIntensity; |
int ledPower; |
long targetIntensity = 99999999; |
voidsetup () { |
შესრულებულია = newint [numLed]; |
numPixelsInLed = newint [numLed]; |
ledIntensity = newlong [numLed]; |
ledPower = newint [numLed]; |
for (int i = 0; i <numLed; i ++) { |
ledPower = 255; |
} |
printArray (Serial.list ()); |
სიმებიანი portName = Serial.list () [31]; |
myPort = newSerial (ეს, portName, 9600); |
ზომა (640, 480); |
ვიდეო = newCapture (ეს, სიგანე, სიმაღლე); |
ვიდეო. დაწყება (); |
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, რაოდენობა)*100+1; |
} |
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> მისაღები შეცდომა) { |
ledPower [ledNum] += ძალა (0.75, runNumber)*100 +1; |
} |
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= მისაღები შეცდომა) { |
შესრულებულია [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)); |
} |
სიმებიანი imageName = "მონაცემები/"; |
imageName+= str (ledNum); |
imageName += "_ led.jpg"; |
saveFrame (imageName); |
სიმებიანი 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); |
loadPixels (); |
ledIntensity [ledNum] = 0; |
numPixelsInLed [ledNum] = 0; |
for (int x = 0; x <სიგანე; x ++) { |
for (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 ++; |
if (ledNum == numLed) { |
int donezo = 0; |
for (int i = 0; i <numLed; i ++) { |
გაკეთებული += შესრულებული ; |
} |
if (donezo == numLed) { |
println ("შესრულებულია"); |
for (int i = 0; i <numLed; i ++) { |
ამობეჭდვა (i); |
ამობეჭდვა ("\ t"); |
println (ledPower ); |
} |
ბეჭდვა ("int დონე ["); |
ბეჭდვა (ledNum); |
ამობეჭდვა ("] = {"); |
for (int i = 0; i <numLed-1; i ++) { |
ბეჭდვა (ledPower ); |
ბეჭდვა (','); |
} |
ბეჭდვა (ledPower [numLed -1]); |
println ("};"); |
lightUpEven (); |
ხოლო (ჭეშმარიტი); |
} |
ბეჭდვა ("სამიზნე ინტენსივობა:"); |
თუ (runNumber == 0) { |
targetIntensity -= 1; |
} |
println (სამიზნე ინტენსივობა); |
ledNum = 0; |
runNumber ++; |
} |
} |
} |
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // ფერების მიღება პიქსელებიდან int- ის სახით |
aOrg = (ეს პიქსელი >> 24) & 0xFF; // ჩვენ გვჭირდება გადატანა და ნიღაბი თითოეული კომპონენტის მარტო მისაღებად |
rOrg = (ეს პიქსელი >> 16) & 0xFF; // ეს უფრო სწრაფია ვიდრე წითელი (), მწვანე (), ლურჯი () გამოძახება |
gOrg = (ეს პიქსელი >> 8) & 0xFF; |
bOrg = ეს პიქსელი & 0xFF; |
} |
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // ფერების მიღება პიქსელებიდან int- ის სახით |
aDark = (ეს პიქსელი >> 24) & 0xFF; // ჩვენ გვჭირდება გადატანა და ნიღაბი თითოეული კომპონენტის მარტო მისაღებად |
rDark = (ეს პიქსელი >> 16) & 0xFF; // ეს უფრო სწრაფია ვიდრე წითელი (), მწვანე (), ლურჯი () გამოძახება |
gDark = (ეს პიქსელი >> 8) & 0xFF; |
bDark = thisPixel & 0xFF; |
} |
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // ფერების მიღება პიქსელებიდან int- ის სახით |
aLed = (ეს პიქსელი >> 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; // ჩვენ ვფუთავთ ოთხივე კომპოზიციას ერთ ინტეგრაციაში |
g = g << 8; // ასე რომ ჩვენ გვჭირდება მათი ადგილების გადატანა |
ფერი argb = a | რ | გ | ბ; // ორობითი "ან" ოპერაცია ამატებს მათ ყველა ერთ int |
pixelArray [x+y*pixelsWidth] = argb; // ბოლოსდაბოლოს ჩვენ ჩავრთეთ int ფერით პიქსელებში |
} |
rawcalibrateDispllay.pde- ის ნახვა GitHub– ით
ნაბიჯი 11: გამოყოფის შენიშვნები
ხაფანგები, რომელთა თავიდან აცილებაა:
* ხეზე იღებ იმას, რასაც იხდი. ასე რომ, მიიღეთ კარგი ხარისხის ხე. არყის პლაივუდი კარგი არჩევანია; ნებისმიერი მსუბუქი მყარი ხე ასევე კარგად გააკეთებს. შეშის ფასი შევიმცირე და ვნანობ ჩემს გადაწყვეტილებას.
* ჯობია გაბურღოთ ნაკლები ვიდრე მეტი. რამდენიმე ხვრელი ძალიან ღრმად წავიდა ჩემი ნაჭრისთვის. და ეპოქსია გამოჩნდება წინა სახეზე. ეს ძალიან შესამჩნევია მას შემდეგ რაც შეამჩნევთ.
* გამოიყენეთ ბურთი ბოლომდე საბურღი ნაცვლად სწორი ბოლოს. მე არ მაქვს ექსპერიმენტი ბურთის ბოლოში, მაგრამ დარწმუნებული ვარ, რომ შედეგები ბევრად უკეთესი იქნება.
მე ვფლირტაობ იდეის გაყიდვის შესახებ Etsy ან tindie. მე ნამდვილად მადლობელი ვიქნები, თუ თქვენ კომენტარს გააკეთებთ ქვემოთ, თუ ფიქრობთ, რომ აზრი აქვს:)
გირჩევთ:
Nixie– ს საათი არდუინოსთან ერთად MDF ხის ყუთში: 11 ნაბიჯი (სურათებით)
გააკეთეთ ნიქსის საათი არდუინოსთან ერთად MDF- ის ხის კოლოფში: ამ ინსტრუქციაში მე ვაჩვენებ, თუ როგორ უნდა გააკეთოთ ნიქსის საათი არდუინოსთან ერთად წრიული გზით, რაც შეიძლება მარტივად. ყველა მათგანი მოთავსებულია MDF- ის ხის საქმეში. დასრულების შემდეგ, საათი ჰგავს პროდუქტს: კარგი გარეგნობის და კომპაქტურად მყარად. მოდი
LED განათებული ხის საქორწინო საათი: 8 ნაბიჯი (სურათებით)
LED განათებული ხის საქორწინო საათი: მე დავიწყე ეს პროექტი, რათა გამეკეთებინა უნიკალური, უნიკალური საქორწილო საათი ჩემი დისა და რძლისთვის. უნდოდათ გაეკეთებინათ ის, რისი განათებაც შეეძლოთ და აჩვენონ თავიანთი ქორწილის დღის გარკვეული ასპექტი კიდევ დიდი ხნის განმავლობაში. გაიარა ბევრი დიზაინი
ხის LED საათი: 5 ნაბიჯი (სურათებით)
ხის LED საათი: ხის LED საათი გარეგნულად მოსაწყენ ხის ყუთს ჰგავს, იმ განსხვავებით, რომ დრო მის წინ ანათებს. ნაცრისფერი ნაცრისფერი პლასტმასის ნაცვლად, თქვენ გაქვთ ლამაზი ხის ნაჭერი. ის კვლავ ინარჩუნებს თავის ყველა ფუნქციას, მათ შორის
C51 4 ბიტიანი ელექტრონული საათი - ხის საათი: 15 ნაბიჯი (სურათებით)
C51 4 ბიტიანი ელექტრონული საათი - ხის საათი: ამ შაბათ -კვირას მქონდა თავისუფალი დრო, ასე რომ წინ წავიდა და ავაწყვე 2.40 აშშ დოლარი, 4 ბიტიანი DIY ელექტრონული ციფრული საათი, რომელიც ვიყიდე AliExpress– ისგან ცოტა ხნის წინ
80 -იანი წლების სტილი დნობის ციფრული "დალი" საათი: 7 ნაბიჯი (სურათებით)
80 -იანი წლების სტილის დნობის ციფრული "დალის" საათი: ეს ინსტრუქცია გიჩვენებთ თუ როგორ უნდა ავაშენოთ 80 -იანი წლების სტილის ციფრული " დალი " საათი გამდნარი ციფრებით. მე პირველად შევხვდი ამ სტილის საათს Apple Macintosh– ში, როდესაც მე 80 – იან წლებში ბავშვი ვიყავი. ეს ინსტრუქცია გვიჩვენებს ხელახლა შექმნის ჩემს მცდელობას