Fából készült LED óra - analóg stílus: 11 lépés (képekkel)
Fából készült LED óra - analóg stílus: 11 lépés (képekkel)
Anonim
Fából készült LED óra - analóg stílusban
Fából készült LED óra - analóg stílusban

Ez egy analóg stílusú fa LED -es óra. Nem tudom, miért nem láttam ilyet korábban, pedig a digitális típusok nagyon gyakoriak. Anyhoo, tessék!

1. lépés:

Kép
Kép
Kép
Kép

A rétegelt lemez óra projekt a CNC router egyszerű indító projektjeként indult. Néztem egyszerű projekteket az interneten, és megtaláltam ezt a lámpát (kép fent). Láttam digitális órákat is, amelyek ragyognak a fa furnéron (fenti kép). Tehát a két projekt ötvözése nyilvánvaló ötlet volt. Hogy kihívást jelenthessek magamnak, úgy döntöttem, hogy nem használok furnért, hanem csak egy fadarabot ehhez a projekthez.

2. lépés: Tervezés

Tervezés
Tervezés
Tervezés
Tervezés

Az órát az Inkscape -ben terveztem (kép fent). A kialakítás nagyon egyszerű választás. Úgy döntöttem, hogy nem vezetek nyomokat a vezetékekhez, mert ekkor bizonytalan voltam, hogy sugárirányú vagy kerületi vezetékekkel akarok -e menni. (Végül úgy döntöttem, hogy a kerületi kábelezéssel megyek.) Egy-egy neopixel megy a kis kör alakú lyukakba a perc és az óra megjelenítéséhez, öt perces pontossággal. A középen lévő kör kivezetésre kerül az elektronika befogadására.

3. lépés: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

A szerszámpályákat a MasterCAM -on terveztem, és egy technoRouter segítségével 3/4 hüvelykes rétegelt lemezből őröltem ki az órát. Ehhez 15 "x15" -es darabot használok, minimális pazarlással. A trükk az, hogy a lehető legtöbb fát ki kell vezetni anélkül, hogy áttörné a fát. A 0,05 "-0,1" elhagyása jó választás világos fa számára. Ha bizonytalan, jobb több fát hagyni, mert a másik arcot mindig csiszolhatja. Végül egy kicsit túl sok fát távolítottam el egyes részekről, de szerencsére az eredmények nem szenvednek túl sokat emiatt.

Megjegyzés azoknak a felhasználóknak, akik nem férnek hozzá CNC -hez:

Ez a projekt könnyen elvégezhető fúrógéppel. Csak meg kell állítania az ütközőt egy ponton, ahol körülbelül 0,1 hüvelyk fa marad az alapon. Pontosnak kell lennie, de nem túl pontosnak. Végül is ideális esetben senki sem fogja látni, hogy az összes LED világít ugyanabban az időben, így egy kis lejtéssel megúszhatja.

4. lépés: Elektronika

Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika

Az elektronika meglehetősen egyszerű. 24 neopixel van, tizenkettő az órák, tizenkettő pedig a percek megjelenítésére, öt perces pontossággal. Az Arduino pro mini vezérli a neopixeleket, és pontos időt kap a DS3231 valós idejű óra (RTC) modulon keresztül. Az RTC modul egy érmecellát tartalmaz biztonsági mentésként, így nem veszít időt az áramellátásról sem.

Anyag:

Arduino pro mini (vagy bármely más Arduino)

DS3231 kitörő tábla

Neopixelek az egyedi kitörési táblákban

5. lépés: Elektronikai összeszerelés

Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény
Elektronikai szerelvény

A neopixeleket egy karakterláncban kötöttem össze, az első tizenkét ledhez 2,5 hüvelykes, a következő tizenkettőhöz négy hüvelykes vezetéket használtam. Kicsit kisebb huzalhosszakat is használhattam volna. A húr elkészítése után kipróbáltam, és meggyőződtem arról, hogy a forrasztás Hozzáadtam egy pillanatnyi kapcsolót az összes led bekapcsolásához, csak hogy megmutassam.

6. lépés: Szárazon futás

Szárazon futás
Szárazon futás
Szárazon futás
Szárazon futás
Szárazon futás
Szárazon futás
Szárazon futás
Szárazon futás

Miután kísérleteztem, LED -eket helyeztem a lyukakba, és bekapcsoltam őket, elégedett voltam az eredménnyel. Így kicsit lecsiszoltam az elülső oldalt, és PU -bevonatot alkalmaztam. Végül később lecsiszoltam a kabátot, de jó ötlet, ha rajta hagyod, ha nem találod esztétikailag kellemetlennek.

7. lépés: Epoxi

Epoxi
Epoxi
Epoxi
Epoxi

A lyukakon belüli led pozícióval végzett néhány teszt után arra jutottam, hogy a legjobb vita akkor érhető el, ha a LED -ek körülbelül 0,2 távolságra vannak a lyuk végétől. Ha ezt saját maga próbálja ki, a LED -ek fényereje nagyon eltérő lesz minden lyuk. Ne aggódjon emiatt; kódban rögzítjük. Ez az általunk használt fúrószár típusa miatt van. Ha ezt újra megtenném, golyós végű fúrót használnék a lyukakhoz De mindenesetre a távolság elérése érdekében összekevertem néhány epoxit, és minden lyukba tettem egy keveset.

8. lépés: Összerakás

Összerakni
Összerakni
Összerakni
Összerakni
Összerakni
Összerakni
Összerakni
Összerakni

A LED-ek a 12 órás mutató pozíciójától kezdve kerülnek elhelyezésre az óramutató járásával ellentétes irányban, az óramutató összes pozíciójában, majd a percmutatóig, ismét a 60 perces jelzéstől az óramutató járásával ellentétes irányban mozogva. Ez azért van így, mert amikor elölről nézzük, a LED mintázat az óramutató járásával megegyező irányban jelenik meg.

Miután az epoxi egy órán át keményedett, tettem bele még néhány epoxit. Ezúttal a lyukakba helyeztem a LED -eket, ügyelve arra, hogy a huzalokat és a forrasztási kötéseket epoxiddal fedje le. Ez jó fényeloszlást tesz lehetővé és rögzíti a vezetékeket.

9. lépés: Kód

Kód
Kód

A kód a GitHubon található, bátran módosítsa azt a saját igényei szerint. Ha az összes LED -et ugyanarra a szintre kapcsolja, az átvilágító fényerősség minden lyukban nagyon eltérő lesz. Ez annak köszönhető, hogy a lyukakban eltérő a fa vastagsága és a fa árnyalata, mint látható, a fa színe meglehetősen eltérő a darabomban. Ennek a fényerőbeli különbségnek a kiküszöbölésére készítettem egy led fényerősségi mátrixot. És csökkentette a világosabb LED -ek fényerejét. Ez egy próba -hiba folyamat, és több percig is eltarthat, de az eredmény megéri.

plywoodClock.ino

Rétegelt lemez óra
// Szerző: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Ön szabadon:
// Megosztás - másolja és terjessze újra az anyagot bármilyen médiumban vagy formátumban
// Alkalmazkodás - remixelheti, átalakíthatja és építheti fel az anyagot bármilyen célra, akár kereskedelmi célokra is.
// Hurrá!
#befoglalni
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#befoglalni
#endif
#definePIN6
Adafruit_NeoPixel csík = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int óraPixel = 0;
int percPixel = 0;
unsignedlong lastRtcCheck;
Karakterlánc inputString = ""; // karakterlánc a bejövő adatok tárolására
logikai stringComplete = false; // hogy a karakterlánc teljes -e
int szint [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 (! Sorozat); // Leonardo/Micro/Zero esetén
#endif
// Ez a Trinket 5V 16MHz -re vonatkozik, eltávolíthatja ezt a három sort, ha nem Trinket -et használ
#if meghatározott (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#endif
// A csecsebecsék speciális kódjának vége
Sorozat.kezdet (9600);
strip.begin ();
strip.show (); // Inicializálja az összes képpontot "kikapcsolt" állapotba
if (! rtc.begin ()) {
Serial.println ("Nem található RTC");
míg (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
if (rtc.lostPower ()) {
Serial.println ("Az RTC elvesztette az áramot, állítsuk be az időt!");
// a következő sor az RTC -t a vázlat összeállításának dátumára és időpontjára állítja
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// Ez a sor az RTC -t explicit dátummal és idővel állítja be, például beállítani
2014. január 21 -én hajnali 3 órakor a következőt hívja:
// 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 ();
Soros.nyomtatás (now.hour (), DEC);
Serial.print (':');
Soros.nyomtatás (most.perc (), DEC);
Serial.print (':');
Serial.print (most.second (), DEC);
Sorozat.println ();
showTime ();
lastRtcCheck = millis ();
}
if (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Szint");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Idő megjelenítése");
showTime ();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println ("Minden LED bekapcsolása");
lightUp (szalag. Szín (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("Tisztítócsík");
egyértelmű();
strip.show ();
}
// #3, 255 a 3 -as számú vezetőt 255, 255, 255 szintre állítaná
if (inputString [0] == '#') {
Karakterlánc hőmérséklete;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int intenzitás = temp.toInt ();
Serial.print ("Beállítás");
Soros.nyomtatás (pixNum);
Serial.print ("szintre");
Soros.println (intenzitás);
strip.setPixelColor (pixNum, strip. Color (intenzitás, intenzitás, intenzitás));
strip.show ();
}
// #3, 255, 0, 125 a 3. számú LED -et 255, 0, 125 szintre állítaná
if (inputString [0] == '$') {
Karakterlánc hőmérséklete;
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 ("Beállítás");
Soros.nyomtatás (pixNum);
Serial.print ("R");
Serial.print (rIntensity);
Serial.print ("G -tól");
Serial.print (gIntensity);
Serial.print ("B -től");
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's') {
Karakterlánc hőmérséklete;
int óra, perc;
temp = inputString.substring (1);
óra = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
perc = temp.toInt ();
Serial.print ("Idő megjelenítése:");
Soros.nyomtatás (óra);
Serial.print (":");
Sorozatnyomat (perc);
showTime (óra, perc);
késleltetés (1000);
}
inputString = "";
stringComplete = hamis;
}
// delay (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
if (inChar == '\ n') {
stringComplete = igaz;
}
késleltetés (1);
}
}
voidclear () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (0, 0, 0));
}
}
voidshowTime () {
DateTime now = rtc.now ();
óraPixel = most.óra () % 12;
percPixel = (most.perc () / 5) % 12 + 12;
egyértelmű();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * szint [óraPixel], 30 + 30 * szint [óraPixel], 20 + 20 * szint [óraPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * szint [percPixel], 30 + 30 * szint [percPixel], 20 + 20 * szint [percPixel]));
strip.setPixelColor (hourPixel, strip. Color (szint [óraPixel], szint [óraPixel], szint [óraPixel]));
strip.setPixelColor (minutePixel, strip. Color (szint [percPixel], szint [percPixel], szint [percPixel]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidshowTime (int óra, int perc) {
hourPixel = óra % 12;
percPixel = (perc / 5) % 12 + 12;
egyértelmű();
// strip.setPixelColor (hourPixel, strip. Color (40 + 40 * szint [óraPixel], 30 + 30 * szint [óraPixel], 20 + 20 * szint [óraPixel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * szint [percPixel], 30 + 30 * szint [percPixel], 20 + 20 * szint [percPixel]));
strip.setPixelColor (hourPixel, strip. Color (szint [óraPixel], szint [óraPixel], szint [óraPixel]));
strip.setPixelColor (minutePixel, strip. Color (szint [percPixel], szint [percPixel], szint [percPixel]));
// lightUp (strip. Color (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t color) {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, szín);
}
strip.show ();
}
voidlightUpEven () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, strip. Color (szint , szint , szint ));
}
strip.show ();
}

Tekintse meg a rawplywoodClock.ino webhelyet, amelyet a GitHub ❤ üzemeltet

10. lépés: Számítógépes látás - kalibrálás

Számítógépes látás - kalibrálás
Számítógépes látás - kalibrálás
Számítógépes látás - kalibrálás
Számítógépes látás - kalibrálás

Tudatosan döntöttem úgy, hogy nem használok furnért ebben a projektben. Ha igen, a fa vastagsága minden LED előtt azonos lett volna. De mivel minden LED előtt más vastagságú fa van, és mivel a fa színe is nagymértékben változik, a LED fényereje minden LED esetében eltérő. Annak érdekében, hogy az összes LED azonos fényességű legyen, kitaláltam egy remek trükköt.

Írtam egy feldolgozási kódot (a GitHubon), amely lefényképezi az órát, és sorra elemzi az egyes LED -ek fényerejét. Ezután az egyes LED -ek teljesítményét változtatja, hogy megpróbálja elérni, hogy mindegyikük fényereje megegyezzen a leghalványabb LED -del. Most már tudom, hogy ez túlzás, de a képfeldolgozás nagyon szórakoztató! És remélem, hogy könyvtárként kifejleszthetem a kalibrációs kódot.

A LED fényerejét a kalibrálás előtt és után láthatja a fenti fényképeken.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Soros myPort;
Videó rögzítése;
finalint numLed = 24;
int ledNum = 0;
// a PxPGetPixelDark () használatához rendelkeznie kell ezekkel a globális változókkal
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 elfogadhatóHiba = 3;
int kész;
int numPixelsInLed;
hosszú ledIntensity;
int ledPower;
hosszú targetIntensity = 99999999;
voidsetup () {
kész = newint [számLed];
numPixelsInLed = newint [numLed];
ledIntensity = újhosszú [számLed];
ledPower = newint [számLed];
for (int i = 0; i <számLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Sorozat.lista () [31];
myPort = newSerial (ez, portName, 9600);
méret (640, 480);
video = newCapture (ez, szélesség, magasság);
video.start ();
noStroke ();
sima();
késleltetés (1000); // Várja meg, amíg megnyílik a soros port
}
voiddraw () {
if (video.available ()) {
ha (kész [ledNum] == 0) {
clearDisplay ();
késleltetés (1000);
video.read ();
kép (videó, 0, 0, szélesség, magasság); // Rajzolja a webkamera videóját a képernyőre
saveFrame ("data/no_leds.jpg");
if (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> elfogadhatóError) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> elfogadhatóError) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= elfogadhatóError) {
kész [ledNum] = 1;
nyomtatás ("Led");
print (ledNum);
nyomtatás ("kész");
}
if (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
if (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
késleltetés (1000);
video.read ();
kép (videó, 0, 0, szélesség, magasság); // Rajzolja a webkamera videóját a képernyőre
késleltetés (10);
while (myPort.available ()> 0) {
int inByte = myPort.read ();
// print (char (inByte));
}
Karakterlánc imageName = "adatok/";
imageName+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (imageName);
String originalImageName = "adatok/szervezet";
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 ();
háttér (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
for (int x = 0; x <szélesség; x ++) {
for (int y = 0; y <magasság; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, width);
PxPGetPixelLed (x, y, ledImg.pixels, width);
PxPGetPixelOrg (x, y, originalImg.pixels, width);
ha ((rOrg+gOrg/2+bOrg/3)-(rSötét+gSötét/2+bSötét/3)> 75) {
ledIntensity [ledNum] = ledIntensity [ledNum]+(rLed+gLed/2+bLed/3) -(rSötét+gSötét/2+bSötét/3);
rTemp = 255;
gTemp = 255;
bTemp = 255;
numPixelsInLed [ledNum] ++;
} más {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, képpont, szélesség);
}
}
ledIntensity [ledNum] /= számPixelsInLed [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 <számLed; i ++) {
donezo += kész ;
}
if (donezo == numLed) {
println ("KÉSZ");
for (int i = 0; i <számLed; i ++) {
nyomtatás (i);
print ("\ t");
println (ledPower );
}
print ("int level [");
print (ledNum);
print ("] = {");
for (int i = 0; i <numLed-1; i ++) {
nyomtatás (ledPower );
print (',');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
míg (igaz);
}
print ("Célintenzitás:");
if (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // a színek int -ként történő lekérése a képpontokból
aOrg = (thisPixel >> 24) & 0xFF; // váltani és maszkolni kell, hogy minden egyes komponenst egyedül kapjunk
rOrg = (thisPixel >> 16) & 0xFF; // ez gyorsabb, mint a piros (), zöld (), kék ()
gOrg = (thisPixel >> 8) & 0xFF;
bOrg = thisPixel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // a színek int -ként történő lekérése a képpontokból
aSötét = (thisPixel >> 24) & 0xFF; // váltani és maszkolni kell, hogy minden egyes komponenst egyedül kapjunk
rSötét = (thisPixel >> 16) & 0xFF; // ez gyorsabb, mint a piros (), zöld (), kék ()
gSötét = (thisPixel >> 8) & 0xFF;
bSötét = ezPixel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // a színek int -ként történő lekérése a képpontokból
aLed = (thisPixel >> 24) & 0xFF; // váltani és maszkolni kell, hogy minden egyes komponenst egyedül kapjunk
rLed = (thisPixel >> 16) & 0xFF; // ez gyorsabb, mint a piros (), zöld (), kék ()
gLed = (thisPixel >> 8) & 0xFF;
bLed = thisPixel & 0xFF;
}
voidPxPSetPixel (intx, inty, intr, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Mind a 4 komponenst egy int -be csomagoljuk
g = g << 8; // tehát át kell helyeznünk őket a helyükre
szín argb = a | r | g | b; // bináris "vagy" művelet mindegyiket egy int -be adja
pixelArray [x+y*pixelsWidth] = argb; // végül az int -t te színekkel a pixelekbe állítjuk
}

Tekintse meg a rawcalibrateDispllay.pde fájlt, amelyet a GitHub ❤ üzemeltet

11. lépés: Megosztási megjegyzések

Kerülendő buktatók:

* A fával azt kapod, amiért fizetsz. Tehát szerezzen jó minőségű fát. A nyír rétegelt lemez jó választás; bármilyen világos, tömör fa is jól megy. Elfogytam a fán, és megbántam a döntésemet.

* Jobb kevesebbet fúrni, mint többet. Néhány lyuk túl mélyre sikerült a darabomhoz. És az epoxi megjelenik az előlapon. Nagyon észrevehető, ha egyszer észreveszi.

* Használjon gömbvégű fúrót az egyenes vég helyett. Nem kísérleteztem a golyóvéggel, de biztos vagyok benne, hogy az eredmények sokkal jobbak lesznek.

Flörtölök azzal a gondolattal, hogy ezeket Etsy -n vagy tindie -n árulom. Nagyon megköszönném, ha kommentelnétek alább, ha úgy gondoljátok, hogy van értelme:)

Ajánlott: