Სარჩევი:

ხის LED საათი - ანალოგური სტილი: 11 ნაბიჯი (სურათებით)
ხის LED საათი - ანალოგური სტილი: 11 ნაბიჯი (სურათებით)

ვიდეო: ხის LED საათი - ანალოგური სტილი: 11 ნაბიჯი (სურათებით)

ვიდეო: ხის LED საათი - ანალოგური სტილი: 11 ნაბიჯი (სურათებით)
ვიდეო: ეკჰარტ ტოლე - "აწმყოს ძალა" - აუდიო წიგნი - Audible Read Along 2024, ივლისი
Anonim
ხის LED საათი - ანალოგური სტილი
ხის LED საათი - ანალოგური სტილი

ეს არის ანალოგი სტილის ხის LED საათი. არ ვიცი რატომ არ მინახავს აქამდე ერთი.. მიუხედავად იმისა, რომ ციფრული ტიპები ძალიან გავრცელებულია. ყოველ შემთხვევაში, ჩვენ მივდივართ!

Ნაბიჯი 1:

გამოსახულება
გამოსახულება
გამოსახულება
გამოსახულება

პლაივუდის საათის პროექტი დაიწყო როგორც მარტივი დამწყები პროექტი CNC როუტერისთვის. მე ვუყურებდი მარტივ პროექტებს ინტერნეტში და ვიპოვე ეს ნათურა (სურათი ზემოთ). მე ასევე მქონდა ნანახი ციფრული საათები, რომლებიც ბრწყინავს ხის საფარით (სურათი ზემოთ). ამრიგად, ორი პროექტის გაერთიანება აშკარა იდეა იყო. საკუთარი თავის გამოწვევის მიზნით, გადავწყვიტე, რომ ამ პროექტისთვის არ გამომეყენებინა ვინირი, არამედ მხოლოდ ხის ნაჭერი.

ნაბიჯი 2: დიზაინი

დიზაინი
დიზაინი
დიზაინი
დიზაინი

მე შევქმენი საათი Inkscape– ში (სურათი ზემოთ). დიზაინი ძალიან მარტივია არჩევანის მიხედვით. მე გადავწყვიტე მავთულხლართების კვალის გადაადგილების წინააღმდეგ, რადგან ამ დროს მე არ ვიყავი დარწმუნებული, მინდოდა თუ არა რადიალური ან პერიმეტრის გაყვანილობა. (მე გადავწყვიტე პერიმეტრის გაყვანილობა საბოლოოდ.) თითო ნეოპიქსელი მიდის თითოეულ პატარა წრიულ ხვრელში წუთისა და საათის დროის საჩვენებლად, ხუთწუთიანი სიზუსტით. შუაში არსებული წრე გაივლის ელექტრონიკის შესანახად.

ნაბიჯი 3: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
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. მე ნამდვილად მადლობელი ვიქნები, თუ თქვენ კომენტარს გააკეთებთ ქვემოთ, თუ ფიქრობთ, რომ აზრი აქვს:)

გირჩევთ: