İçindekiler:
- Adım 1: Ön Katman
- 2. Adım: Kılavuz Katmanını Tasarlama
- 3. Adım: Kılavuz Katmanını Oluşturma
- Adım 4: LED'lerin Kablolanması
- Adım 5: Elektroniği Tasarlamak
- Adım 6: Elektroniği Kablolama
- Adım 7: Programlama
- Adım 8: Muhafaza
- 9. Adım: Kapanış Açıklamaları
Video: Londra Yeraltı Harita Saati: 9 Adım (Resimli)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:16
2014 yılında, Londra'daki bir 3D baskı danışmanlığında stajyerlik ve Stratasys makinelerini kullanarak renkli litofanlarla yaptığım bir deneyden sonra, ofislerine özgü renkli bir tüp hatlarının renkli 3D baskısını tasarlıyorum. Ondan bir şeyler yapmaya kararlıydım. Kısa bir 2 yıl sonra 2016'da kendi 3D yazıcım vardı ve onu bir saate dönüştürmek için işe koyuldum.
Çocukken Tokyo Flash dijital saatlerinin şimdiye kadarki en harika şeyler olduğunu düşünürdüm ve bunun tasarım için ilham noktası olacağına karar verdim.
Ve şimdi onu yazmaya başlayana kadar 4 yıllık küçük bir ara oldu!
Kesin talimatların kopyalanması zor olsa da ve son birkaç yılda hobi PCB üretimindeki maliyetin azalması, LED yerleştirme için kesin yöntemimi geçersiz kılabilir. Umarım paylaşılan fikirler, başkalarının ince nesnelerden tuhaf saatler yapmasına yol açabilir!
Adım 1: Ön Katman
Girişte belirtildiği gibi, bu renkli bir 3D baskıydı, sanırım bir toz yatağı ve bağlayıcı ve pigment için modifiye edilmiş bir mürekkep kartuşu kullanan bir Stratasys makinesi.
Dosya tarihe karıştı, ancak bu katman herhangi bir şey olabilir, bir fotoğraf veya tek renkli bir litofan harikalar yaratabilir.
Bu parça 2014'te 3DS max'ta yapıldı, ancak bugün bir görüntüyü parlaklığa dayalı bir SLT'ye dönüştürmek için çevrimiçi araçlar var.
2. Adım: Kılavuz Katmanını Tasarlama
Bu, projenin karmaşıklığına ve zamanı okuma yöntemine karar verdiğimiz yerdir. Görüntüler, oynadığım 2 fikri gösteriyor.
Bunlar, tasarımda taranarak ve inkscape'de çizgiler çizilerek yapılmıştır.
Bu çok okunabilir bir saat değil, ancak gün boyunca satırları doldurma fikrini tercih ettim, böylece tasarım hedefi haline geldi.
İkili sayım, LED sayısını azaltmak için uygun bir yöntemdir ve eğer sizin sıkışmanız ikili ise okunabilirliği artırır, ancak bu benim 'satırları doldurma' fikrimi baltaladı, bu yüzden bu proje için bir seçenek değildi.
Tokyo Flaş Saatlerinde LED sayısını en aza indirmek yaygındır, ancak bir bölümün 3'lü veya 5'li olarak sayılması ve ardından o bölüm her dolduğunda başka bir dolum yapılması, dakikaları 60'tan 20 artı 2'ye düşürmek için bu tekniği dakikalar için kullandım. saniyeler için kesinlik konusunda çok endişeli değildi.
3. Adım: Kılavuz Katmanını Oluşturma
LED'ler için bu kılavuz katmanın 2 amacı vardır, LED'leri yerinde tutar ve aralarında dökülmeyi önler.
Tasarım düzeni için kullandığım taramanın üzerine doğrudan Inkscape'de bir katman olarak çizildi. Yazıcıma göndermeden önce blendera 1mm kalınlık eklendi.
Bu, yetersiz Makibox A6'mda yapmak zorunda olduğum en zor baskılardan biriydi, parça abs olarak basıldı, böylece minimum bükülme ile yapı platformuna bağlı tutmak için bir ton aseton bulamacı kullanıldı. Neyse ki bu kısım nihai üründe görünmüyor
Son görüntü, boşluk olup olmadığını kontrol etmek için bir lambaya tutulduğunu gösteriyor.
Geriye dönüp bakıldığında, bir çizgi boyunca ışıkların arasına dökülme, görseller için aslında tercih edilebilir, okunması zor değil, bu, her ışığın kısa kenarlarına kılavuza bir pah eklenerek sağlanabilir.
Adım 4: LED'lerin Kablolanması
İlk resim, delik boyutlandırmasını kontrol etmek için yaptığım test baskısını gösteriyor, LED'in küçük bir kuvvetle dantele tam oturmasını hedefliyordum, daha sonra kılavuz katmanı yerleştirirken doğru şekil elle yerleştirildi.
3D yazıcımın düşük toleransı nedeniyle, bazıları gevşekti ve yerinde kalması için bir miktar süper yapıştırıcı gerekiyordu, diğerleri ise çok sıkıydı, ancak lehimleme sırasında LED'e bastırılarak yerine oturması teşvik edildi, bu aslında daha uygundu. doğru boyuttaki delik, bir kez kablolandıktan sonra çekilecek bir kiracılığa sahipti.
Kablo sayısını azaltmak için LED'ler 7'ye 8'lik bir matriste lehimlendi, yani 55 LED'in tümü yalnızca 13 pim ile kontrol edilebilir, bu bağlantıların her birinin ne yazık ki kaybolmuş olan elle çizilmiş bir haritasını aldım.
Emaye tel kullanıldı, böylece bağlantı yapılmadan önce bir bölümü ütüyle ısıtarak ve kalaylayarak bölümlerin yerinde açığa çıkması sağlandı.
Bu süreç çok zaman alıcıydı, bir PCB tasarlamanızı şiddetle tavsiye ederim.
Adım 5: Elektroniği Tasarlamak
İlk planım, RTC'li bir Arduino mikro denetleyici kullanmaktı, ancak otomatik gün ışığından tasarruf ve WIFI üzerinden kontrol potansiyeline izin verdiği için Düğüm MCU D1 kartında bir ESP8266'yı seçti.
Pin sayısını daha da azaltmak için, bir MAX7219 (64 LED'e kadar işleyebilir) kullanabilmek için mükemmel sayıda LED'im vardı.
Bu IC yaygın olarak LED 7 Segment ekranları çalıştırmak için kullanılır, ancak benimkine çok benzer bir kullanım durumu vardı, minimum titreme ile rastgele sayıda LED'i aydınlattı, hatta kontrol edilebilir parlaklığa sahip.
Kablolama için protokol kullanmaya karar verdim, ancak kartal parça yerleştirme ve kablolamayı anlama konusunda yardımcı oldu
Pano dosyalarımı ekledim, ancak bu, Eagle'ı (ve şimdiye kadar güncel olmayan bir sürümü) ilk kez kullandığım için yalnızca referans amaçlıdır.
Adım 6: Elektroniği Kablolama
Bu, Eagle şemasını izleyerek, ESP ve LED matrisi için başlıkların kullanılması, montajda büyük ölçüde yardımcı olan, tekrar eden basit bir adımdı.
Anot ve Katot LED başlıklarındaki Pin 1 gümüş bir keskinlikle işaretlenmiştir, 7 ve diğer 8 olduğu gibi ayırt edilebilirler.
Adım 7: Programlama
Ekranımız geleneksel bir matris olmadığı için, HEX'te MAX IC'ye hangi bitlerin açılacağını görselleştirmek için bir yöntem bulmam gerekiyordu. Neyse ki, başımı belaya sokacak kadar excel biliyorum ve görüntülenmesini istediğim desene rağmen bana rehberlik edecek bir 'Hex sihirbazı' yaptım, elle yerleştirilmiş onay kutuları.
Bu, saatim, dakikam ve saniyem için hex'in bitsel OR kullanılarak birleştirilebileceğinin yeniden değerlendirilmesiyle geldi, max7219'a göndermek için son hex komutunu üretmek için saniyelere eklediğim küçük bir animasyon da dahil olmak üzere tahtadan emin olabilirim. donmamıştı.
Yani, neredeyse sonunda. ve çok iyi yaşlanmamış başka bir karar için zaman.
ESP'nin kodu LUA'da, Bugün, ESP topluluğu hala olgunlaşmaktayken, daha iyi dokümantasyon ve sağlam paket kitaplığı için arduino IDE'yi kullanmanızı tavsiye ederim ve bu proje için dil olarak LUA'yı seçtim.
Saati okumak için google sunucularına düzenli olarak ping atmak konusunda şüpheli bir karar verdim. Bu, kaymayı en aza indirmek için bir RTC'ye ihtiyaç duymayı ortadan kaldırdı, bu işe yarıyor, ancak gerçek zamanlı bir API kullanmanız daha iyi olur.
yarımSn = 0saat=0 dakika=0 saniye=0
düşükYoğunluk = 0
yüksek Yoğunluk = 9
yerel SSID = "Wifi"
yerel SSID_PASSWORD ="Parola"
function time() -- geçerli saati ve tarihi almak için internete bağlanın
wifi.sta.getip() ise local conn=net.createConnection(net. TCP, 0) conn:connect(80, "google.com")
conn:on("bağlantı", function(bağ, payload) conn:send("HEAD / HTTP/1.1\r\n".. "Host: time.is\r\n".. "Kabul et: */*\r\n".. " Kullanıcı Aracısı: Mozilla/4.0 (uyumlu; esp8266 Lua;)".. "\r\n\r\n") sonu)
conn:on("al", function(conn, payload) --print(payload) conn:close() local p=string.find(payload, "GMT") -- internetten yükteki saat ve tarih dizesini bulun, p~ ise saat dilimini değiştirin =nil o zaman -- saat, dakika, saniye, gün, aya karşılık gelen sayıları çıkar saat=tonumber(string.sub(payload, p-9, p-8)) dakika=tonumber(string.sub(payload, p-) 6, p-5) saniye=tonumber(string.sub(payload, p-3, p-2))) addHour() --hard kodlu BST (İngiliz yaz saati) yaz saati uygulaması (saat, dakika, saniye) yarımSaniye = (second%6)*2 --print(halfSec) else print("web güncellemesi başarısız!") end end --function) --end of "receive" olay işleyicisi
conn:on("bağlantıyı kesme", function(bağ, yük) conn=nil yük=nil end) end print("henüz wifi yok") end
function borTable(a, b, …) --bitsel VEYA tabloları birlikte
arg[1] ise, o zaman b = borTable(b, unpack(arg)) end local z = {} for i, v in ipairs(a) do table.insert(z, bit.bor(v, b)) son dönüş z son
function bxorTable(a, b, …) --bitsel VEYA tabloları birlikte
arg[1] ise, o zaman b = bxorTable(b, unpack(arg)) end local z = {} for i, v ipairs(a)'de do table.insert(z, bit.bxor(v, b)) son dönüş z son
işlev addSecond()
saniye=saniye+1 saniye>=60 ise saniye=0 dakika=dakika+1 dakika>=60 ise dakika=0 addHour() end end end
işlev eklemeSaati()
saat=saat+1 ise saat>=24 ise saat=0 biter saat == 2 veya saat == 16 ise max7219.setIntensity(lowIntensity) biter saat == 8 veya saat == 18 ise max7219.setIntensity(highIntensity) end end function update() yerel secGap = 6 yerel minGap = 3 yerel horGap = 1 yerel sec={ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x03}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03}, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x01, 0x03}, { 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03}, { 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x }, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x03} }; yerel min={ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00}, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x12, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x12, 0x10}, { 0x02, 0x02, 0x02, 0x02, 0x12, 0x10, 0x12, 0x10 }, { 0x02, 0x02, 0x02, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x02, 0x02, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x02, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x12, 0x10}, { 0x12, 0x12, 0x12, 0x12, 0x12, 0x30, 0x12, 0x10}, { 0x12, 0x12, 0x12, 0x12, 0x32, 0x30, 0x12, 0x10}, { 0x12, 0x12, 0x12, 0x32, 0x32, 0x30, 0x12, 0x10}, { 0x12, 0x12, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10}, { 0x12, 0x32, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10}, { 0x32, 0x32, 0x32, 0x32, 0x32, 0x30, 0x12, 0x10} }; yerel hor={ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00}, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x08}, { 0x04, 0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, }, { 0x04, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x08}, { 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, { 0x04, 0x04, 0x0C, 0x0C, 0x0C, 0x0C,, 0x0C, 0x08}, { 0x04, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08C, 0x0C, 0x08}, 0x0C,0x0C, 0x0C, 0x0C, 0x0C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x4C, 0x48C, {0x4C, 0x48}, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, { 0x0C, 0x0C, 0x4C, 0x4C, 0x4C, 0x0C, 0x4C, 0x0,4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48}, {0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x48} }; --print(saat, dakika, saniye)
--tablo 0'da başlar, yani şu anda 1'de sec[0] = nil)
max7219.write({animate(borTable(sec[1+(saniye/snGap)], min[1+(dakika/minGap)], hor[1+(saat/horGap)]))})
bitiş --fonksiyon
wifi.setmode(wifi. İSTASYON)
wifi.sta.config(SSID, SSID_PASSWORD) wifi.sta.autoconnect(1)
-- max7219'u yapılandır
max7219 = require("max7219") max7219.setup({numberOfModules = 1, slaveSelectPin = 8, yoğunluk = yüksekYoğunluk })
--Ana program
checkOnline = tmr.create()
tmr.alarm(0, 180000, 1, zaman)
tmr.alarm(1, 1000, 1, addSecond)
tmr.alarm(2, 500, 1, güncelleme)
işlev canlandır (hareketsiz)
yerel çerçeveler={ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; halfSec=halfSec+1, eğer halfSec >=12 ise, halfSec = 0 end --print(halfSec) return bxorTable(frames[halfSec+1], still) end
Adım 8: Muhafaza
Şimdi inanılmaz işçiliğinizi sergileme ve projeye ev sahipliği yapma zamanı.
Ya öyle ya da geri dönüşümden bir amazon paketi alın ve bugün hala kullanımda olan geçici bir konut yapın.
Bu yaklaşımı kullanmanın yararı, projenin her katmanının kartonun kalınlığına neredeyse mükemmel şekilde uymasıydı, böylece bir sandviç istiflenip birbirine bantlanabilirdi. Benzer bir premium sürüm akrilik kullanabilir
9. Adım: Kapanış Açıklamaları
Okuduğunuz için teşekkürler, Çoğunuzun bildiği gibi bir projeyi belgelemek, onu yapmak kadar zor olabilir. Sonunda gün ışığını görebilecek konuştuğum video parçaları var.
Bu projeyi yapmak ve yazmak arasındaki yıllarda, 3D baskı kullanan daha fazla rastgele LED ekran örneği görmeyi bekliyordum, ancak RGB şeritlerindeki azalma, alternatif ihtiyacını çoğunlukla ortadan kaldırdı.
Umarım bu bilgilendirici olmuştur ve tam olarak tatmin etmeyen bölümler hakkında daha fazla ayrıntı vermeye çalışacağım için lütfen sorular sorun.
Şerefe
Önerilen:
ESP8266'yı Kullanan Ağ Saati Dijital Saati: 4 Adım (Resimlerle)
ESP8266'yı Kullanarak Ağ Saati Dijital Saati: NTP sunucuları ile iletişim kuran ve ağ veya internet saatini gösteren küçük şirin bir dijital saatin nasıl oluşturulacağını öğreniyoruz. WeMos D1 mini'yi bir WiFi ağına bağlanmak, NTP zamanını almak ve bir OLED modülünde görüntülemek için kullanıyoruz.Yukarıdaki video t
Emeklilik Saati / Sayım/Dn Saati: 4 Adım (Resimli)
Emeklilik Saati / Sayım / Dn Saati: Çekmecede bu 8x8 LED nokta vuruşlu ekranlardan birkaçı vardı ve onlarla ne yapacağımı düşünüyordum. Diğer talimatlardan esinlenerek, gelecekteki bir tarihe/saate geri sayım yapmak için bir geri sayım/yukarı geri sayım ekranı oluşturma fikrini aldım ve eğer hedef zaman p
Londra Yeraltı Jübile Hattı Kapı Düğmesini Hacklemek: 12 Adım (Resimlerle)
Londra Yeraltı Jübile Hattı Kapı Düğmesini Hacklemek: Londra Ulaşım Müzesi mağazası, Jubilee Hattı'ndan hizmet dışı bırakılan kapı düğmeleri satıyor (hem sol hem de sağ mevcuttur). Düğmeye ve bir çeşit gösterge ışığına ihtiyaç duyan bir proje yapmayı düşünüyorsanız, '
İnternet Saati: NTP Protokolüyle ESP8266 NodeMCU Kullanan OLED İle Tarih ve Saati Görüntüleme: 6 Adım
İnternet Saati: OLED ile Tarih ve Saati Görüntüleme ESP8266 ile NodeMCU Kullanarak NTP Protokolü ile: Merhaba arkadaşlar, bu talimatta internetten zaman alacak bir internet saati oluşturacağız, böylece bu projenin çalışması için herhangi bir RTC'ye ihtiyacı olmayacak, sadece bir çalışan internet bağlantısı Ve bu proje için bir esp8266'ya ihtiyacınız var
Düşük Kaynak Ayarları için Yeraltı Suyu Seviye Ölçüm Probu: 4 Adım (Resimlerle)
Düşük Kaynak Ayarları için Yeraltı Suyu Seviyesi Ölçüm Probu: GirişOxfam'dan, Afganistan'daki okul çocuklarının yakındaki kuyulardaki yeraltı suyu seviyelerini izleyebileceği basit bir yol geliştirme talebi aldık. Bu sayfa Dr. Amir Haidari tarafından Dari'ye çevrilmiştir ve çeviri f