第1步:收集材料和工具。
組件。
這個(gè)項(xiàng)目建立在我當(dāng)?shù)?a href="http://www.www27dydycom.cn/v/tag/3822/" target="_blank">DIY商店的吱吱愛(ài)好板上。該板尺寸為850mm寬,500mm高,18mm深。
本項(xiàng)目中使用的LED為5050 WS2812b,安裝在圓形PCB上,直徑約9mm,后面有焊盤(pán)。
《我正在使用Arduino Pro Mini兼容的微控制器。它的5V 16 MHZ版本。我之所以選擇這款產(chǎn)品,是因?yàn)樗哂谐≡O(shè)計(jì),小尺寸和所有必需的端口以及未來(lái)升級(jí)的備用空間。它也是5伏特,所以我可以使用單個(gè)電源為L(zhǎng)ED,微控制器和RTC
時(shí)間保持由具有DS3231芯片的RTC(實(shí)時(shí)時(shí)鐘)模塊負(fù)責(zé)。這個(gè)芯片非常準(zhǔn)確,所以時(shí)間不應(yīng)該漂移太多。
也使用:
電線。焊錫和熱膠。
工具:
電鉆和木鉆頭(10mm和5mm)
烙鐵
熱膠槍
電線狙擊
Dremel和插入式路由器配件
第2步:標(biāo)記,鉆孔和布線
鉆井
使用海峽邊緣通過(guò)從對(duì)角處畫(huà)一條線來(lái)找到板的中心。
使用一根繩子和一支筆標(biāo)記3個(gè)圓圈。最外面的圓圈距離板邊緣約20mm,另外兩條線距離最后一條線15mm。
我使用一個(gè)印刷的鐘面來(lái)幫助我在內(nèi)線的外部2行和小時(shí)上標(biāo)出每個(gè)分鐘和秒的位置。
每小時(shí),分鐘和秒鐘鉆出約5毫米深的10毫米孔。
使用5毫米鉆頭在板上打小時(shí),分鐘和秒鐘。
路由
雖然這一步驟不是必需的,但它可以讓時(shí)鐘與墻壁齊平。
使用路由器和圓形導(dǎo)軌在電路板上布線線路
Mark將RTC和微控制器的凹槽輸出并布線。
將通道從外線布線到凹槽中以便接線
步驟3:如此多的士兵,切割和剝離。
下一部分比說(shuō)起來(lái)容易得多。我的建議是注意趕緊。嘗試找到一個(gè)系統(tǒng)并進(jìn)入一個(gè)節(jié)奏。
每個(gè)LED需要5伏輸入,5伏輸出,數(shù)據(jù)輸入,數(shù)據(jù)輸出,接地和接地。包括微控制器和RTC的電源,其400多根電線,兩端均剝離和焊接。
粘性藍(lán)色物質(zhì)對(duì)此步驟非常有用。
I首先將2個(gè)LED放在彼此相鄰的孔中,以計(jì)算出相互連接所需的導(dǎo)線長(zhǎng)度。
使用第一根導(dǎo)線作為導(dǎo)向,然后切割60根每根彩色導(dǎo)線。
從每根導(dǎo)線的末端剝?nèi)?毫米的套管,并用焊料將它們焊接。
在每個(gè)LED焊盤(pán)上焊接一小滴焊料。
將導(dǎo)線焊接到LED上,形成兩條60分鐘和幾秒鐘的鏈條,以及一條12小時(shí)的鏈條。我用紅線表示5V,黃色表示數(shù)據(jù),藍(lán)色表示接地。
注意將每個(gè)數(shù)據(jù)輸出(DOUT)連接到下一個(gè)LED的數(shù)據(jù)輸入(DIN)
每個(gè)鏈中的最后一個(gè)LED不需要數(shù)據(jù)輸出線。
一旦完成所有鏈條,最好在安裝它們之前測(cè)試它們。我用我的Arduino UNO和Adafruit NeoPixel Strand Test來(lái)確認(rèn)每個(gè)LED都在工作。
將更長(zhǎng)的導(dǎo)線焊接到每個(gè)鏈上,用于5V,接地和數(shù)據(jù)輸入。
此時(shí)應(yīng)該有五條5v線,三根數(shù)據(jù)線連接到Arduino Pro Mini和5地線。
從5v導(dǎo)線末端剝離5mm并將它們?nèi)亢附釉谝黄鸩⒅貜?fù)接地線。
完成三個(gè)鏈條后,將一根5V導(dǎo)線焊接到Arduino Pro Mini的RAW引腳上,也可以放在RTC的VCC引腳上。接地線連接到Arduino Pro Mini和RTC上的GND,再接下來(lái)兩條線:
SCL 從RTC到Pro Mini上的 A5
SDA f 將RTC轉(zhuǎn)換為 A4 o n Pro Mini
來(lái)自 LED的數(shù)據(jù)線應(yīng)該連接到:
秒》 - 數(shù)字Pin 3 。
分鐘 - 數(shù)字 Pin 4
小時(shí) - 數(shù)字 第5針
第4步:安裝
焊接后,將LED安裝在孔中應(yīng)該是直線的。需要安裝LED,因此當(dāng)代碼設(shè)置為正面時(shí),數(shù)據(jù)在逆時(shí)針?lè)较蜻\(yùn)行,因?yàn)榇a設(shè)置在前面。
我使用了少量的熱膠將它們固定下來(lái)希望能夠在將來(lái)發(fā)生故障時(shí)更換單個(gè)LED。
我還使用熱膠來(lái)保持所有電線整潔,并將桶形連接器固定到電路板上。
有許多arduino pro mini編程指南可供使用。我使用外部USB到串行轉(zhuǎn)換器方法將此代碼加載到Arduino上:
此代碼還將RTC上的時(shí)間設(shè)置為編譯時(shí)。因此,重要的是只需上傳按鈕,以便它盡快符合并上傳。
這些代碼的大部分都來(lái)自Andy Doro的NeoPixel Ring Clock。一些來(lái)自Adafruit NeoPixel Strand Test和一些我放在一起。
您需要安裝一些庫(kù)。它們可以從Arduino軟件的Libraries Manager獲得。
用于ws2812b LED的Adafruit NeoPixel
用于通過(guò)I2C與RTC通信的線路(這是作為標(biāo)準(zhǔn)內(nèi)置的)
和RTClib知道詢(xún)問(wèn)RTC的內(nèi)容
/**************************************************************************
* *
NeoPixel Ring Clock
by Andy Doro (mail@andydoro.com)
http://andydoro.com/ringclock/
* *
**************************************************************************
Revision History
Date By What
20140320 AFD First draft
20160105 AFD Faded arcs
20160916 AFD Trinket compatible
20170727 AFD added STARTPIXEL for 3D enclosure, variable starting point, added automatic DST support
20180424 AFD using DST library https://github.com/andydoro/DST_RTC
*
/ include the library code:
#include
#include
#include
// define pins
#define SECPIN 3
#define MINPIN 4
#define HOUPIN 5
#define BRIGHTNESS 20 // set max brightness
#define r 10
#define g 10
#define b 10
RTC_DS3231 rtc; // Establish clock object
Adafruit_NeoPixel stripS = Adafruit_NeoPixel(60, SECPIN, NEO_GRB + NEO_KHZ800); // strip object
Adafruit_NeoPixel stripM = Adafruit_NeoPixel(60, MINPIN, NEO_GRB + NEO_KHZ800); // strip object
Adafruit_NeoPixel stripH = Adafruit_NeoPixel(24, HOUPIN, NEO_GRB + NEO_KHZ800); // strip object
byte pixelColorRed, pixelColorGreen, pixelColorBlue; // holds color values
void setup () {
Wire.begin(); // Begin I2C
rtc.begin(); // begin clock
Serial.begin(9600);
// set pinmodes
pinMode(SECPIN, OUTPUT);
pinMode(MINPIN, OUTPUT);
pinMode(HOUPIN, OUTPUT);
if (rtc.lostPower()) {
Serial.println(“RTC lost power, lets set the time!”);
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
stripS.begin();
stripM.begin();
stripH.begin();
//strip.show(); // Initialize all pixels to ‘off’
// startup sequence
delay(500);
colorWipeS(stripS.Color(0, g, 0), 5); // Blue
colorWipeM(stripM.Color(r, 0, 0), 5); // Blue
colorWipeH(stripH.Color(0, 0, b), 50); // Blue
delay(1000);
DateTime theTime = rtc.now(); // takes into account DST
byte secondval = theTime.second(); // get seconds
byte minuteval = theTime.minute(); // get minutes
int hourval = theTime.hour();
hourval = hourval % 12; // This clock is 12 hour, if 13-23, convert to 0-11`
for (uint16_t i = 0; i 《 secondval ; i++) {
stripS.setPixelColor(i, 0,0,b);
stripS.show();
delay(5);
}
for (uint16_t i = 0; i 《 minuteval ; i++) {
stripM.setPixelColor(i, 0,g,0);
stripM.show();
delay(5);
}
for (uint16_t i = 0; i 《 hourval ; i++) {
stripH.setPixelColor(i, r,0,0);
stripH.show();
delay(5);
}
}
void loop () {
// get time
DateTime theTime = rtc.now(); // takes into account DST
byte secondval = theTime.second(); // get seconds
byte minuteval = theTime.minute(); // get minutes
int hourval = theTime.hour(); // get hours
hourval = hourval % 12; // This clock is 12 hour, if 13-23, convert to 0-11`
stripS.setPixelColor(secondval, 0,0,20);
stripS.show();
delay(10);
if (secondval ==59 ) {
for (uint8_t i = stripS.numPixels(); i 》 0; i--) {
stripS.setPixelColor(i, 0,g,0);
stripS.show();
delay(16);}
}
stripM.setPixelColor(minuteval, 0,g,0);
stripM.show();
delay(10);
if (secondval ==59 && minuteval == 59) {
for (uint8_t i = stripM.numPixels(); i 》 0; i--) {
stripM.setPixelColor(i, r,0,0);
stripM.show();
delay(16);}
}
stripH.setPixelColor(hourval, r,0,0);
stripH.show();
delay(10);
if (secondval == 59 && minuteval == 59 && hourval == 11) {
for (uint8_t i = stripH.numPixels(); i 》 0; i--) {
stripH.setPixelColor(i, 0,0,b);
stripH.show();
delay(83);}
}
// for serial debugging
Serial.print(hourval, DEC);
Serial.print(‘:’);
Serial.print(minuteval, DEC);
Serial.print(‘:’);
Serial.println(secondval, DEC);
}
// Fill the dots one after the other with a color
void colorWipeS(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i 《 stripS.numPixels(); i++) {
stripS.setPixelColor(i, c);
stripS.show();
delay(wait);
}
}
void colorWipeM(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i 《 stripM.numPixels(); i++) {
stripM.setPixelColor(i, c);
stripM.show();
delay(wait);
}
}
void colorWipeH(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i 《 stripH.numPixels(); i++) {
stripH.setPixelColor(i, c);
stripH.show();
delay(wait);
}
}
步驟5:最后的接觸
現(xiàn)在應(yīng)該留下的只是將RTC和微控制器固定在凹槽中。
我已經(jīng)將RTC電池安裝在一邊,這樣我就可以輕松如果需要,請(qǐng)更換電池。
將5v電線連接到連接器的+側(cè),將接地連接到 - 側(cè)
將電源連接起來(lái)!
我已經(jīng)連接到USB電池組,但USB手機(jī)充電器也可以正常工作。
注意:
LED的亮度設(shè)置在代碼中。它被設(shè)置為低電平以保持低電流。在所有LED點(diǎn)亮的全亮度下,它可以汲取近8安培。當(dāng)前設(shè)置小于1.
-
led
+關(guān)注
關(guān)注
242文章
23837瀏覽量
673915 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1899瀏覽量
133200
發(fā)布評(píng)論請(qǐng)先 登錄
圖解單片機(jī)功能與應(yīng)用(完整版)
TRCX應(yīng)用:OLED 像素模擬及電容提取
漫畫(huà)圖解 電感器 抗干擾元器件指南(全彩PDF版)
PCB封裝圖解
無(wú)刷電機(jī)的繞制和接線方法及實(shí)物圖解
時(shí)空刻度:LED電子時(shí)鐘系統(tǒng)如何重塑現(xiàn)代節(jié)奏

開(kāi)源項(xiàng)目!手把手教你制作一個(gè)互動(dòng)式LED墻壁時(shí)鐘!
FRED應(yīng)用:LED發(fā)光顏色優(yōu)化
DS90UB913A-Q1是否支持像素時(shí)鐘74.25MHz的1080p 30的分辨率?
時(shí)序約束一主時(shí)鐘與生成時(shí)鐘

SmartDAC-DIY評(píng)估模塊

窄像素間距矩陣LED顯示屏中的常見(jiàn)LED顯示挑戰(zhàn)

評(píng)論