
Tartalomjegyzék:
2025 Szerző: John Day | [email protected]. Utoljára módosítva: 2025-01-23 14:48

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:


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


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




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



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




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




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


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




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

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


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:
Fából készült LED játékkijelző a Raspberry Pi Zero segítségével: 11 lépés (képekkel)

Fából készült LED -es játékkijelző a Raspberry Pi Zero segítségével: Ez a projekt megvalósítja a 20x10 képpontos WS2812 alapú, 78x35 cm -es LED -kijelzőt, amely könnyen felszerelhető a nappaliban retro játékokhoz. Ennek a mátrixnak az első verzióját 2016 -ban építették, és sok ember újjáépítette. Ez a példa
LED világító, fából készült esküvői óra: 8 lépés (képekkel)

LED-es világítású, fából készült esküvői óra: Azért kezdtem el ezt a projektet, hogy egyedi, egyedülálló esküvői órát készítsek a nővéremnek és sógoromnak. Valami olyat akartak készíteni, amit még sokáig megvilágíthatnak, és megmutathatják az esküvő napjának bizonyos aspektusait. Sok tervezésen ment keresztül
Fából készült LED óra: 5 lépés (képekkel)

Fa LED -es óra: A fából készült LED -óra unalmas fadoboznak tűnik, azzal a kivétellel, hogy az idő izzik előtte. A szürke műanyag darab helyett egy szebb fadarab van. Továbbra is megőrzi minden funkcióját, beleértve
C51 4 bites elektronikus óra - fából készült óra: 15 lépés (képekkel)

C51 4 bites elektronikus óra - fából készült óra: Volt egy kis szabadideje ezen a hétvégén, így összeszereltem ezt a 2,40 USD értékű 4 bites DIY elektronikus digitális órát, amelyet egy ideje vásároltam az AliExpress -től
Doboz a Raspberry Pi B modellhez és a fából készült alátétekből készült tápegységhez: 10 lépés

Doboz a Raspberry Pi B modellhez és a fából készült alátétekből készült tápegység: Doboz, amely a Raspberry Pi 3 B modellt és annak tápegységét cédrusfa alátétekből tartja. Részek: 1. Raspberry Pi 3 B2 modell. Cédrusfa alátétek3. Fa ragasztó 4. 3/4 hüvelykes Milwaukee Dole Dozer lyukfűrész Tűorrögzítő fogó6. 1/2 hüvelyk, #