Sisällysluettelo:

Puinen LED -kello - analoginen tyyli: 11 vaihetta (kuvilla)
Puinen LED -kello - analoginen tyyli: 11 vaihetta (kuvilla)

Video: Puinen LED -kello - analoginen tyyli: 11 vaihetta (kuvilla)

Video: Puinen LED -kello - analoginen tyyli: 11 vaihetta (kuvilla)
Video: What Was The Earth Like During The Ice Age? 2024, Heinäkuu
Anonim
Puinen LED -kello - analoginen tyyli
Puinen LED -kello - analoginen tyyli

Se on analoginen puinen LED -kello. En tiedä miksi en ole nähnyt yhtä näistä aikaisemmin.. vaikka digitaaliset tyypit ovat hyvin yleisiä. Anyhoo, näillä mennään!

Vaihe 1:

Kuva
Kuva
Kuva
Kuva

Vanerikelloprojekti alkoi yksinkertaisena käynnistysprojektina CNC -reitittimelle. Katselin yksinkertaisia projekteja verkossa ja löysin tämän lampun (kuva yllä). Olin myös nähnyt digitaalisia kelloja, jotka loistavat puuviilun läpi (kuva yllä). Joten kahden projektin yhdistäminen oli ilmeinen idea. Haastaakseni itseni päätin olla käyttämättä tähän projektiin viilua vaan vain puukappaletta.

Vaihe 2: Suunnittelu

Design
Design
Design
Design

Suunnittelin kellon Inkscapessa (kuva yllä). Suunnittelu on valinnan mukaan hyvin yksinkertainen. Päätin olla lankojen reititysjälkiä vastaan, koska tässä vaiheessa olin epävarma, haluanko käyttää säteittäistä vai kehäjohdotusta. (Päätin mennä kehäjohdotuksella lopulta.) Yksi neopikseli menee jokaiseen pieneen pyöreään reikään minuutin ja tunnin näyttämiseksi viiden minuutin tarkkuudella. Keskellä oleva ympyrä reititetään elektroniikan mukaan.

Vaihe 3: CNC -leikkaus

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Suunnittelin MasterCAMin työstöradat ja jyrsin kellon 3/4 tuuman vanerista teknoRouterin avulla. Käytän tähän 15 "x15" kappaletta minimaalisella tuhlauksella. Temppu on reitittää mahdollisimman paljon puuta rikkomatta puuta. Jätä 0,05 "-0,1" on hyvä valinta vaalealle puulle. Jos olet epävarma, on parempi jättää enemmän puuta sisään, koska voit aina hioa toisen kasvot. Päädyin poistamaan hiukan liikaa puuta joistakin osista, mutta onneksi tulokset eivät kärsi liikaa tästä.

Huomautus käyttäjille, joilla ei ole pääsyä CNC: hen:

Tämä projekti voidaan tehdä helposti porapuristimella. Sinun on vain asetettava pysäytys kohtaan, jossa jätät noin 0,1 tuumaa puuta pohjaan. Sinun on oltava tarkka, mutta ei liian tarkka. Loppujen lopuksi ideaalisesti kukaan ei näe, että kaikki LED -valot syttyvät samaan aikaan, joten pääset eroon pienellä viilauksella.

Vaihe 4: Elektroniikka

Elektroniikka
Elektroniikka
Elektroniikka
Elektroniikka
Elektroniikka
Elektroniikka

Elektroniikka on melko yksinkertaista. Neopikseleitä on 24, joista kaksitoista näyttää tunteja ja kaksitoista minuuttia, viiden minuutin tarkkuudella. Arduino pro mini ohjaa neopikseleitä ja saa tarkan ajan DS3231 -reaaliaikakello (RTC) -moduulin kautta. RTC -moduulissa on nappiparisto varmuuskopiona, joten se ei menetä aikaa, vaikka virta on katkaistu.

Materiaali:

Arduino pro mini (tai mikä tahansa muu Arduino)

DS3231 katkaisulauta

Neopikselit yksittäisissä murtolevyissä

Vaihe 5: Elektroniikan kokoonpano

Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano
Elektroniikan kokoonpano

Yhdistin neopikselit merkkijonoon käyttämällä 2,5 tuuman johtoja ensimmäisten kahdentoista ledin ja neljän tuuman johdon kanssa seuraavien kahdentoista aikana. Olisin voinut käyttää hieman pienempiä johdinpituuksia. Jousen tekemisen jälkeen testasin sen ja varmistin, että juotos Lisäsin hetkellisen kytkimen kaikkien ledien sytyttämiseksi vain esittelemiseksi.

Vaihe 6: Kuiva -ajo

Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu
Kuivaharjoittelu

Kokeilun, LED -valojen asettamisen reikiin ja kaikkien kytkemisen jälkeen olin tyytyväinen tuloksiin. Joten hioin hieman etupintaa ja levitin PU -päällystettä. Päädyin hiomaan takin pois myöhemmin, mutta on hyvä jättää se päälle, jos se ei ole esteettisesti epämiellyttävä.

Vaihe 7: Epoksi

Epoksi
Epoksi
Epoksi
Epoksi

Joidenkin testien jälkeen led -asennolla reikien sisällä, ajattelin, että paras keskustelu saavutetaan, kun LEDit ovat noin 0,2 tuuman päässä reiän päästä. Kun yrität tätä itse, LEDien kirkkaus on hyvin erilainen Älä välitä tästä; korjaamme sen koodilla. Tämä johtuu käyttämästäni poranterästä. Jos tekisin tämän uudelleen, käyttäisin reikiä kuulapäätyökalulla Mutta joka tapauksessa etäisyyden saamiseksi sekoitin epoksin ja laitoin hieman jokaiseen reikään.

Vaihe 8: Yhdistä kaikki

Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen

LEDit sijoitetaan alkaen kello 12: n osoittimen asennosta, joka liikkuu vastapäivään kaikkien tuntiosoitinten asentojen läpi, ja sitten minuuttiosoitimeen, siirtymällä jälleen 60 minuutin merkistä vastapäivään. Tämä johtuu siitä, että kun katsomme edestä, LED -kuvio näkyy myötäpäivään.

Kun epoksi oli kovettunut tunnin ajan, laitoin lisää epoksia. Tällä kertaa laitoin LEDit reikiin varmistaen, että johdot ja juotosliitokset peitetään epoksilla. Tämä takaa hyvän valon leviämisen ja varmistaa johdot.

Vaihe 9: Koodi

Koodi
Koodi

Koodi on GitHubissa, voit muokata sitä omaan käyttöösi. Kun kytket kaikki LEDit päälle samalla tasolla, läpi kulkevan valon kirkkaus on hyvin erilainen jokaisessa reiässä. Tämä johtuu puiden erilaisesta paksuudesta reikissä ja puun sävyn erosta, Kuten näette, puun väri vaihtelee melko paljon kappaleessani. Tämän kirkkauseron korjaamiseksi tein matriisin led -kirkkaustasoista. Ja vähensi kirkkaampien LEDien kirkkautta. Se on kokeilu- ja erehdysprosessi ja voi kestää useita minuutteja, mutta tulokset ovat sen arvoisia.

plywoodClock.ino

// Vanerikello
// Kirjoittaja: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Voit vapaasti:
// Jaa - kopioi ja jaa materiaalia uudelleen missä tahansa muodossa tai muodossa
// Mukauta - sekoita, muokkaa ja rakenna materiaalia mihin tahansa tarkoitukseen, myös kaupallisesti.
// Hurraa!
#sisältää
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#sisältää
#loppu Jos
#definePIN6
Adafruit_NeoPixel strip = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int tuntiPikseli = 0;
int minutePixel = 0;
unsignedlong lastRtcCheck;
Merkkijono inputString = ""; // merkkijono saapuvan datan säilyttämiseen
boolean stringComplete = epätosi; // onko merkkijono täydellinen
int taso [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 (! Sarja); // Leonardo/Micro/Zero
#loppu Jos
// Tämä on Trinket 5V 16MHz: lle, voit poistaa nämä kolme riviä, jos et käytä Trinketiä
#if määritelty (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#loppu Jos
// rihkamakoodin loppu
Sarja.alku (9600);
strip.begin ();
strip.show (); // Alusta kaikki pikselit pois päältä
jos (! rtc.begin ()) {
Serial.println ("RTC: tä ei löytynyt");
kun taas (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
if (rtc.lostPower ()) {
Serial.println ("RTC katkaisi virran, asettaa ajan!");
// seuraava rivi asettaa RTC: lle päivämäärän ja kellonajan, jolloin tämä luonnos laadittiin
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// Tämä rivi asettaa RTC: lle nimenomaisen päivämäärän ja kellonajan, esimerkiksi asetettavaksi
// 21. tammikuuta 2014 klo 3, soitat:
// 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 now = rtc.now ();
Serial.print (now.hour (), DEC);
Serial.print (':');
Serial.print (now.minute (), DEC);
Serial.print (':');
Serial.print (nyt.second (), DEC);
Sarja.println ();
esitysaika();
lastRtcCheck = millis ();
}
jos (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
jos (inputString [0] == 'l') {
Serial.println ("Taso");
lightUpEven ();
}
jos (inputString [0] == 'c') {
Serial.println ("Näytetään aika");
esitysaika();
strip.show ();
}
jos (inputString [0] == '1') {
Serial.println ("Kaikkien LEDien kytkeminen päälle");
lightUp (nauha. väri (255, 255, 255));
strip.show ();
}
jos (inputString [0] == '0') {
Serial.println ("Selvitysnauha");
asia selvä();
strip.show ();
}
// #3, 255 asettaa led -numeron 3 tasolle 255, 255, 255
if (inputString [0] == '#') {
Merkkijonon lämpötila;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int intensiteetti = temp.toInt ();
Serial.print ("Asetus");
Serial.print (pixNum);
Serial.print ("tasolle");
Sarja.println (intensiteetti);
strip.setPixelColor (pixNum, strip. Color (intensiteetti, voimakkuus, voimakkuus));
strip.show ();
}
// #3, 255, 0, 125 asettaa led -numeron 3 tasolle 255, 0, 125
if (inputString [0] == '$') {
Merkkijonon lämpötila;
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 ("Asetus");
Serial.print (pixNum);
Serial.print ("R to");
Serial.print (rIntensity);
Serial.print ("G -");
Serial.print (gIntensity);
Serial.print ("B -");
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's') {
Merkkijonon lämpötila;
int tunti, minuutti;
temp = inputString.substring (1);
tunti = lämpötila (Int.) ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
minuutti = temp.toInt ();
Serial.print ("Näytetään aika:");
Sarjajälki (tunti);
Serial.print (":");
Sarjajälki (minuutti);
showTime (tunti, minuutti);
viive (1000);
}
inputString = "";
stringComplete = false;
}
// viive (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
jos (inChar == '\ n') {
stringComplete = true;
}
viive (1);
}
}
voidclear () {
for (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 = (nyt.minute () / 5) % 12 + 12;
asia selvä();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * taso [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * taso [minuuttipikseli], 30 + 30 * taso [minuuttipikseli], 20 + 20 * taso [minuuttipikseli]));
strip.setPixelColor (hourPixel, strip. Color (level [hourPixel], level [hourPixel], level [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (taso [minuuttipikseli], taso [minuuttipikseli], taso [minuuttipikseli]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidshowTime (int tunti, int minuutti) {
hourPixel = tunti % 12;
minutePixel = (minuutti / 5) % 12 + 12;
asia selvä();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * taso [hourPixel], 30 + 30 * level [hourPixel], 20 + 20 * level [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * taso [minuuttipikseli], 30 + 30 * taso [minuuttipikseli], 20 + 20 * taso [minuuttipikseli]));
strip.setPixelColor (hourPixel, strip. Color (level [hourPixel], level [hourPixel], level [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (taso [minuuttipikseli], taso [minuuttipikseli], taso [minuuttipikseli]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t color) {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, väri);
}
strip.show ();
}
voidlightUpEven () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (taso , taso , taso ));
}
strip.show ();
}

katso rawplywoodClock.ino, jota isännöi GitHub ❤ kanssa

Vaihe 10: Tietokoneen visio - kalibrointi

Tietokonevisio - kalibrointi
Tietokonevisio - kalibrointi
Tietokonevisio - kalibrointi
Tietokonevisio - kalibrointi

Tein tietoisen valinnan olla käyttämättä viilua tässä projektissa. Jos olisin, puun paksuus olisi ollut sama kaikkien LEDien edessä. Mutta koska minulla on eri paksuus puuta jokaisen LEDin edessä ja koska myös puun väri vaihtelee paljon, LED -valojen kirkkaus on erilainen jokaiselle LED -valolle. Jotta kaikki LEDit näyttäisivät olevan yhtä kirkkaita, keksin hienon tempun.

Kirjoitin jonkin prosessointikoodin (GitHubiin), joka ottaa valokuvan kellosta ja analysoi jokaisen LEDin kirkkauden vuorotellen. Se muuttaa sitten kunkin LEDin tehoa yrittääkseen saada heidät kaikki olemaan yhtä kirkkaita kuin himmein LED. Nyt tiedän, että tämä on liikaa, mutta kuvankäsittely on hauskaa! Ja toivon kehittäväni kalibrointikoodin kirjastona.

Näet LED -valojen kirkkauden ennen ja jälkeen kalibroinnin yllä olevista kuvista.

calibrateDispllay.pde

importprocessing.video.*;
tuontiprosessointi.sarja.*;
Sarja myPort;
Tallenna video;
lopullinen numeroLed = 24;
int ledNum = 0;
// sinulla on oltava nämä yleiset varabelit, jotta voit käyttää 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 hyväksyttäväVirhe = 3;
int tehty;
int numPixelsInLed;
pitkä ledIntensity;
int ledPower;
pitkä tavoiteIntensiteetti = 99999999;
voidsetup () {
valmis = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = uusi pitkä [numLed];
ledPower = newint [numLed];
for (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
Merkkijono portName = Serial.list () [31];
myPort = newSerial (tämä, portin_nimi, 9600);
koko (640, 480);
video = newCapture (tämä, leveys, korkeus);
video.start ();
noStroke ();
sileä();
viive (1000); // Odota sarjaportin avautumista
}
voiddraw () {
jos (video.available ()) {
jos (tehty [ledNum] == 0) {
clearDisplay ();
viive (1000);
video.read ();
kuva (video, 0, 0, leveys, korkeus); // Piirrä verkkokameran video näytölle
saveFrame ("data/no_leds.jpg");
jos (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> hyväksyttävä virhe) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> hyväksyttävä virhe) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= hyväksyttävä virhe) {
valmis [ledNum] = 1;
tulosta ("Led");
tulosta (ledNum);
tulosta ("valmis");
}
jos (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
jos (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
viive (1000);
video.read ();
kuva (video, 0, 0, leveys, korkeus); // Piirrä verkkokameran video näytölle
viive (10);
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// tulosta (char (inByte));
}
Jono imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
Jono originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
jos (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 ();
tausta (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
for (int x = 0; x <leveys; x ++) {
for (int y = 0; y <korkeus; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, width);
PxPGetPixelLed (x, y, ledImg.pixels, width);
PxPGetPixelOrg (x, y, alkuperäinenImg.pikseliä, leveys);
jos ((rOrg+gOrg/2+bOrg/3)-(rPimeä+gTumma/2+bTumma/3)> 75) {
ledIntensity [ledNum] = ledIntensity [ledNum]+(rLed+gLed/2+bLed/3) -(rPimeä+gTumma/2+bTumma/3);
rTemp = 255;
gTemp = 255;
bTemp = 255;
numPixelsInLed [ledNum] ++;
} muuta {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pikseliä, leveys);
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
tulosta (ledNum);
Tulosta(', ');
tulosta (ledPower [ledNum]);
Tulosta(', ');
println (ledIntensity [ledNum]);
ledNum ++;
jos (ledNum == numLed) {
int donezo = 0;
for (int i = 0; i <numLed; i ++) {
donezo += valmis ;
}
jos (donezo == numLed) {
println ("VALMIS");
for (int i = 0; i <numLed; i ++) {
tulosta (i);
tulosta ("\ t");
println (ledPower );
}
print ("int taso [");
tulosta (ledNum);
tulosta ("] = {");
for (int i = 0; i <numLed-1; i ++) {
tulosta (ledPower );
Tulosta(', ');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
kun taas (totta);
}
print ("Kohteen intensiteetti:");
jos (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värien hakeminen pikselistä int]
aOrg = (tämäPikseli >> 24) & 0xFF; // meidän on siirrettävä ja peitettävä, jotta jokainen komponentti saadaan yksin
rOrg = (tämäPikseli >> 16) & 0xFF; // tämä on nopeampaa kuin kutsua punainen (), vihreä (), sininen ()
gOrg = (tämäPikseli >> 8) & 0xFF;
bOrg = tämäPikseli & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värien hakeminen pikselistä int]
aTumma = (tämäPikseli >> 24) & 0xFF; // meidän on siirrettävä ja peitettävä, jotta jokainen komponentti saadaan yksin
rDark = (tämäPikseli >> 16) & 0xFF; // tämä on nopeampaa kuin kutsua punainen (), vihreä (), sininen ()
gTumma = (tämäPikseli >> 8) & 0xFF;
bTumma = tämäPikseli & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värien hakeminen pikselistä int]
aLed = (tämäPikseli >> 24) & 0xFF; // meidän on siirrettävä ja peitettävä, jotta jokainen komponentti saadaan yksin
rLed = (tämäPikseli >> 16) & 0xFF; // tämä on nopeampaa kuin kutsua punainen (), vihreä (), sininen ()
gLed = (tämäPikseli >> 8) & 0xFF;
bLed = tämä pikseli & 0xFF;
}
voidPxPSetPixel (intx, inty, int, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r <16; // Pakkaamme kaikki 4 komponenttia yhteen int
g = g << 8; // meidän on siis siirrettävä ne paikoilleen
väri argb = a | r | g | b; // binaarinen "tai" operaatio lisää ne kaikki yhteen int
pixelArray [x+y*pixelsWidth] = argb; // lopuksi asetamme int väreillä pikseliin
}

katso rawcalibrateDispllay.pde, jota isännöi GitHub

Vaihe 11: Eroavat huomautukset

Vältä sudenkuopat:

* Puulla saat mitä maksat. Hanki siis hyvälaatuista puuta. Koivuvaneri on hyvä valinta; mikä tahansa vaalea massiivipuu toimii myös hienosti. Halusin puun ja kaduin päätöstäni.

* On parempi porata vähemmän kuin enemmän. Pari reikää meni liian syvälle kappaleelleni. Ja epoksi näkyy etupuolelta. Se on hyvin havaittavissa, kun huomaat sen.

* Käytä kuulapääporaa suoran pään sijaan. En ole kokeillut pallopäätä, mutta olen melko varma, että tulokset ovat paljon parempia.

Flirttailen ajatuksella myydä nämä Etsyssä tai tindiessä. Olisin todella kiitollinen, jos kommentoisit alle, jos se on mielestäsi järkevää:)

Suositeltava: