Obsah:

Drevené LED hodiny - analógový štýl: 11 krokov (s obrázkami)
Drevené LED hodiny - analógový štýl: 11 krokov (s obrázkami)

Video: Drevené LED hodiny - analógový štýl: 11 krokov (s obrázkami)

Video: Drevené LED hodiny - analógový štýl: 11 krokov (s obrázkami)
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, November
Anonim
Drevené LED hodiny - analógový
Drevené LED hodiny - analógový

Jedná sa o drevené LED hodiny v analógovom štýle. Neviem, prečo som jeden z nich nevidel predtým … aj keď sú digitálne typy veľmi bežné. Anyhoo, ideme na to!

Krok 1:

Obrázok
Obrázok
Obrázok
Obrázok

Projekt preglejkových hodín sa začal ako jednoduchý štartovací projekt pre CNC router. Pozeral som sa na jednoduché projekty online a našiel som túto lampu (obrázok vyššie). Videl som tiež digitálne hodiny, ktoré presvitajú drevenou dyhou (obrázok vyššie). Spojenie týchto dvoch projektov bolo teda očividným nápadom. Keď som sa chcel vyzvať, rozhodol som sa, že na tento projekt nepoužijem dyhu, ale iba kus dreva.

Krok 2: Dizajn

Dizajn
Dizajn
Dizajn
Dizajn

Hodiny som navrhol v Inkscape (obrázok vyššie). Dizajn je veľmi jednoduchý podľa výberu. Rozhodol som sa nenavádzať stopy pre vodiče, pretože v tomto mieste som si nebol istý, či chcem ísť s radiálnym alebo obvodovým vedením. (Rozhodol som sa konečne použiť obvodové vedenie.) Do každého z malých kruhových otvorov ide jeden neopixel na zobrazenie minútového a hodinového času s päťminútovou presnosťou. Kruh v strede bude vyvedený tak, aby pojal elektroniku.

Krok 3: CNC obrábanie

CNC obrábanie
CNC obrábanie
CNC obrábanie
CNC obrábanie
CNC obrábanie
CNC obrábanie
CNC obrábanie
CNC obrábanie

Dráhy nástrojov som navrhol na MasterCAM a pomocou technoRouteru vyfrézujem hodiny z 3/4 palcovej preglejky. Na to používam kus 15 "x15" s minimálnym plytvaním. Ide o to, vyhnať čo najviac z dreva bez toho, aby ste prerazili drevo. Nechať 0,05 "-0,1" je dobrou voľbou pre ľahké drevo. Ak si nie ste istí, je lepšie nechať v ňom viac dreva, pretože druhú tvár môžete vždy obrúsiť. Nakoniec som z niektorých častí odstránil príliš veľa dreva, ale našťastie kvôli tomu výsledky príliš neutrpeli.

Poznámka pre používateľov bez prístupu k CNC:

Tento projekt je možné ľahko vykonať pomocou vŕtačky. Stačí nastaviť doraz v mieste, kde na základni zostane asi 0,1 palca dreva. Budete musieť byť presní, ale nie príliš presní. V ideálnom prípade nikto v ideálnom prípade neuvidí rozsvietiť všetky diódy LED v v rovnakom čase, aby ste mohli vyviaznuť s malým sklzom.

Krok 4: Elektronika

Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika

Elektronika je pomerne jednoduchá. Existuje 24 neopixelov, dvanásť na zobrazenie hodín a dvanásť na zobrazenie minút s päťminútovou presnosťou. Arduino pro mini riadi neopixely a získava presný čas prostredníctvom modulu hodín reálneho času (RTC) DS3231. Modul RTC má ako záložný gombíkový článok, takže nestráca čas ani pri vypnutom napájaní.

Materiál:

Arduino pro mini (alebo akékoľvek iné Arduino)

Odlomová doska DS3231

Neopixely v jednotlivých oddeľovacích doskách

Krok 5: Zostavenie elektroniky

Zostava elektroniky
Zostava elektroniky
Zostava elektroniky
Zostava elektroniky
Zostava elektroniky
Zostava elektroniky
Zostava elektroniky
Zostava elektroniky

Neopixely som spojil do šnúry, pričom prvých dvanásť LED diód som použil 2,5 a pre ďalších dvanásťpalcový drôt. Mohol som použiť o niečo menšie dĺžky drôtov. Po vyrobení šnúrky som to vyskúšal a overil som si spájku. kĺby boli dobré. Pridal som chvíľkový vypínač, aby som zapol všetky LED diódy, len aby som sa predviedol.

Krok 6: beh na sucho

Beh na sucho
Beh na sucho
Beh na sucho
Beh na sucho
Beh na sucho
Beh na sucho
Beh na sucho
Beh na sucho

Po experimentovaní, vložení diód LED do dier a ich zapnutí som bol s výsledkami spokojný. Prednú stranu som teda trochu prebrúsil a naniesol PU lak. Kabát som neskôr obrúsila, ale je dobré nechať ho pôsobiť, ak vám to nepríde esteticky nevhodné.

Krok 7: Epoxid

Epoxid
Epoxid
Epoxid
Epoxid

Po nejakom testovaní s pozíciou LED v dierach som zistil, že najlepšia diskusia sa dosiahne, keď sú diódy LED vzdialené asi 0,2 palca od konca otvoru. Keď to vyskúšate sami, jas diód LED bude veľmi odlišný v každú dieru. Nebojte sa toho; opravíme to v kóde. Je to kvôli typu vrtáka, ktorý som použil. Ak by som to urobil znova, na diery by som použil vŕtačku s guľovým koncom.. Ale v každom prípade, aby som získal vzdialenosť, zmiešal som trochu epoxidu a vložil som trochu do každej diery.

Krok 8: Dajte to všetko dohromady

Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy

LED diódy budú umiestnené od polohy 12-hodinovej ručičky pohybujúcej sa proti smeru hodinových ručičiek cez všetky polohy hodinovej ručičky a potom k minútovej ručičke, opäť pohybujúcej sa od 60-minútovej značky pohybujúcej sa proti smeru hodinových ručičiek. Je to tak, že keď sa pozeráme spredu, vzor LED sa zdá ísť v smere hodinových ručičiek.

Potom, čo sa epoxid hodinu vytvrdil, vložil som ešte trochu epoxidu. Tentokrát som LED diódy umiestnil do otvorov a uistil som sa, že drôty a spájkované spoje zakryjeme epoxidom. To zaisťuje dobrú difúziu svetla a zaisťuje drôty.

Krok 9: Kód

Kód
Kód

Kód je na GitHub, neváhajte ho upraviť pre svoje použitie. Keď zapnete všetky LED diódy na rovnakú úroveň, jas svetla, ktorý cez ne svieti, bude v každom otvore veľmi odlišný. Je to kvôli rôznej hrúbke dreva v dierach a rozdielu v odtieni dreva. Ako vidíte, farba dreva sa v mojom kuse dosť líši. Aby som napravil tento rozdiel v jase, urobil som maticu úrovní jasu LED. A znížil jas jasnejších LED diód. Je to proces pokusov a omylov a môže trvať niekoľko minút, ale výsledky stoja za to.

preglejkaClock.ino

// Preglejkové hodiny
// Autor: tinkrmind
// Pripisovanie 4.0 medzinárodné (CC BY 4.0). Môžete zadarmo:
// Zdieľať - skopírujte a znova distribuujte materiál v akomkoľvek médiu alebo formáte
// Prispôsobiť - remixovať, transformovať a stavať na materiáli za akýmkoľvek účelom, dokonca aj komerčne.
// Hurá!
#zahrnúť
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#zahrnúť
#koniec Ak
#definePIN6
Pásik Adafruit_NeoPixel = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int hodinaPixel = 0;
int minútaPixel = 0;
unsignedlong lastRtcCheck;
Reťazec inputString = ""; // reťazec na uchovávanie prichádzajúcich údajov
boolean stringComplete = false; // či je reťazec úplný
int úroveň [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); // pre Leonardo/Micro/Zero
#koniec Ak
// Toto je pre Trinket 5V 16MHz, tieto tri riadky môžete odstrániť, ak nepoužívate Trinket
#je definovaný (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#koniec Ak
// Špeciálny kód konca drobnosti
Serial.begin (9600);
strip.begin ();
strip.show (); // Inicializácia všetkých pixelov na „vypnuté“
if (! rtc.begin ()) {
Serial.println ("Nepodarilo sa nájsť RTC");
pričom (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))));
if (rtc.lostPower ()) {
Serial.println („RTC stratil výkon, nastavme čas!“);
// nasledujúci riadok nastavuje RTC na dátum a čas, kedy bol tento náčrt zostavený
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))));
// Tento riadok nastavuje RTC s explicitným dátumom a časom, napríklad na nastavenie
// 21. januára 2014 o 3:00 by ste zavolali:
// 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 (now.second (), DEC);
Serial.println ();
Zobraziť čas();
lastRtcCheck = milis ();
}
if (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Úroveň");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Zobrazovaný čas");
Zobraziť čas();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println („Zapnutie všetkých diód LED“);
lightUp (pás. Farba (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("Čistiaci pás");
jasný();
strip.show ();
}
// #3, 255 by nastavil číslo LED 3 na úroveň 255, 255, 255
if (inputString [0] == '#') {
Teplota reťazca;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int intenzita = temp.toInt ();
Serial.print ("Nastavenie");
Serial.print (pixNum);
Serial.print ("na úroveň");
Serial.println (intenzita);
strip.setPixelColor (pixNum, strip. Color (intenzita, intenzita, intenzita));
strip.show ();
}
// #3, 255, 0, 125 by nastavilo číslo LED 3 na úroveň 255, 0, 125
if (inputString [0] == '$') {
Teplota reťazca;
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 ("Nastavenie");
Serial.print (pixNum);
Serial.print („R to“);
Serial.print (rIntensity);
Serial.print („G to“);
Serial.print (hustota);
Serial.print („B to“);
Serial.println (hustota);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's') {
Teplota reťazca;
int hodina, minúta;
temp = inputString.substring (1);
hodina = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
minúta = temp.toInt ();
Serial.print ("Zobrazovaný čas:");
Serial.print (hodina);
Serial.print (":");
Serial.print (minúta);
showTime (hodina, minúta);
oneskorenie (1000);
}
inputString = "";
stringComplete = false;
}
// oneskorenie (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
if (inChar == '\ n') {
stringComplete = true;
}
oneskorenie (1);
}
}
voidclear () {
pre (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;
minútaPixel = (teraz.minúta () / 5) % 12 + 12;
jasný();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * úroveň [hourPixel], 30 + 30 * úroveň [hourPixel], 20 + 20 * úroveň [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * úroveň [minútaPixel], 30 + 30 * úroveň [minútaPixel], 20 + 20 * úroveň [minútaPixel]));
strip.setPixelColor (hourPixel, strip. Color (úroveň [hourPixel], úroveň [hourPixel], úroveň [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (úroveň [minútaPixel], úroveň [minútaPixel], úroveň [minútaPixel]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidshowTime (int hodina, int minuta) {
hourPixel = hodina % 12;
minútaPixel = (minúta / 5) % 12 + 12;
jasný();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * úroveň [hourPixel], 30 + 30 * úroveň [hourPixel], 20 + 20 * úroveň [hourPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * úroveň [minútaPixel], 30 + 30 * úroveň [minútaPixel], 20 + 20 * úroveň [minútaPixel]));
strip.setPixelColor (hourPixel, strip. Color (úroveň [hourPixel], úroveň [hourPixel], úroveň [hourPixel]));
strip.setPixelColor (minutePixel, strip. Color (úroveň [minútaPixel], úroveň [minútaPixel], úroveň [minútaPixel]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidlightUp (farba uint32_t) {
pre (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, farba);
}
strip.show ();
}
voidlightUpEven () {
pre (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (úroveň , úroveň , úroveň ));
}
strip.show ();
}

zobraziť rawplywoodClock.ino hostený s ❤ od GitHub

Krok 10: Počítačové videnie - kalibrácia

Počítačové videnie - kalibrácia
Počítačové videnie - kalibrácia
Počítačové videnie - kalibrácia
Počítačové videnie - kalibrácia

Vedome som sa rozhodol, že v tomto projekte dyhu nepoužívam. Ak by som mal, hrúbka dreva by bola pred všetkými LED diódami rovnaká. Ale pretože pred každou LED diódou mám inú hrúbku dreva a pretože sa farba dreva tiež veľmi líši, jas LED je pre každú LED inú. Aby sa zdalo, že všetky LED diódy majú rovnaký jas, vymyslel som šikovný trik.

Napísal som nejaký kód na spracovanie (na GitHub), ktorý nasníma fotografiu hodín a postupne analyzuje jas každej LED diódy. Potom zmení výkon každej LED diódy, aby sa pokúsil dosiahnuť, aby všetky mali rovnaký jas ako najtmavšia LED dióda. Teraz viem, že je to prehnané, ale spracovanie obrazu je veľmi zábavné! A dúfam, že vyviniem kalibračný kód ako knižnicu.

Jas LED pred a po kalibrácii môžete vidieť na vyššie uvedených fotografiách.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Sériový myPort;
Zachytiť video;
finalint numLed = 24;
int ledNum = 0;
// na používanie PxPGetPixelDark () musíte mať tieto globálne premenné
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 prijatelna chyba = 3;
int hotovo;
int numPixelsInLed;
long ledIntensity;
int ledPower;
long targetIntensity = 99999999;
voidsetup () {
done = newint [počet];
numPixelsInLed = newint [numLed];
ledIntensity = newlong [numLed];
ledPower = newint [numLed];
for (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
Reťazec portName = Serial.list () [31];
myPort = newSerial (this, portName, 9600);
veľkosť (640, 480);
video = newCapture (toto, šírka, výška);
video.start ();
noStroke ();
hladký ();
oneskorenie (1000); // Počkajte na otvorenie sériového portu
}
voiddraw () {
ak (video.available ()) {
ak (hotovo [ledNum] == 0) {
clearDisplay ();
oneskorenie (1000);
video.read ();
obrázok (video, 0, 0, šírka, výška); // Nakreslite video z webovej kamery na obrazovku
saveFrame ("data/no_leds.jpg");
if (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> akceptovateľná chyba) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> akceptovateľná chyba) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= přijatelna chyba) {
vykonané [ledNum] = 1;
tlač ("Led");
print (ledNum);
tlač („hotovo“);
}
if (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
if (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
oneskorenie (1000);
video.read ();
obrázok (video, 0, 0, šírka, výška); // Nakreslite video z webovej kamery na obrazovku
oneskorenie (10);
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// print (char (inByte));
}
String imageName = "data/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
Reťazec originalImageName = "data/org";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
if (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 ();
pozadie (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
pre (int x = 0; x <šírka; x ++) {
pre (int y = 0; y <výška; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, šírka);
PxPGetPixelLed (x, y, ledImg.pixels, šírka);
PxPGetPixelOrg (x, y, originalImg.pixels, šírka);
if ((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] ++;
} else {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pixelov, šírka);
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
print (ledNum);
print (',');
print (ledPower [ledNum]);
print (',');
println (ledIntensity [ledNum]);
ledNum ++;
if (ledNum == numLed) {
int donezo = 0;
for (int i = 0; i <numLed; i ++) {
donezo += hotovo ;
}
if (donezo == numLed) {
println („HOTOVO“);
for (int i = 0; i <numLed; i ++) {
tlač (i);
print ("\ t");
println (ledPower );
}
print ("int level [");
print (ledNum);
print ("] = {");
pre (int i = 0; i <numLed-1; i ++) {
tlač (ledPower );
print (',');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
while (pravda);
}
tlač ("Cieľová intenzita:");
if (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // získanie farieb ako int z pixelov
aOrg = (tentoPixel >> 24) & 0xFF; // musíme posunúť a maskovať, aby sme dostali každý komponent sám
rOrg = (tentoPixel >> 16) & 0xFF; // je to rýchlejšie ako volanie red (), green (), blue ()
gOrg = (tentoPixel >> 8) & 0xFF;
bOrg = tentoPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // získanie farieb ako int z pixelov
aTmavé = (tentoPixel >> 24) & 0xFF; // musíme posunúť a maskovať, aby sme dostali každý komponent sám
rDark = (thisPixel >> 16) & 0xFF; // je to rýchlejšie ako volanie red (), green (), blue ()
gDark = (thisPixel >> 8) & 0xFF;
bDark = thisPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // získanie farieb ako int z pixelov
aLed = (tentoPixel >> 24) & 0xFF; // musíme posunúť a maskovať, aby sme dostali každý komponent sám
rLed = (tentoPixel >> 16) & 0xFF; // je to rýchlejšie ako volanie red (), green (), blue ()
gLed = (tentoPixel >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Zabalíme všetkých 4 skladateľov do jedného int
g = g << 8; // preto ich musíme presunúť na svoje miesta
farba argb = a | r | g | b; // binárna "alebo" operácia ich všetky pridá do jedného int
pixelArray [x+y*pixelovŠírka] = argb; // nakoniec nastavíme int s te farbami do pixelov
}

zobraziť rawcalibrateDispllay.pde hostiteľom ❤ od GitHub

Krok 11: Poznámky na rozlúčku

Nástrahám, ktorým sa treba vyhnúť:

* S drevom dostanete to, za čo zaplatíte. Zaobstarajte si teda kvalitné drevo. Brezová preglejka je dobrou voľbou; pekne poslúži aj akékoľvek ľahké masívne drevo. Vyšiel som na drevo a svoje rozhodnutie ľutujem.

* Je lepšie vŕtať menej ako viac. Niekoľko dier bolo pre môj kúsok príliš hlboké. Epoxid je na prednej strane priehľadný. Je to veľmi nápadné, keď si to všimnete.

* Namiesto rovného konca použite vŕtačku s guľovým koncom. Neexperimentoval som s koncovkou guľôčky, ale som si celkom istý, že výsledky budú oveľa lepšie.

Koketujem s myšlienkou predať tieto na Etsy alebo tindie. Bol by som veľmi rád, keby ste sa vyjadrili nižšie, ak si myslíte, že to dáva zmysel:)

Odporúča: