Мазмұны:

Ағаш жарықдиодты сағат - аналогтық стиль: 11 қадам (суреттермен)
Ағаш жарықдиодты сағат - аналогтық стиль: 11 қадам (суреттермен)

Бейне: Ағаш жарықдиодты сағат - аналогтық стиль: 11 қадам (суреттермен)

Бейне: Ағаш жарықдиодты сағат - аналогтық стиль: 11 қадам (суреттермен)
Бейне: Жаңа танк 500 | Land Cruiser 300 -ге қарағанда сәнді болып шықты!? 2024, Шілде
Anonim
Ағаш жарықдиодты сағат - аналогтық стиль
Ағаш жарықдиодты сағат - аналогтық стиль

Бұл аналогты ағаштан жасалған жарықдиодты сағат. Білмеймін, неге бұлардың бірін бұрын көрмедім.. цифрлық түрлері өте жиі кездесетініне қарамастан. Әйтеуір, міне, кеттік!

1 -қадам:

Кескін
Кескін
Кескін
Кескін

Фанерлік сағат жобасы CNC маршрутизаторының қарапайым стартерлік жобасы ретінде басталды. Мен Интернеттегі қарапайым жобаларды қарап, осы шамды таптым (жоғарыдағы сурет). Мен сондай -ақ ағаш шпоннан жарқырайтын сандық сағаттарды көрдім (жоғарыдағы сурет). Осылайша, екі жобаны біріктіру айқын идея болды. Мен өзімді сынап көруге тырыстым, мен бұл жобада шпонды емес, ағаштың бір бөлігін қолдануды шештім.

2 -қадам: Дизайн

Дизайн
Дизайн
Дизайн
Дизайн

Мен сағатты Inkscape -те жасадым (жоғарыдағы сурет). Дизайн таңдау бойынша өте қарапайым. Мен сымдарды іздеуге қарсы шешім қабылдадым, себебі дәл осы кезде радиалды немесе периметрлік сыммен жүргім келетініне сенімді емес едім. (Мен ақырында периметрлік сыммен жүруді шештім.) Бес минуттық дәлдікпен минут пен сағатты көрсетуге арналған кішкене дөңгелек тесіктердің әрқайсысына бір неопиксель кіреді. Ортасындағы шеңбер электрониканы орналастыру үшін шығарылады.

3 -қадам: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Мен MasterCAM -да саймандар жолдарын жобаладым және 3/4 дюймдік фанерадан сағатты шығару үшін техноРоутер қолдандым. Мен бұл үшін 15 «x15» бөлігін қолданамын, ең аз шығынмен. Алаяқтық - ағашты сындырмай, мүмкіндігінше ағаштың көп бөлігін сыртқа шығару. 0,05 «-0,1» қалдыру-жеңіл ағаш үшін жақсы таңдау. Егер сіз сенімді болмасаңыз, онда ағашты көбірек қалдырған дұрыс, себебі сіз әрқашан басқа бетті тегістей аласыз. Мен кейбір бөліктерден тым көп ағашты алып тастадым, бірақ шүкір, нәтиже тым көп зардап шекпейді.

CNC кіре алмайтын пайдаланушыларға арналған ескерту:

Бұл жобаны бұрғылау машинасымен оңай жасауға болады. Сіз тоқтауды негізде шамамен 0,1 дюймдік ағаш қалатын жерге қоюыңыз керек. Сіз дәл болуыңыз керек, бірақ тым дәл емес. Ақыр соңында, барлық светодиодтардың жанғанын ешкім көрмейді. сол уақытта, сондықтан сіз аздап еңістен құтыла аласыз.

4 -қадам: электроника

Электроника
Электроника
Электроника
Электроника
Электроника
Электроника

Электроника өте қарапайым. 24 неопиксель бар, он екі сағатты және он екі минутты көрсетуге арналған, бес минуттық дәлдікпен. Arduino pro mini неопиксельдерді басқарады және нақты уақытты DS3231 модулі арқылы алады (RTC). RTC модулінде сақтық көшірме ретінде монета ұяшығы бар, сондықтан ол қуат өшірілгенде де уақыт жоғалтпайды.

Материал:

Arduino pro mini (немесе кез келген басқа Arduino)

DS3231 ажырату тақтасы

Жеке сыну тақталарындағы неопиксельдер

5 -қадам: электрониканы құрастыру

Электроника құрастыру
Электроника құрастыру
Электроника құрастыру
Электроника құрастыру
Электроника құрастыру
Электроника құрастыру
Электроника құрастыру
Электроника құрастыру

Мен неопиксельдерді жіппен жалғадым, алғашқы он екі светодиод үшін 2,5 дюймдік сымды, ал келесі он екі сым үшін төрт дюймдік сымды қолдандым. Мен сымның ұзындығын сәл азырақ қолдана алар едім. Жіпті жасағаннан кейін мен дәнекердің болуын тексеріп, оны сынап көрдім. буындар жақсы болды. Мен барлық светодиодты қосу үшін бір сәттік қосқышты қостым.

6 -қадам: құрғақ жүгіру

Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру
Құрғақ жүгіру

Тәжірибе жасап, светодиодтарды тесіктерге салып, бәрін қосқаннан кейін, мен нәтижеге қанағаттандым. Сондықтан мен алдыңғы бетін сәл сүртіп, ПУ пальто жағып қойдым. Мен кейінірек пальтоны сүртумен аяқтадым, бірақ егер сіз оны эстетикалық тұрғыдан ұнамаса, оны қалдыру жақсы.

7 -қадам: эпоксидті

Эпоксидті
Эпоксидті
Эпоксидті
Эпоксидті

Саңылаулардың ішіндегі жетекші позициясы бар бірнеше тестілеуден кейін, мен жарық диодтары тесіктің соңынан 0,2 дюйм қашықтықта болғанда жақсы талқылауға қол жеткізуге болатынын түсіндім. Әр тесік. Бұл туралы уайымдамаңыз, біз оны кодпен түзетеміз. Бұл мен қолданған бұрғылау ұшының түріне байланысты. Егер мен мұны тағы қайталайтын болсам, тесіктерге шарикті бұрғылау ұшын қолданар едім. Бірақ, қалай болғанда да, қашықтықты алу үшін мен эпоксидті араластырып, әр тесікке аздап құйдым.

8 -қадам: Барлығын біріктіру

Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру
Барлығын біріктіру

Жарық диодтары сағат тілінің 12 сағаттық позициясынан бастап сағат тілінің бағытына қарсы сағат тілінің барлық бағыттары бойынша, содан кейін минут тіліне ауысады, қайтадан сағат тіліне қарсы қозғалады. Бұл біз алдыңғы жағынан қараған кезде жарықдиодты үлгі сағат тілінің бағытымен пайда болады.

Эпоксидті бір сағат емдегеннен кейін мен тағы да эпоксидті салдым. Бұл жолы мен светодиодтарды сымдар мен дәнекерлеу қосылыстарын эпоксидпен жабу үшін саңылауларға диодтарды қойдым. Бұл жарықтың жақсы таралуын қамтамасыз етеді және сымдарды бекітеді.

9 -қадам: код

Код
Код

Код GitHub -те, оны пайдалану үшін өзгертуге болады. Барлық светодиодтарды бір деңгейге қосқанда, жарықтың жарықтығы әр тесікте әр түрлі болады. Бұл тесіктердегі ағаштың әр түрлі қалыңдығына және ағаштың көлеңкесінің айырмашылығына байланысты, сіз көріп отырғаныңыздай, ағаштың түсі менің бөлігімде аздап өзгереді. Жарықтықтың бұл айырмашылығын жою үшін мен жарықтылық деңгейінің матрицасын жасадым. Ал жарық диодтардың жарықтығы төмендеді. Бұл сынақ және қате процесі және бірнеше минутқа созылуы мүмкін, бірақ нәтиже оған тұрарлық.

plywoodClock.ino

// фанера сағаты
// Автор: tinkrmind
// Халықаралық Attribution 4.0 (CC BY 4.0). Сіз еркінсіз:
// Бөлісу - материалды кез келген ортада немесе форматта көшіру және қайта тарату
// Бейімделу - материалды кез келген мақсатта, тіпті коммерциялық тұрғыда да ремикс, түрлендіру және негіздеу.
// Ура!
#қосу
#«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 minutesPixel = 0;
unsignedlong lastRtcCheck;
Жолдың inputString = «»; // кіріс деректерді сақтауға арналған жол
логикалық stringComplete = жалған; // жолдың толық екендігі
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
while (! сериялық); // Леонардо/Микро/Нөл үшін
#endif
// Бұл Trinket 5V 16MHz үшін, егер сіз Trinket қолданбасаңыз, осы үш жолды алып тастай аласыз.
#анықталған болса (_AVR_ATtiny85_)
if (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 -те сіз мына телефонға хабарласар едіңіз:
// 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 now = rtc.now ();
Serial.print (now.hour (), DEC);
Serial.print (':');
Serial.print (now.minute (), DEC);
Serial.print (':');
Serial.print (now.second (), DEC);
Serial.println ();
Көрсетілім уақыты();
lastRtcCheck = millis ();
}
if (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println («Деңгей»);
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println («Уақытты көрсету»);
Көрсетілім уақыты();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println («Барлық жарықдиодты қосу»);
lightUp (жолақ. Түс (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println («Тазалау жолағы»);
анық ();
strip.show ();
}
// #3, 255 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 (қарқындылығы, қарқындылығы, қарқындылығы));
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 -дан»);
Serial.print (rIntensity);
Serial.print («G to»);
Serial.print (gIntensity);
Serial.print («B -ден»);
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
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 («:»);
Сериялық баспа (минут);
showTime (сағат, минут);
кешіктіру (1000);
}
inputString = «»;
stringComplete = жалған;
}
// кешіктіру (1000);
}
voidserialEvent () {
while (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;
minutePixel = (now.minute () / 5) % 12 + 12;
анық ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * деңгей [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (minutesPixel, strip. Color (40 + 40 * деңгей [минутПиксел], 30 + 30 * деңгей [минутПиксел], 20 + 20 * деңгей [минутПиксел]));
strip.setPixelColor (hourPixel, strip. Color (деңгей [hourPixel], деңгей [hourPixel], деңгей [hourPixel]))));
strip.setPixelColor (minutePixel, strip. Color (деңгей [minutesPixel], деңгей [minutesPixel], деңгей [minutesPixel]))));
// lightUp (жолақ. Color (255, 255, 255));
strip.show ();
}
voidshowTime (int сағат, инт минут) {
hourPixel = сағат % 12;
minutePixel = (минут / 5) % 12 + 12;
анық ();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * деңгей [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (minutesPixel, strip. Color (40 + 40 * деңгей [минутПиксел], 30 + 30 * деңгей [минутПиксел], 20 + 20 * деңгей [минутПиксел]));
strip.setPixelColor (hourPixel, strip. Color (деңгей [hourPixel], деңгей [hourPixel], деңгей [hourPixel]))));
strip.setPixelColor (minutePixel, strip. Color (деңгей [minutesPixel], деңгей [minutesPixel], деңгей [minutesPixel]))));
// lightUp (жолақ. Color (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t түсі) {
үшін (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, түс);
}
strip.show ();
}
voidlightUpEven () {
үшін (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color ( деңгейі, деңгейі, деңгейі)));
}
strip.show ();
}

GitHub ❤ ұсынған rawplywoodClock.ino қарау

10 -қадам: Компьютерді көру - калибрлеу

Компьютерлік көру - калибрлеу
Компьютерлік көру - калибрлеу
Компьютерлік көру - калибрлеу
Компьютерлік көру - калибрлеу

Мен бұл жобада шпонды қолданбау туралы саналы түрде шешім қабылдадым. Егер менде болса, ағаштың қалыңдығы барлық светодиодтардың алдында бірдей болар еді. Бірақ, менде әр жарық диодтың алдында ағаштың қалыңдығы әртүрлі болғандықтан және ағаштың түсі де әр түрлі болғандықтан, жарық диодты жарық диодты жарық диодты әр түрлі болады. Барлық светодиодтар бірдей жарықтық болып көрінуі үшін мен керемет трюк ойлап таптым.

Мен сағатты суретке түсіретін кейбір өңдеу кодын жаздым (GitHub -да) және кез келген жарықдиодты жарықтылықты талдайды. Содан кейін ол жарық диодты жарық диодты жарықтандыратын жарық диодты жарық диодты жарық диодты жарық диодты жарық диодты жарықдиодты жарық диодты жарық диодты жарық диодты жарық диодты жарықдиодты жарық диодты жарықдиодты жарық диодты жарық диодты жарықдиодты жарық диодты жарық диодты жарық диодты жарық диодты жарықдиодты жарық диодты жарық диодты жарық диодты жарықдиодты жарық диодты жарық диодты жарық диодты жарық диодты жарық диодты шамасына дейін ауыстырады. Енді мен мұның артық екенін білемін, бірақ суретті өңдеу өте қызықты! Мен калибрлеу кодын кітапхана ретінде дамытамын деп үміттенемін.

Жарықдиодты жарықтылықты калибрлеуге дейін және кейін жоғарыдағы фотолардан көруге болады.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Сериялық myPort;
Бейне түсіру;
numinted final = 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;
PIage біздің кескін;
int runNumber = 0;
int acceptableError = 3;
int орындалды;
int numPixelsInLed;
ұзақ ledIntensity;
int ledPower;
long targetIntensity = 99999999;
voidsetup () {
жасалды = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
үшін (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
Жолдың portName = Serial.list () [31];
myPort = newSerial (бұл, portName, 9600);
өлшемі (640, 480);
video = newCapture (бұл, ені, биіктігі);
video.start ();
noStroke ();
тегіс ();
кешіктіру (1000); // Сериялық порт ашылғанша күтіңіз
}
voiddraw () {
if (video.available ()) {
егер (орындалды [ledNum] == 0) {
clearDisplay ();
кешіктіру (1000);
video.read ();
сурет (бейне, 0, 0, ені, биіктігі); // Экранда веб -камераның бейнесін салыңыз
saveFrame («data/no_leds.jpg»);
if (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> məqbulError) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> məqbulError) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= мақұлданатын қате) {
орындалды [ledNum] = 1;
басып шығару («Led»);
басып шығару (ledNum);
басып шығару («дайын»);
}
егер (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
if (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 жолы = «data/org»;
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;
үшін (int x = 0; x <ені; x ++) {
үшін (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 ++;
егер (ledNum == numLed) {
int donezo = 0;
үшін (int i = 0; i <numLed; i ++) {
donezo += орындалды ;
}
егер (dozo == numLed) {
println («ДАЙЫН»);
үшін (int i = 0; i <numLed; i ++) {
басып шығару (i);
басып шығару («\ t»);
println (ledPower );
}
басып шығару («int level [»);
басып шығару (ledNum);
басып шығару («] = {»);
үшін (int i = 0; i <numLed-1; i ++) {
басып шығару (ledPower );
басып шығару (',');
}
басып шығару (ledPower [numLed -1]);
println («};»);
lightUpEven ();
while (true);
}
басып шығару («Мақсатты қарқындылық:»);
егер (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelWidth]; // түстерді пиксельдерден int ретінде алу
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*pixelWidth]; // түстерді пиксельдерден int ретінде алу
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*pixelWidth]; // түстерді пиксельдерден int ретінде алу
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 композиторды бір int ішіне жинаймыз
g = g << 8; // сондықтан оларды өз орындарына ауыстыру керек
түсі argb = a | r | г | б; // екілік «немесе» операциясы олардың барлығын int -ға қосады
pixelArray [x+y*pixelWidth] = argb; // ақырында біз int түстерін пиксельге қоямыз
}

GitHub ❤ арқылы орналастырылған rawcalibrateDispllay.pde қарау

11 -қадам: қоштасу туралы ескертулер

Қауіпсіздікке жол бермеу үшін:

* Ағашпен сіз төлейтін нәрсені аласыз. Сонымен, сапалы ағаш алыңыз. Қайыңнан жасалған фанера - жақсы таңдау; кез келген жеңіл қатты ағаш жақсы жұмыс істейді. Мен ағашты сатып алдым және шешіміме өкіндім.

* Бұрғылауды көп емес, жақсы. Бірнеше тесік менің кесегім үшін тым тереңге кетті. Ал эпоксидті алдыңғы бетте көрінеді. Сіз оны байқаған кезде бірден байқалады.

* Тік ұштың орнына шарикті бұрғылау ұшын қолданыңыз. Мен доптың ұшымен тәжірибе жасамадым, бірақ нәтиже әлдеқайда жақсы болатынына сенімдімін.

Мен оларды Etsy немесе tindie -де сату туралы оймен қоштасамын. Егер сіз түсінікті деп ойласаңыз, төменде түсініктеме берсеңіз, мен өте ризамын:)

Ұсынылған: