該項目主要是為帶有移位寄存器的發光二極管立方體(4*4)編寫代碼,為立方體創造不同的模式。
硬件組件:
Arduino Nano R3
移位寄存器75HC595
瞬時按鈕開關
發光二極管
4*4立方體:
該立方體有16條腿和4排的立方體。Les s把這些行叫做層。如何將這16條支路連接到Arduino而不占用其所有引腳的最簡單方法是使用移位寄存器75HC595。
(移位寄存器75HC595)
將立方體的前8個引腳(1-8)連接到第一個移位寄存器(引腳Q0-Q7),并將其他8個引腳(9-16)連接到另一個引腳,如俯視圖中的表格所示:
(俯視立方體的腿)
下一步是用Arduino連接移位寄存器的引腳,如下所示:
引腳8(兩個移位寄存器/ GND)至阿爾杜伊諾的接地引腳
第一移位寄存器的引腳9 (Q7)至第二移位寄存器的引腳14(數據)
引腳10(兩個移位寄存器/復位)至Arduino的引腳8
引腳11(兩個移位寄存器/時鐘)至Arduino的引腳9
引腳12(兩個移位寄存器/鎖存器)至Arduino的引腳10
引腳14(第一個移位寄存器/數據)至Arduino的引腳11
引腳16(兩個移位寄存器/ VCC)至Arduino的5V引腳
最后一步是用Arduino連接立方體的層:
引腳4 -第0層(通過100歐姆電阻)
引腳5 -第1層(通過100歐姆電阻)
引腳6 -第2層(通過100歐姆電阻)
引腳7 -第3層(通過100歐姆電阻)
(立方體的底部)
控制led:
一層中的每個led都由一個數字表示,如下表所示:
(打開指示燈的值)
所以要打開圖層第二行的第二個led,就會設置layer = 32。要打開前兩個led,layer = 1 + 2 = 3。要打開第一行led,layer = 1 + 2 + 4 + 8 = 15。
如果想將循環中的光穿過層中的所有LED,在第一步中,設置layer=b000000000000001=1,然后在循環中,將通過設置layer=layer《《1來移動該位。或者可以設置layer=(1《《count)并在循環中增加“count”。
主回路:
當知道如何在一層中設置led時,想要控制4層。雖然只能向我們的2個移位寄存器發送關于1層的信息,但使用Arduino的主循環來非常快速地打開和關閉循環中的層,它們將在同一時刻全部改變。顯示圖層值的代碼非常簡單:
SetShiftReg(layer[k]); //將層數據發送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對LED亮度很重要
PORTD |= B11110000; //關閉圖層
k++; if (k 》 3) k = 0; //在循環中再增加一層
在該項目中,使用按鈕(與接地和Arduino的引腳2連接)來改變創建的模式。按下按鈕設置“開始”。這個開始采用并初始化下一個模式。
然后,循環在“速度時間”值中設置的每一個時間(以毫秒為單位)后啟動選定的模式。
關于主循環和按鈕的標簽:
#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; //關閉圖層
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();
}
//此部分顯示在函數中設置的圖層
SetShiftReg(layer[k]); //將層數據發送到移位寄存器
bitClear(PORTD, 4 + k); //啟用“層k”
delay(1); //對LED亮度很重要
PORTD |= B11110000; //關閉圖層
k++; if (k 》 3) k = 0; //在循環中再增加一層
}
void PushButton() {
start = true;
}
“移位寄存器”標簽:
#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); //數字寫入(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, value 》》 8);
shiftOut(dataPin, clockPin, MSBFIRST, value);
bitSet(PORTB, 2); //數字寫入(latchPin, HIGH);
}
創建模式:
每次在“速度時間”值中設置模式的開始后,Arduino的主循環都會啟動選定的模式。換句話說,一個模式的函數總是只改變一次層,但是主循環會重復多次。
以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);
}
只有當打開模式時,“開始”部分才會啟動一次。它設置速度時間并關閉所有led。然后,總是隨機打開頂層16個led中的一個,在這個循環中,把它移到底層。
責任編輯:pj
-
數據
+關注
關注
8文章
7139瀏覽量
89576 -
發光二極管
+關注
關注
13文章
1204瀏覽量
66507 -
移位寄存器
+關注
關注
3文章
259瀏覽量
22342
發布評論請先 登錄
相關推薦
發光二極管型號有哪些_發光二極管型號大全
發光二極管型號有哪些_發光二極管型號大全
74HC595點亮8個發光二極管實驗目的
閃爍式發光二極管
發光二極管(LED),發光二極管(LED)是什么意思
有機發光二極管_什么是有機發光二極管
![有機<b class='flag-5'>發光二極管</b>_什么是有機<b class='flag-5'>發光二極管</b>](https://file1.elecfans.com//web2/M00/A6/36/wKgZomUMPE6AdGX6AAAMyTaVZbg433.jpg)
評論