該項目主要是為帶有移位寄存器的發(fā)光二極管立方體(4*4)編寫代碼,為立方體創(chuàng)造不同的模式。
硬件組件:
Arduino Nano R3
移位寄存器75HC595
瞬時按鈕開關(guān)
發(fā)光二極管
4*4立方體:
該立方體有16條腿和4排的立方體。Les s把這些行叫做層。如何將這16條支路連接到Arduino而不占用其所有引腳的最簡單方法是使用移位寄存器75HC595。
(移位寄存器75HC595)
將立方體的前8個引腳(1-8)連接到第一個移位寄存器(引腳Q0-Q7),并將其他8個引腳(9-16)連接到另一個引腳,如俯視圖中的表格所示:
(俯視立方體的腿)
下一步是用Arduino連接移位寄存器的引腳,如下所示:
引腳8(兩個移位寄存器/ GND)至阿爾杜伊諾的接地引腳
第一移位寄存器的引腳9 (Q7)至第二移位寄存器的引腳14(數(shù)據(jù))
引腳10(兩個移位寄存器/復(fù)位)至Arduino的引腳8
引腳11(兩個移位寄存器/時鐘)至Arduino的引腳9
引腳12(兩個移位寄存器/鎖存器)至Arduino的引腳10
引腳14(第一個移位寄存器/數(shù)據(jù))至Arduino的引腳11
引腳16(兩個移位寄存器/ VCC)至Arduino的5V引腳
最后一步是用Arduino連接立方體的層:
引腳4 -第0層(通過100歐姆電阻)
引腳5 -第1層(通過100歐姆電阻)
引腳6 -第2層(通過100歐姆電阻)
引腳7 -第3層(通過100歐姆電阻)
(立方體的底部)
控制led:
一層中的每個led都由一個數(shù)字表示,如下表所示:
(打開指示燈的值)
所以要打開圖層第二行的第二個led,就會設(shè)置layer = 32。要打開前兩個led,layer = 1 + 2 = 3。要打開第一行l(wèi)ed,layer = 1 + 2 + 4 + 8 = 15。
如果想將循環(huán)中的光穿過層中的所有LED,在第一步中,設(shè)置layer=b000000000000001=1,然后在循環(huán)中,將通過設(shè)置layer=layer《《1來移動該位。或者可以設(shè)置layer=(1《《count)并在循環(huán)中增加“count”。
主回路:
當(dāng)知道如何在一層中設(shè)置led時,想要控制4層。雖然只能向我們的2個移位寄存器發(fā)送關(guān)于1層的信息,但使用Arduino的主循環(huán)來非??焖俚卮蜷_和關(guān)閉循環(huán)中的層,它們將在同一時刻全部改變。顯示圖層值的代碼非常簡單:
SetShiftReg(layer[k]); //將層數(shù)據(jù)發(fā)送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對LED亮度很重要
PORTD |= B11110000; //關(guān)閉圖層
k++; if (k 》 3) k = 0; //在循環(huán)中再增加一層
在該項目中,使用按鈕(與接地和Arduino的引腳2連接)來改變創(chuàng)建的模式。按下按鈕設(shè)置“開始”。這個開始采用并初始化下一個模式。
然后,循環(huán)在“速度時間”值中設(shè)置的每一個時間(以毫秒為單位)后啟動選定的模式。
關(guān)于主循環(huán)和按鈕的標(biāo)簽:
#define buttonPin 2
unsigned int layer[4] = {0, 0, 0, 0}; //65535填充層
byte k = 0;
bool start = true;
unsigned long delayTime;
int speedTime = 0;
int count;
void setup() {
InitializeShiftReg();
InitializeMyLedCube();
}
void InitializeMyLedCube() {
DDRD = B11110000; //引腳D0-D3作為輸入,D4-D7作為輸出
PORTD |= B11110000; //關(guān)閉圖層
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);
delayTime = millis();
}
byte patternNum = 28;
byte pattern = patternNum - 1;
void loop() {
if (start) {
detachInterrupt(digitalPinToInterrupt(buttonPin));
delay(500); //等待釋放按鈕
pattern++;
if (pattern 》 patternNum) pattern = 1;
attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);
count = 0;
}
if (((millis() - delayTime) 》 speedTime) || start) {
switch (pattern) {
case 1: LayersUpDown(); break;
case 2: FallingDot(); break;
case 3: Rain(); break;
case 4: AllCube(); break;
case 5: Cut(); break;
case 6: Cube(); break;
case 7: Diagonal(); break;
case 8: Mixer(); break;
case 9: Random(); break;
case 10: FallingLayer(); break;
case 11: LayerCut(); break;
case 12: Circle(); break;
case 13: RandomWay(); break;
case 14: SmallCube(); break;
case 15: RandomWayCube(); break;
case 16: GrowingCube(); break;
case 17: FallingLayers(); break;
case 18: GrowingLine(); break;
case 19: CircleEdges(); break;
case 20: CircleSide(); break;
case 21: RandomWayLine(); break;
case 22: RandomWaySide(); break;
case 23: DJCube(); break;
case 24: FillingCube(); break;
case 25: NanoBuilding(); break;
case 26: Curve(); break;
case 27: Snake(); break;
case 28: Julka(); break;
default: break;
}
delayTime = millis();
}
//此部分顯示在函數(shù)中設(shè)置的圖層
SetShiftReg(layer[k]); //將層數(shù)據(jù)發(fā)送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對LED亮度很重要
PORTD |= B11110000; //關(guān)閉圖層
k++; if (k 》 3) k = 0; //在循環(huán)中再增加一層
}
void PushButton() {
start = true;
}
“移位寄存器”標(biāo)簽:
#define latchPin 10 //端口 B2
#define clockPin 9 //端口 B1
#define dataPin 11 //端口B3
#define resetPin 8 //端口 B0
void InitializeShiftReg() {
DDRB |= B1111; //引腳D8-D11作為輸出
PORTB |= B0001; //將引腳重置為高
}
void SetShiftReg(unsigned int value) {
bitClear(PORTB, 2); //數(shù)字寫入(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, value 》》 8);
shiftOut(dataPin, clockPin, MSBFIRST, value);
bitSet(PORTB, 2); //數(shù)字寫入(latchPin, HIGH);
}
創(chuàng)建模式:
每次在“速度時間”值中設(shè)置模式的開始后,Arduino的主循環(huán)都會啟動選定的模式。換句話說,一個模式的函數(shù)總是只改變一次層,但是主循環(huán)會重復(fù)多次。
以Rain()模式為例:
void Rain() {
if (start) {
start = false; speedTime = 200;
ClearLayers();
}
layer[0] = layer[1];
layer[1] = layer[2];
layer[2] = layer[3];
layer[3] = 1 《《 random(16);
}
只有當(dāng)打開模式時,“開始”部分才會啟動一次。它設(shè)置速度時間并關(guān)閉所有l(wèi)ed。然后,總是隨機打開頂層16個led中的一個,在這個循環(huán)中,把它移到底層。
責(zé)任編輯:pj
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7250瀏覽量
91598 -
發(fā)光二極管
+關(guān)注
關(guān)注
13文章
1216瀏覽量
67479 -
移位寄存器
+關(guān)注
關(guān)注
3文章
287瀏覽量
22694
發(fā)布評論請先 登錄
發(fā)光二極管型號有哪些_發(fā)光二極管型號大全
發(fā)光二極管型號有哪些_發(fā)光二極管型號大全
發(fā)光二極管原理
74HC595點亮8個發(fā)光二極管實驗?zāi)康?/a>
閃爍式發(fā)光二極管
發(fā)光二極管(LED),發(fā)光二極管(LED)是什么意思
發(fā)光二極管的原理是什么?
有機發(fā)光二極管_什么是有機發(fā)光二極管

評論