Мазмұны:
- 1 -қадам:
- 2 -қадам: Дизайн
- 3 -қадам: CNCing
- 4 -қадам: электроника
- 5 -қадам: электрониканы құрастыру
- 6 -қадам: құрғақ жүгіру
- 7 -қадам: эпоксидті
- 8 -қадам: Барлығын біріктіру
- 9 -қадам: код
- 10 -қадам: Компьютерді көру - калибрлеу
- 11 -қадам: қоштасу туралы ескертулер
Бейне: Ағаш жарықдиодты сағат - аналогтық стиль: 11 қадам (суреттермен)
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:27
Бұл аналогты ағаштан жасалған жарықдиодты сағат. Білмеймін, неге бұлардың бірін бұрын көрмедім.. цифрлық түрлері өте жиі кездесетініне қарамастан. Әйтеуір, міне, кеттік!
1 -қадам:
Фанерлік сағат жобасы CNC маршрутизаторының қарапайым стартерлік жобасы ретінде басталды. Мен Интернеттегі қарапайым жобаларды қарап, осы шамды таптым (жоғарыдағы сурет). Мен сондай -ақ ағаш шпоннан жарқырайтын сандық сағаттарды көрдім (жоғарыдағы сурет). Осылайша, екі жобаны біріктіру айқын идея болды. Мен өзімді сынап көруге тырыстым, мен бұл жобада шпонды емес, ағаштың бір бөлігін қолдануды шештім.
2 -қадам: Дизайн
Мен сағатты Inkscape -те жасадым (жоғарыдағы сурет). Дизайн таңдау бойынша өте қарапайым. Мен сымдарды іздеуге қарсы шешім қабылдадым, себебі дәл осы кезде радиалды немесе периметрлік сыммен жүргім келетініне сенімді емес едім. (Мен ақырында периметрлік сыммен жүруді шештім.) Бес минуттық дәлдікпен минут пен сағатты көрсетуге арналған кішкене дөңгелек тесіктердің әрқайсысына бір неопиксель кіреді. Ортасындағы шеңбер электрониканы орналастыру үшін шығарылады.
3 -қадам: 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 -де сату туралы оймен қоштасамын. Егер сіз түсінікті деп ойласаңыз, төменде түсініктеме берсеңіз, мен өте ризамын:)
Ұсынылған:
Ағаш жарықдиодты сағат: 5 қадам (суреттермен)
Ағаш жарықдиодты сағат: ағаштан жасалған жарықдиодты сағат скучно ағаш қорапқа ұқсайды, тек уақыт алдыңғы жағында жарқырап тұрады. Қарауға болатын сұр пластиктің орнына сізде әдемі ағаш бар. Ол өзінің барлық функцияларын сақтайды, соның ішінде
Микроскоптарға арналған жарықдиодты жарықдиодты жарықдиодты жарықдиодты тақта!: 6 қадам (суреттермен)
Микроскоптар үшін DIY жарықдиодты жарықдиодты PCB! Мен электрониканы қолдануға арналған екінші микроскопты сатып алдым және сіз
C51 4 бит электронды сағат - ағаш сағат: 15 қадам (суреттермен)
C51 4 бит электронды сағат - ағаштан жасалған сағат: демалыс күндері бос уақыт болды, сондықтан мен осы уақытқа дейін AliExpress -тен сатып алған 2,40 долларлық 4 биттік электронды цифрлық сағатты жинадым
Ағаш Венециандық Соқыр Никси Сағат Ақаның кішкентай әпкесі: 7 қадам (суреттермен)
Ағаш Венециандық Соқыр Никси сағаты Ақа Сараның кішкентай әпкесі: Мен жақында мен қолданатын терезелерге сыймайтын тым үлкен венециандық ағаш перделерді алдым. Оларды мұқият қайта құрылымдаудан кейін менде көптеген кесілген бөліктер қалды және оларды болашақта біраз уақыт сақтадым
Ағаш тісті сағат: 9 қадам (суреттермен)
Ағаш беріліс сағаты: Мен сағатты бейнеге қостым. Мен сағат тіліне қарама -қарсы терезелерді оюмен жұмыс жасаймын. Мен жасағаннан кейін суреттерді және/немесе бейнені жүктеймін. Мен ағаш өңдеумен бірнеше жылдан бері айналысамын. Мен жасай алатын идеяны жақсы көремін