步驟1:4位7段顯示
明顯的出發(fā)點是熟悉4位7段顯示器。這些單元來自我們?yōu)榻淌沂褂枚徺I的一些Elegoo stater套件,但最有可能與您在上圖中看到的部件一起購買。除了上面的物理設備圖像,您還可以看到該設備的引腳和原理圖。將Arduino編程為單獨的顯示字符非常簡單,但是要同時顯示整個單詞或數(shù)字是有趣的。與任何7段顯示一樣,可以通過打開字母段的不同組合來顯示數(shù)字和一些字符;使用4位7段單元的扭曲是每個數(shù)字的所有單個段都連接在一起,每個數(shù)字只有它自己的共用陰極或陽極單獨控制。實際上,使這些單元顯示單詞或數(shù)字的唯一方法仍然是一次一位數(shù);然而,數(shù)字的開啟和關閉速度都很快,以至于人眼看起來一直都在。
第2步:理解(和使用)Arduino端口
為了避免使用數(shù)以千計的“digitalWrite”命令打開和關閉我需要的所有組合,我決定熟悉Arduino上端口的使用平臺。使用此命令(例如:PORTA = B01110101;)可以同時打開和關閉8個數(shù)字I/O引腳,其中1表示等于向該引腳寫入“高電平”,0表示與寫入“低電平”相同到針。每個端口對應Arduino上的8個引腳,可以用二進制(我使用的)或十六進制寫入。一個簡單的例子是上面的引腳輸出中顯示的Arduino Mega上的端口F和K,PORTF對應于模擬引腳A0-A7和PORTK,對應于模擬引腳A8-A15。非常感謝Adafruit社區(qū)在這個壯觀的引腳上的工作!
第3步:全力以赴
雖然上面的圖片很難看,但我決定未來編程的最合理布局是將每個4位7段分成上半部分和下半部分,然后將每一半分配給特定端口。這將允許我輕松查看我需要的數(shù)字,然后使用二進制輸出打開相應的段到相關端口。使用port命令的十六進制版本會使每個命令(實際上是命令調(diào)用的2D數(shù)組)更短但在布局代碼時看起來更容易看到高/低組合而不是必須以十六進制轉換那些相同的組合,即使代碼從長遠來看會更緊湊。為了幫助完成這個過程,我創(chuàng)建了一個圖表來顯示哪些數(shù)字/段與哪個端口分配相關聯(lián)。您還可以在上圖中看到,通過每個數(shù)字的共陰極引腳實現(xiàn)限流,而不是限制每個單獨的電流。
步驟4:代碼 - CountUpDownTimer
在幾次嘗試運行一系列嵌套for循環(huán)以控制時序和顯示失敗后,我開始研究適用于Arduino的并行處理。最后我遇到了一個名為“CountUpDownTimer”的預先存在的庫,可以在這里找到Arduino Playgound。該庫在后臺為您執(zhí)行計時,允許您在需要時撥打小時,分鐘和秒。然后將這些值作為參數(shù)傳遞給一個數(shù)組,該數(shù)組打開適當?shù)亩我燥@示相應的數(shù)字。唯一的復雜因素(除了創(chuàng)建數(shù)組 - 下一步更多)是我必須修改庫以添加“ShowDays”方法,該方法不是原始代碼的一部分。
#include
CountUpDownTimer T(DOWN, HIGH); //Create the timer object void setup(){
//Setting all digital pins as outputs
for (int i=3; i《=53; i++)
pinMode(i, OUTPUT);
//Setting all analog pins as outputs
for (int a=A0; a《=A15; a++)
pinMode(a, OUTPUT);
T.SetTimer(52,07,17,00); // (days, hours, minutes, seconds)
T.StartTimer();
} void loop() {
T.Timer();
int stepDelay = 50;
long sm = T.ShowMinutes();
long sh = T.ShowHours();
long sd = T.ShowDays();
for(int c = 0; c 《 4; c++){
PORTB = upperArray[sm][c];
PORTL = lowerArray[sm][c];
PORTA = upperArray[sh][c];
PORTC = lowerArray[sh][c];
PORTF = upperArray[sd][c];
PORTK = lowerArray[sd][c];
delayMicroseconds(stepDelay);
}
}
步驟5:代碼 - 2D數(shù)組
驅動端口的值被放置在一個單獨的2D陣列中,該陣列分成兩半,一個用于顯示器的上半部分,另一個用于下半部分。部分。端口分配基于顯示器的引腳,每列代表相應的數(shù)字。這里的關鍵是將高點和低點的適當組合應用于每個連續(xù)數(shù)字的各個段和適當?shù)墓碴帢O。 2D陣列長270行,占整個學年,四列寬,每個顯示四位數(shù)。盡管小時和分鐘從不調(diào)用陣列的大多數(shù),但使用相同的結構來驅動這些顯示器而不是每個部分的自定義陣列似乎更容易。上半部分和下半部分的前幾行如下所示。我還創(chuàng)建了您在上面看到的圖表,顯示哪些端口輸出與哪些段相對應,以最大限度地減少錯誤并保持理智。
byte upperArray[270][4]
{B00011111,B00111011,B00111101,B00111111}, //00u
{B00011111,B00111011,B00111101,B00100111}, //01u
{B00011111,B00111011,B00111101,B00110111}, //02u
{B00011111,B00111011,B00111101,B00110111}, //03u
{B00011111,B00111011,B00111101,B00101111}, //04u
{B00011111,B00111011,B00111101,B00111110}, //05u
{B00011111,B00111011,B00111101,B00111110}, //06u
{B00011111,B00111011,B00111101,B00110111}, //07u
{B00011111,B00111011,B00111101,B00111111}, //08u
{B00011111,B00111011,B00111101,B00111111}, //09u
{B00011111,B00111011,B00100101,B00111111}, //10u byte lowerArray[270][4]{
{B00110101,B00110101,B00110101,B00110100}, //00
{B00110101,B00110101,B00110101,B00000100}, //01
{B00110101,B00110101,B00110101,B00110010}, //02
{B00110101,B00110101,B00110101,B00010110}, //03
{B00110101,B00110101,B00110101,B00000110}, //04
{B00110101,B00110101,B00110101,B00010110}, //05
{B00110101,B00110101,B00110101,B00110110}, //06
{B00110101,B00110101,B00110101,B00000100}, //07
{B00110101,B00110101,B00110101,B00110110}, //08
{B00110101,B00110101,B00110101,B00010110}, //09
{B00110101,B00110101,B00000101,B00110100}, //10
步驟6:LCD屏幕 - 后想法
我最初并不想包括靜態(tài)顯示倒計時的日期/時間結束的LCD屏幕;然而,當我為該項目購買BASE時,有一個大小與小面包板大小相當?shù)拈_放空間,因此它似乎是該項目的合理添加。該顯示器是標準的16x2單色白色藍色顯示屏,也來自Elegoo套件。除了數(shù)據(jù)和控制線的附加布線外,代碼修改也很簡單;我添加了預處理器功能,包括庫和定義用于每個所需連接的引腳,以及在void設置中顯示靜態(tài)消息的代碼,這樣只運行一次而不影響時序計數(shù)器。兩種修改如下所示:
#include
const int rs = 17, en = 16, d4 = 21, d5 = 20, d6 = 19, d7 = 18;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(“Countdown Ends:”);
lcd.setCursor(0, 1);
lcd.print(“5/30/19 @ 3:10pm”);
第7步:結論 - 問題和教訓
這個項目中有問題的部分是迄今為止繁瑣的部分。首先,在硬件方面,使得所需的40多條數(shù)據(jù)線的布線看起來很整潔;接下來是2D陣列的創(chuàng)建,它包含顯示正確數(shù)字所需的高低組合。我必須做的一個小的硬件修改是調(diào)整我在每個顯示器的第四個數(shù)字上使用的限流電阻的大小;由于時間(并假設視覺的持續(xù)性),數(shù)字總是比其他數(shù)字亮一點,所以我增加該值,直到所有四位數(shù)的外觀看起來均勻。我確信通過某種時間共享或多路復用可能有一種更優(yōu)雅的方式來實現(xiàn)這一目標,但我從經(jīng)驗中學到了很多東西,并意識到我剛剛開始劃清我們所說的這個神奇工具的表面“ Arduino“能夠完成。
-
時序設計
+關注
關注
0文章
21瀏覽量
43927 -
Arduino
+關注
關注
188文章
6469瀏覽量
186963
發(fā)布評論請先 登錄
相關推薦
評論