圣誕節又來了,無論是一年中最喜歡的假期還是冷汗帶走,裝飾品都在增加。今年,為什么不在您的裝飾品中加入一些DIY技術以使其脫穎而出呢?
在此項目中,我們將從頭開始構建防風雨,運動激活的8 x 8 LED矩陣……價格不到20美元。盡管可以在房子周圍的任何地方使用,但它的設計都適合放在標準圣誕門花環的中央。而且由于它是電池供電的,所以也可以在房子外的任何地方!
零件清單
對于此項目,您將需要:
我使用Nano的原因是它的體積很小,但是您幾乎可以使用任何與Arduino兼容的微控制器。
64個xred LED。
8 x 220歐姆電阻。
許多Arduino入門套件都附帶了這些。我從亞馬遜以10美元的價格購買了多包包裝。
一塊原型板。
這里使用的是9 x 7厘米,盡管可以使用任何大小的電池。
7-12v電池。出于經濟原因,這里使用了一個簡單的電池組,但是移動銀行充電器可能持續時間更長。
各種短導線。
特百惠盒或類似的防風雨外殼。
確保將
圣誕花環。足夠大以容納所有組件了。
任何人都可以,只要確保外殼盒可以放入其中即可。
li》
焊接鐵和焊料。
雖然不是嚴格必要的,因為您可以將組件直接焊接到Nano上,但我還發現了一塊小面包板在測試時非常有用。 Ahot膠槍還有助于將所有零件組裝在一起。
該項目需要大量的焊接,作為初學者,這似乎令人生畏。我個人還是焊接的初學者,發現它并不像看起來那樣具有挑戰性或耗時。如果您還不熟悉焊接,這里有一些很好的技巧可以幫助您。
如果您真的不熱衷于焊接,可以使用LED燈條或現成的項目來完成此項目。入門套件中可能包含的LED矩陣。如果您決定走那條路線,則必須進行一些代碼調整。
設置Arduino
我們將從Arduino的電路圖以及將要連接的電線開始
在矩陣內部
現在制作我們的8 x 8 LED矩陣。首先創建矩陣的一行和一列是一個好主意,以確保它恰好位于原型板上的位置。
在上面的照片中,所有的LED均已放置,使得陽極(較長的正極腳)朝向原型板的頂部。這很重要,因為我們將通過將共同的陽極連接在一起來創建共同的陽極列,以及共同的陰極行(較短的負極)。立即解決此問題將在以后省去頭痛!
我們將建立一個公共的行陰極矩陣,該圖顯示了它們如何連接。
乍一看可能有些令人生畏,但這是一個非常簡單的配置。在每一行中,所有陰極從右到左連接,然后連接到我們的Arduino引腳之一。之后,我們對陽極的每一列都執行相同的操作。這樣,根據我們加電的那一列以及接地的那一行,我們可以打開陣列中的任何單個LED。
讓焊接開始
開始通過放置第一排LED。確保所有陽極都朝向頂部,并將其翻轉過來。我發現在每個角落添加另一個LED,并使用一根彈性繩將另一塊Protoboard固定在頂部有助于將所有東西固定在適當的位置。
現在通過將每個LED的陰極(短)腳向左彎曲,使它們彼此重疊。從左側開始向右操作最簡單。如果您使用一塊較大的原型板,則可以先將它們焊接到板上,然后使用焊盤將它們連接在一起。注意不要將任何陰極連接到板上的任何其他線或陽極上!
對所有八行重復此過程,完成后,您應該會看到類似以下內容的東西:
跳躍陽極!
陽極的列是多一點點。在上圖中,陽極每次穿過一排陰極時就會彎曲。這是因為它們根本無法觸摸行。我們必須將陽極彎曲到陰極行上方,并將它們彼此連接。您可能會發現用筆彎曲腿有很大幫助。
對每一排陽極執行此操作,并在每個頂部連接一個電阻陽極。您可能會發現將電阻器放置在原型板的下一個孔中并使用焊料將其連接起來更為容易。您現在應該有這樣的內容:
恭喜! LED矩陣已完成。在此階段,請徹底檢查焊接,以確保沒有間斷,并且所有列均未接觸到行。如果它看起來不漂亮,請不要擔心,我們只需要它起作用即可!您現在可以通過在列的任意一端附加5v,并在行的任意一端接地來分別檢查每個LED。
如上圖所示,將連接線連接到每一列和每一行,然后將其連接到您的Arduino。
讓我們開始編碼
打開Arduino IDE,選擇您的開發板,然后港口。如果您不熟悉Arduino,請查閱此入門指南。
將此代碼輸入編輯器。如果您不熟悉它,則它是非常密集的代碼,但是可以在此處使用完整注釋的代碼來幫助理解它的工作原理。
const int row[8] = {
2,3,4,5,6,7,8,9
};
const int col[8] ={
10,11,12,14,15,16,17,18
};
int pirPin = 19;
int pirState = LOW;
int val = 0;
bool pirTrigger = false;
const int pirLockTime = 12000;
int pirCountdown = pirLockTime;
int pixels[8][8];
const int refreshSpeed = 500;
int countDown = refreshSpeed;
int currentCharIndex = 0;
typedef bool CHAR_MAP_NAME[8][8];
const CHAR_MAP_NAME blank = {
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
};
const CHAR_MAP_NAME threedownthreein = {
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 1 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},
};
const int noOfFrames = 5;
const CHAR_MAP_NAME *charMap[noOfFrames] ={
&blank,
&threedownthreein,
&blank,
&blank,
&threedownthreein
};
void setup(){
for (int i=0;i《8;i++){
pinMode(row[i], OUTPUT);
pinMode(col[i],OUTPUT);
//motion sensor
pinMode(pirPin, INPUT);
digitalWrite(col[i], LOW);
}
}
void screenSetup(){
const CHAR_MAP_NAME *thisMap = charMap[currentCharIndex];
for (int x = 0; x 《 8; x++)
{
for (int y = 0; y 《 8; y++) { bool on = (*thisMap)[x][y]; if(on) { pixels[x][y] = HIGH; } else { pixels[x][y] = LOW; } } } currentCharIndex++; if(currentCharIndex》=noOfFrames){
currentCharIndex = 0;
}
}
void refreshScreen(){
for (int currentRow = 0; currentRow 《 8; currentRow++){
digitalWrite(row[currentRow], LOW);
for (int currentCol = 0; currentCol 《 8; currentCol++){
int thisPixel = pixels[currentRow][currentCol];
digitalWrite(col[currentCol], thisPixel);
if (thisPixel == HIGH) {
digitalWrite(col[currentCol], LOW);
}
}
digitalWrite(row[currentRow], HIGH);
}
}
void loop(){
val = digitalRead(pirPin);
if (val == HIGH){
pirTrigger = true;
}
else if (val == LOW && pirCountdown 《=0) { pirTrigger=false; pirCountdown = pirLockTime; } if(pirTrigger==true && pirCountdown 》 0)
{
refreshScreen();
countDown--;
pirCountdown--;
if(countDown 《= 0)
{
countDown = refreshSpeed;
screenSetup();
}
}
}
要理解的重要部分是:
refreshSpeed 變量。此變量確定每個屏幕之間的時間刷新方式。數字越大意味著等待時間越長。
常量 CHAR_MAP_NAME s。在此處放置要顯示的每個字符映射表(或框架,如果更容易想到它們的話)。
noOfFrames 變量。這決定了一個完整播放中顯示多少幀。請注意,它可以與字符映射表的數量不同。例如,如果要顯示“ A CAT”,則只需要定義四個不同的框架:空白, A , C 和 T 。
現在,當運動傳感器檢測到運動時,LED屏幕應使LED向下閃爍3次,并從左上角閃爍3次。如果顯示不正確,請再次檢查接線,以確保一切均在正確的位置!當您添加自己的圖像或消息時,它可能會過早切斷或播放時間過長。嘗試更改 pirLockTime 變量,直到它播放所需的時間。
將每幀添加到LED顯示屏的過程可能有點繁瑣,因此我們創建了此電子表格,以便為您的LED矩陣創建文本和圖像(創建Google表格的副本,以便您對其進行編輯)變得更加容易。
使用電子表格,您可以將創建的內容直接復制到代碼。
使它勇于挑戰
現在,我們有了一個有效的LED矩陣,我們需要一種方法來使其在冬天的天氣中生存下來。雖然此方法可能無法經受熱帶風暴或在游泳池中浸泡,但應足以保護所有電子設備免受元件侵害。
我使用了直徑為15厘米的圓形特百惠盒子和6厘米深,因為它完全適合我的組件。在蓋子上切一個比您的LED矩陣稍大的窗戶,并在上面貼上一層透明的塑料膜,確保沒有液體進入的空間。用某些包裝堅固的塑料效果最好,但這就是我的全部。您也可以為原型板安裝一些安裝座,盡管兩個工作都可以使用堅固的防水膠帶輕松完成。
接下來,在Protoboard的下面做一個小孔然后小心緩慢地加寬窗口,直到您的PIR傳感器只能通過。您希望它盡可能貼合。
安裝PIR傳感器,并用膠帶或熱膠填充您可以看到的任何間隙。/p》
清理所有可能使包裝盒無法正常關閉的膠帶或膠水,然后將所有組件和電池一起添加到包裝盒中。在這里,使用了一個簡單的AA電池組,直接插入Nano的VCC引腳。將幾小瓶軟木塞添加到外殼的外部,以幫助將模型懸掛在花環的中央。
然后我們完成了
一旦盒子被密封,將其與您的圣誕花環一起懸掛,并等待您的訪客對您低于20美元的高科技個人歡迎商品做出反應!您甚至可以更進一步,還可以為房子周圍的其他地方創建很棒的DIY裝飾!
在此項目中,我們建立了一個獨立的LED矩陣從零開始的運動系統,即運動激活的系統,即使在最惡劣的天氣下,也可以在室外生存。在其他項目的假期結束后,此構建將很有用,并且可以使用相同的技術為其他項目創建便宜的防風雨外殼。
責任編輯:wv
-
Arduino
+關注
關注
188文章
6485瀏覽量
189636 -
LED矩陣
+關注
關注
0文章
71瀏覽量
17807
發布評論請先 登錄
相關推薦
夢幻圣誕季,LED 點亮別樣浪漫

TLC6984 48×16共陰極矩陣LED顯示驅動器評估模塊

LP5891-Q1 48×16共陰極矩陣LED顯示驅動器評估模塊

脈沖全閉環EtherCAT運動控制器的固件升級

基于LP50xx器件的全彩RGB LED矩陣系統設計指南

機器人的三大矩陣是什么及關系式
LED機械矩陣屏:打造獨特視覺效果的視覺盛宴
esp8266怎樣才能正確的把更新的代碼升級到target上?
BP神經網絡激活函數怎么選擇
【Vision Board創客營連載體驗】利用 OpenMV 實現 AprilTag 跟蹤以及通過串口通訊控制 Arduino 驅動 LED 燈帶
圣誕樹燈電路圖分享

評論