Turinys:
- 1 žingsnis:
- 2 žingsnis: dizainas
- 3 žingsnis: CNCing
- 4 žingsnis: Elektronika
- 5 žingsnis: Elektronikos surinkimas
- 6 žingsnis: sausas važiavimas
- 7 žingsnis: epoksidinė
- 8 žingsnis: surinkite viską kartu
- 9 žingsnis: kodas
- 10 žingsnis: kompiuterio matymas - kalibravimas
- 11 žingsnis: pastabos
Video: Medinis LED laikrodis - analoginis stilius: 11 žingsnių (su paveikslėliais)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:49
Tai analoginio stiliaus medinis LED laikrodis. Nežinau, kodėl vieno iš jų nemačiau anksčiau, nors skaitmeniniai tipai yra labai paplitę. Anyhoo, štai!
1 žingsnis:
Faneros laikrodžio projektas prasidėjo kaip paprastas pradinis CNC maršrutizatoriaus projektas. Žiūrėjau į paprastus projektus internete ir radau šią lempą (vaizdas viršuje). Aš taip pat mačiau skaitmeninius laikrodžius, kurie šviečia per medžio lukštą (vaizdas viršuje). Taigi, derinti du projektus buvo akivaizdi idėja. Siekdama mesti sau iššūkį, nusprendžiau šiam projektui nenaudoti faneros, o tik medžio gabalo.
2 žingsnis: dizainas
Aš sukūriau laikrodį „Inkscape“(vaizdas viršuje). Dizainas yra labai paprastas pasirinkus. Nusprendžiau netaikyti laidų pėdsakų, nes šiuo metu nebuvau tikras, ar noriu naudoti radialinius ar perimetrinius laidus. (Nusprendžiau pagaliau pereiti prie perimetro laidų.) Į kiekvieną mažą apskritą skylutę įeina po vieną neopikselį, kuris rodo minučių ir valandų laiką penkių minučių tikslumu. Apskritimas viduryje bus nukreiptas taip, kad tilptų elektronika.
3 žingsnis: CNCing
Aš sukūriau įrankių takus „MasterCAM“ir naudoju technoRouter, kad išstumčiau laikrodį iš 3/4 colių faneros. Tam naudoju 15 x 15 colių gabalą, su minimaliu švaistymu. Apgaulė yra išleisti kuo daugiau medienos, nesulaužant medienos. Palikti 0,05 "-0,1" yra geras pasirinkimas šviesiai medienai. Jei nesate tikri, geriau palikti daugiau medienos, nes visada galite šlifuoti kitą veidą. Galų gale iš kai kurių dalių pašalinau šiek tiek per daug medienos, bet, laimei, rezultatai dėl to per daug nenukenčia.
Pastaba vartotojams, neturintiems prieigos prie CNC:
Šį projektą galima lengvai atlikti naudojant gręžimo presą. Jums tereikia nustatyti sustojimą toje vietoje, kur bazėje lieka apie 0,1 colio medienos. Turėsite būti tikslūs, bet ne per daug tikslūs. Galų gale, idealiu atveju niekas nematys, kaip visi šviesos diodai užsidegs tuo pačiu metu, todėl galite išsisukti su nedideliu nuolydžiu.
4 žingsnis: Elektronika
Elektronika yra gana paprasta. Yra 24 neopikseliai, dvylika-valandoms rodyti, dvylika-minutėms rodyti penkių minučių tikslumu. „Arduino pro mini“valdo neopikselius ir per DS3231 realaus laiko laikrodžio (RTC) modulį gauna tikslų laiką. RTC modulis turi monetos elementą kaip atsarginę kopiją, todėl nepraranda laiko net ir išjungus maitinimą.
Medžiaga:
„Arduino pro mini“(ar bet kuris kitas „Arduino“)
DS3231 pertraukimo plokštė
Neopikseliai atskirose pertraukų lentose
5 žingsnis: Elektronikos surinkimas
Aš prijungiau neopikselius eilute, naudodamas 2,5 colio laidus pirmiesiems dvylika šviesos diodų ir keturių colių laidą kitiems dvylikai. Galėjau naudoti šiek tiek mažesnius laidų ilgius. Padaręs eilutę, išbandžiau ir įsitikinau, kad lydmetalis Sujungimai buvo geri. Pridėjau momentinį jungiklį, kad įjungčiau visus šviesos diodus, kad tik parodyčiau.
6 žingsnis: sausas važiavimas
Eksperimentuodamas, įdėjęs šviesos diodus į skyles ir įjungęs juos visus, buvau patenkintas rezultatais. Taigi šiek tiek nušlifavau priekinį veidą ir uždėjau PU sluoksnį. Galų gale vėliau nušlifavau paltą, tačiau gera idėja jį palikti, jei jums tai nepatinka estetiškai.
7 žingsnis: epoksidinė
Po tam tikro bandymo su švino padėtimi skylėse supratau, kad geriausia diskusija pasiekiama, kai šviesos diodai yra maždaug 0,2 colio atstumu nuo skylės galo. Kai patys tai išbandysite, šviesos diodų ryškumas bus labai skirtingas kiekviena skylė. Nesijaudinkite dėl to; mes ją pataisysime kodu. Taip yra dėl mano naudojamo grąžto tipo. Jei tai padaryčiau dar kartą, skylėms naudočiau rutulinį grąžtą Bet bet kokiu atveju, norėdamas gauti atstumą, sumaišiau epoksidą ir šiek tiek įdėjau į kiekvieną skylę.
8 žingsnis: surinkite viską kartu
Šviesos diodai bus dedami pradedant nuo 12 valandos rodyklės padėties, judant prieš laikrodžio rodyklę per visas valandos rodyklės pozicijas, o paskui į minutinę rodyklę, vėl judant nuo 60 minučių žymos, judančios prieš laikrodžio rodyklę. Taip yra todėl, kad kai žiūrime iš priekio, LED modelis rodomas pagal laikrodžio rodyklę.
Po to, kai epoksidinė medžiaga valandą sukietėjo, aš įdėjau dar šiek tiek epoksido. Šį kartą šviesos diodus įdėjau į skyles, įsitikindamas, kad laidai ir litavimo jungtys yra padengti epoksidine medžiaga. Tai užtikrina gerą šviesos sklaidą ir apsaugo laidus.
9 žingsnis: kodas
Kodas yra „GitHub“, nedvejodami pakeiskite jį savo reikmėms. Kai įjungiate visus šviesos diodus į tą patį lygį, kiekvienoje skylėje sklindančios šviesos ryškumas bus labai skirtingas. Taip yra dėl skirtingo medžio storio skylėse ir medžio atspalvio skirtumo, kaip matote, medžio spalva mano kūrinyje labai skiriasi. Norėdami ištaisyti šį ryškumo skirtumą, sukūriau LED šviesumo lygių matricą. Ir sumažino šviesesnių šviesos diodų ryškumą. Tai bandymų ir klaidų procesas ir gali užtrukti kelias minutes, tačiau rezultatai to verti.
plywoodClock.ino
// Faneros laikrodis |
// Autorius: tinkrmind |
// „Attribution 4.0 International“(CC BY 4.0). Galite laisvai: |
// Dalintis - kopijuoti ir platinti medžiagą bet kokia laikmena ar formatu |
// Pritaikyti - remiksuoti, transformuoti ir kurti medžiagą bet kokiu tikslu, net ir komerciškai. |
// Hurra! |
#įtraukti |
#include "RTClib.h" |
RTC_DS3231 rtc; |
#include "Adafruit_NeoPixel.h" |
#ifdef _AVR_ |
#įtraukti |
#endif |
#definePIN6 |
Adafruit_NeoPixel strip = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800); |
int hourPixel = 0; |
int minutePikselis = 0; |
unsignedlong lastRtcCheck; |
Eilutės įvestisString = ""; // eilutė gaunamiems duomenims laikyti |
loginė eilutėComplete = false; // ar eilutė baigta |
int lygis [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 (! Serial); // Leonardo/Micro/Zero |
#endif |
// Tai skirta „Trinket 5V 16MHz“, galite pašalinti šias tris eilutes, jei nenaudojate „Trinket“ |
#if apibrėžta (_AVR_ATtiny85_) |
if (F_CPU == 16000000) clock_prescale_set (clock_div_1); |
#endif |
// Paminklo specialaus kodo pabaiga |
Serial.begin (9600); |
strip.begin (); |
strip.show (); // Inicijuokite visus taškus į „išjungtą“ |
if (! rtc.begin ()) { |
Serial.println ("Nepavyko rasti RTC"); |
tuo tarpu (1); |
} |
pinMode (2, INPUT_PULLUP); |
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))); |
if (rtc.lostPower ()) { |
Serial.println ("RTC dingo energija, leidžia nustatyti laiką!"); |
// kita eilutė nustato RTC datą ir laiką, kai buvo sudarytas šis eskizas |
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))); |
// Ši eilutė nustato RTC su konkrečia data ir laiku, pavyzdžiui, nustatyti |
// 2014 m. Sausio 21 d. 3 val. Skambintumėte: |
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0)); |
} |
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0)); |
// lightUpEven (); |
// while (1); |
lastRtcCheck = 0; |
} |
voidloop () { |
if (millis () - lastRtcCheck> 2000) { |
DateTime dabar = rtc.now (); |
Serijinis atspaudas (now.hour (), DEC); |
Serial.print (':'); |
Serijinis atspaudas (dabar.minutė (), DEC); |
Serial.print (':'); |
Serial.print (dabar.second (), DEC); |
Serial.println (); |
pasirodymas(); |
lastRtcCheck = milis (); |
} |
if (! digitalRead (2)) { |
lightUpEven (); |
} |
if (stringComplete) { |
Serial.println (inputString); |
if (inputString [0] == 'l') { |
Serial.println („Lygis“); |
lightUpEven (); |
} |
if (inputString [0] == 'c') { |
Serial.println („Rodomas laikas“); |
pasirodymas(); |
strip.show (); |
} |
if (inputString [0] == '1') { |
Serial.println („Visų šviesos diodų įjungimas“); |
„lightUp“(juostelė. Spalva (255, 255, 255)); |
strip.show (); |
} |
if (inputString [0] == '0') { |
Serial.println („Valymo juosta“); |
aišku (); |
strip.show (); |
} |
// #3, 255 nustatytų 3 skaičių į 255, 255, 255 lygį |
if (inputString [0] == '#') { |
Styginių temperatūra; |
temp = inputString.substring (1); |
int pixNum = temp.toInt (); |
temp = inputString.substring (inputString.indexOf (',') + 1); |
int intensyvumas = temp.toInt (); |
Serial.print („Nustatymas“); |
Serial.print (pixNum); |
Serial.print ("iki lygio"); |
Serial.println (intensyvumas); |
strip.setPixelColor (pixNum, strip. Color (intensyvumas, intensyvumas, intensyvumas)); |
strip.show (); |
} |
// #3, 255, 0, 125 nustatytų 3 skaičių iki 255, 0, 125 lygio |
if (inputString [0] == '$') { |
Styginių temperatūra; |
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 („Nustatymas“); |
Serial.print (pixNum); |
Serial.print („R“); |
Serial.print (rIntensity); |
Serial.print („G“); |
Serial.print (gIntensity); |
Serial.print (nuo „B iki“); |
Serial.println (bIntensity); |
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity)); |
strip.show (); |
} |
if (inputString [0] == 's) {{ |
Styginių temperatūra; |
int valanda, minutė; |
temp = inputString.substring (1); |
valanda = temp.toInt (); |
int rIndex = inputString.indexOf (',') + 1; |
temp = inputString.substring (rIndex); |
minutė = temp.toInt (); |
Serial.print ("Rodomas laikas:"); |
Serijinis atspaudas (valanda); |
Serial.print (":"); |
Serial.print (minutė); |
showTime (valanda, minutė); |
vėlavimas (1000); |
} |
inputString = ""; |
stringComplete = false; |
} |
// uždelsimas (1000); |
} |
voidserialEvent () { |
while (Serial.available ()) { |
char inChar = (char) Serial.read (); |
inputString += inChar; |
jei (inChar == '\ n') { |
stringComplete = tiesa; |
} |
uždelsimas (1); |
} |
} |
voidclear () { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (0, 0, 0)); |
} |
} |
voidshowTime () { |
DateTime dabar = rtc.now (); |
hourPixel = dabar.valanda () % 12; |
minutePixel = (dabar.minute () / 5) % 12 + 12; |
aišku (); |
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * lygis [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel])); |
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * lygis [minutePixel], 30 + 30 * level [minutePixel], 20 + 20 * level [minutePixel])); |
strip.setPixelColor (hourPixel, strip. Color (lygis [valandaPikselis], lygis [valandaPikselis], lygis [valandaPikselis])); |
strip.setPixelColor (minutePixel, strip. Color (level [minutePixel], level [minutePixel], level [minutePixel])); |
// lightUp (strip. Color (255, 255, 255)); |
strip.show (); |
} |
voidshowTime (vid. valanda, vid. minutė) { |
hourPixel = valanda % 12; |
minutePixel = (minutė / 5) % 12 + 12; |
aišku (); |
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * lygis [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel])); |
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * lygis [minutePixel], 30 + 30 * level [minutePixel], 20 + 20 * level [minutePixel])); |
strip.setPixelColor (hourPixel, strip. Color (level [hourPixel], level [hourPixel], level [hourPixel])); |
strip.setPixelColor (minutePixel, strip. Color (level [minutePixel], level [minutePixel], level [minutePixel])); |
// lightUp (strip. Color (255, 255, 255)); |
strip.show (); |
} |
voidlightUp (uint32_t spalva) { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, spalva); |
} |
strip.show (); |
} |
voidlightUpEven () { |
for (uint16_t i = 0; i <strip.numPixels (); i ++) { |
strip.setPixelColor (i, strip. Color (lygis , lygis , lygis )); |
} |
strip.show (); |
} |
peržiūrėkite rawplywoodClock.ino, kurį su ❤ priglobia „GitHub“
10 žingsnis: kompiuterio matymas - kalibravimas
Aš sąmoningai nusprendžiau nenaudoti faneros šiame projekte. Jei turėčiau, prieš visus šviesos diodus medžio storis būtų buvęs vienodas. Bet kadangi prieš kiekvieną šviesos diodą turiu skirtingo storio medienos ir kadangi medžio spalva taip pat labai skiriasi, kiekvieno šviesos diodo ryškumas yra skirtingas. Kad visi šviesos diodai atrodytų vienodo ryškumo, sugalvojau puikų triuką.
Aš parašiau tam tikrą apdorojimo kodą („GitHub“), kuris nufotografuoja laikrodį ir paeiliui analizuoja kiekvieno šviesos diodo ryškumą. Tada kiekvienos šviesos diodo galia keičiama, kad būtų užtikrintas toks pat ryškumas kaip ir silpniausio šviesos diodo. Dabar žinau, kad tai per daug, bet vaizdų apdorojimas yra labai smagus! Ir aš tikiuosi sukurti kalibravimo kodą kaip biblioteką.
Aukščiau esančiose nuotraukose galite pamatyti šviesos diodų ryškumą prieš ir po kalibravimo.
calibrateDispllay.pde
importprocessing.video.*; |
importprocessing.serial.*; |
Serijinis myPort; |
Užfiksuoti vaizdo įrašą; |
finalint numLed = 24; |
int ledNum = 0; |
// kad galėtumėte naudoti PxPGetPixelDark (), turite turėti šiuos visuotinius žodžius |
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 priimtinaKlaida = 3; |
int padaryta; |
int numPixelsInLed; |
ilgas ledIntensity; |
int ledPower; |
ilgas targetIntensity = 99999999; |
voidsetup () { |
atlikta = newint [numLed]; |
numPixelsInLed = newint [numLed]; |
ledIntensity = naujas [numLed]; |
ledPower = newint [numLed]; |
už (int i = 0; i <numLed; i ++) { |
ledPower = 255; |
} |
printArray (Serial.list ()); |
Eilutės portName = Serial.list () [31]; |
myPort = newSerial (tai, uosto pavadinimas, 9600); |
dydis (640, 480); |
video = newCapture (tai, plotis, aukštis); |
video.start (); |
noStroke (); |
lygus (); |
vėlavimas (1000); // Palaukite, kol atsidarys nuoseklusis prievadas |
} |
voiddraw () { |
if (video.available ()) { |
jei (padaryta [ledNum] == 0) { |
clearDisplay (); |
vėlavimas (1000); |
video.read (); |
vaizdas (vaizdo įrašas, 0, 0, plotis, aukštis); // Nubrėžkite internetinės kameros vaizdo įrašą ant ekrano |
saveFrame ("data/no_leds.jpg"); |
if (runNumber! = 0) { |
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> priimtina klaida) { |
ledPower [ledNum] -= pow (0,75, runNumber)*100+1; |
} |
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> priimtina klaida) { |
ledPower [ledNum] += pow (0,75, runNumber)*100 +1; |
} |
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= priimtina klaida) { |
padaryta [ledNum] = 1; |
spauda („Led“); |
spausdinti (ledNum); |
spausdinti („padaryta“); |
} |
jei (ledPower [ledNum]> 255) { |
ledPower [ledNum] = 255; |
} |
if (ledPower [ledNum] <0) { |
ledPower [ledNum] = 0; |
} |
} |
setLedPower (ledNum, ledPower [ledNum]); |
vėlavimas (1000); |
video.read (); |
vaizdas (vaizdo įrašas, 0, 0, plotis, aukštis); // Nubrėžkite internetinės kameros vaizdo įrašą ant ekrano |
vėlavimas (10); |
o (myPort.available ()> 0) { |
int inByte = myPort.read (); |
// spausdinti (char (inByte)); |
} |
Styga imageName = "duomenys/"; |
imageName+= str (ledNum); |
imageName += "_ led.jpg"; |
saveFrame (vaizdo pavadinimas); |
String originalImageName = "duomenys/organizacija"; |
originalImageName+= str (ledNum); |
originalImageName += ". jpg"; |
if (runNumber == 0) { |
saveFrame (originalImageName); |
} |
PImage noLedImg = loadImage ("data/no_leds.jpg"); |
PImage ledImg = loadImage (vaizdo pavadinimas); |
PImage originalImg = loadImage (originalImageName); |
noLedImg.loadPixels (); |
ledImg.loadPixels (); |
originalImg.loadPixels (); |
fonas (0); |
loadPixels (); |
ledIntensity [ledNum] = 0; |
numPixelsInLed [ledNum] = 0; |
(int x = 0; x <plotis; x ++) { |
(int y = 0; y <aukštis; y ++) { |
PxPGetPixelDark (x, y, noLedImg.pixels, width); |
PxPGetPixelLed (x, y, ledImg.pikseliai, plotis); |
PxPGetPixelOrg (x, y, originalImg.pixels, width); |
jei ((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] ++; |
} Kitas { |
rTemp = 0; |
gTemp = 0; |
bTemp = 0; |
} |
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pikseliai, plotis); |
} |
} |
ledIntensity [ledNum] /= numPixelsInLed [ledNum]; |
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) { |
targetIntensity = ledIntensity [ledNum]; |
} |
updatePixels (); |
} |
spausdinti (ledNum); |
spausdinti (','); |
spausdinti (ledPower [ledNum]); |
spausdinti (','); |
println (ledIntensity [ledNum]); |
ledNum ++; |
if (ledNum == numLed) { |
int donezo = 0; |
už (int i = 0; i <numLed; i ++) { |
donezo += padaryta ; |
} |
if (donezo == numLed) { |
println („ATLIKTA“); |
už (int i = 0; i <numLed; i ++) { |
spausdinti (i); |
spausdinti ("\ t"); |
println (ledPower ); |
} |
spausdinti ("int level ["); |
spausdinti (ledNum); |
spausdinti ("] = {"); |
už (int i = 0; i <numLed-1; i ++) { |
spausdinti (ledPower ); |
spausdinti (','); |
} |
spausdinti (ledPower [numLed -1]); |
println ("};"); |
lightUpEven (); |
o (tiesa); |
} |
spausdinti („Tikslinis intensyvumas:“); |
if (runNumber == 0) { |
targetIntensity -= 1; |
} |
println (targetIntensity); |
ledNum = 0; |
runNumber ++; |
} |
} |
} |
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // spalvų gavimas kaip int iš pikselių |
aOrg = (šisPikselis >> 24) & 0xFF; // turime pereiti ir maskuoti, kad kiekvienas komponentas būtų vienas |
rOrg = (šisPikselis >> 16) & 0xFF; // tai greičiau nei skambinti raudona (), žalia (), mėlyna () |
gOrg = (šis pikselis >> 8) & 0xFF; |
bOrg = šisPikselis & 0xFF; |
} |
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // spalvų gavimas kaip int iš pikselių |
aDark = (šisPikselis >> 24) & 0xFF; // turime pereiti ir maskuoti, kad kiekvienas komponentas būtų vienas |
rDark = (šisPikselis >> 16) & 0xFF; // tai greičiau nei skambinti raudona (), žalia (), mėlyna () |
gDark = (šisPikselis >> 8) & 0xFF; |
bTamsus = šisPikselis & 0xFF; |
} |
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) { |
int thisPixel = pixelArray [x+y*pixelsWidth]; // spalvų gavimas kaip int iš pikselių |
aLed = (šisPikselis >> 24) & 0xFF; // turime pereiti ir maskuoti, kad kiekvienas komponentas būtų vienas |
rLed = (šisPikselis >> 16) & 0xFF; // tai greičiau nei skambinti raudona (), žalia (), mėlyna () |
gLed = (šisPikselis >> 8) & 0xFF; |
bLed = šisPikselis & 0xFF; |
} |
voidPxPSetPixel (intx, inty, int, intg, intb, inta, int pixelArray, intpixelsWidth) { |
a = (a << 24); |
r = r << 16; // Mes supakuojame visus 4 komponentus į vieną int |
g = g << 8; // todėl turime juos perkelti į savo vietas |
spalva argb = a | r | g | b; // dvejetainė "arba" operacija prideda juos visus į vieną int |
pixelArray [x+y*pixelsWidth] = argb; // galiausiai mes nustatome int su te spalvomis į pikselius |
} |
peržiūrėkite rawcalibrateDispllay.pde, kurį su „❤“priglobia „GitHub“
11 žingsnis: pastabos
Spąstai, kurių reikia vengti:
* Su mediena jūs gaunate tai, už ką mokate. Taigi, įsigykite geros kokybės medieną. Beržo fanera yra geras pasirinkimas; bet kokia lengva medžio masyvo medžiaga taip pat puikiai tinka. Nusipirkau medienos ir gailiuosi dėl savo sprendimo.
* Geriau gręžti mažiau nei daugiau. Keletas skylių buvo per gilios mano kūriniui. Ir epoksidas pasirodo ant priekinio veido. Tai labai pastebima, kai tik tai pastebite.
* Vietoj tiesaus galo naudokite rutulinį grąžtą. Aš neeksperimentavau su rutuliniu galais, bet esu tikras, kad rezultatai bus daug geresni.
Flirtuoju su mintimi parduoti juos „Etsy“ar „tindie“. Būčiau labai dėkingas, jei galėtumėte pakomentuoti žemiau, jei manote, kad tai prasminga:)
Rekomenduojamas:
LED apšviestas medinis vestuvių laikrodis: 8 žingsniai (su nuotraukomis)
LED apšviestas medinis vestuvių laikrodis: pradėjau šį projektą norėdamas sukurti unikalų, unikalų vestuvių laikrodį savo seseriai ir svainiui. Norėjo padaryti ką nors, ką jie galėtų uždegti ir dar ilgai parodyti savo vestuvių dienos aspektą. Išbandė daugybę dizainų
Medinis LED laikrodis: 5 žingsniai (su nuotraukomis)
Medinis LED laikrodis: medinis LED laikrodis atrodo kaip nuobodi medinė dėžutė, išskyrus tai, kad laikas švyti per jo priekį. Vietoj pilko plastiko gabalo žiūrėti turite gražesnį medžio gabalą. Jis vis dar išlaiko visas savo funkcijas, įskaitant
C51 4 bitų elektroninis laikrodis - medinis laikrodis: 15 žingsnių (su nuotraukomis)
C51 4 bitų elektroninis laikrodis - medinis laikrodis: šį savaitgalį turėjote šiek tiek laisvo laiko, todėl surinko šį 2,40 USD vertės 4 bitų „pasidaryk pats“elektroninį skaitmeninį laikrodį, kurį prieš kurį laiką nusipirkau iš „AliExpress“
„Medinis“stalinis laikrodis *šiuolaikiškai atrodantis *: 9 žingsniai (su nuotraukomis)
„Medinis“stalinis laikrodis *Šiuolaikiškai atrodantis *: Sveiki visi, tai yra mano antrasis pamokomas! Šį kartą statysime medinį laikrodį su temperatūros ir drėgmės ekranu. Kaip parodyta paveikslėlyje, mūsų laikas bus rodomas per „medieną“. Kadangi šviesa nėra stipri
Kaip sukurti akį traukiantį ekraną (LED stilius): 9 žingsniai (su paveikslėliais)
Kaip sukurti akį traukiantį ekraną (LED stilius): tai ne tiek pamokomas dalykas, kiek įrašas apie tai, kaip sukūriau mokyklos projektą. Nors pakartoti tai, ką padariau, greičiausiai jums nepadės, šį projektą galima pakeisti, kad beveik bet koks ekranas taptų akį traukiantis