學習目標 : 認識faya 串列七段顯示模組的功能及使用方式
學習時間 : 40min
示範模組 : (1) fayaduino UNO
(2) faya 電源底板
(3) faya觸控開關模組x 2
(4) faya 串列七段顯示模組
工具 : (1) 樂高積木底板 (相容)
====================功能介紹====================
faya串列七段顯示模組透過簡單的接線,再對Arduino的函式下指令,就能立刻秀出想要顯示的數字,本段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明。
介紹指令前,先看一下faya串列七段顯示模組的外觀,它的左邊有三個埠,分別是DIN、CLK、LOAD,用來和Arduion進行串列資料的傳輸,使用此模組前,需先宣告Arduino連到此三個埠的腳位。模組中間就是主角-四位數七段顯示器,每個位數外帶小數點,注意中間上方的小數點沒有作用。
接下來介紹使用指令
- #include<LedControl.h>;
- LedControl 物件名稱 = LedControl(DIN,CLK,LOAD,n);
物件名稱 : 可自行命名
DIN、CLK、LOAD : 連接Arduino的數位腳號碼
n : 連接串列裝置的數量,最多可連接8個,因此n介於1~8之間
(例) 當我們建構一物件名稱為"faya7seg",把DIN連到第12隻腳,CLK連到11隻
腳,LOAD連到第10隻腳,並且只連了1個串列七字節,我們在程式中需宣告:
LedControl faya7seg = LedControl(12,11,10,1);
- 物件名稱 .shutdown(n-1, power_saving_mode);
n-1 : 選擇第n個串聯裝置
power_saving_mode : true代表進入省電模式,false代表進入一般電源模式
(例) 當我們要將第一個裝置(物件名稱為faya7seg)進入一般電源模式,程式如下
faya7seg.shutdown(0,false);
- 物件名稱 .setIntensity(n-1,intensity);
n-1 : 選擇第n個串聯裝置
intensity : 亮度參數設定0~15,0最暗、15最亮
(例) 當我們要將第一個裝置(物件名稱為faya7seg)設定中間亮度時,程式如下
faya7seg.setIntensity(0,8);
- 物件名稱 .clearDisplay(n-1);
n-1 : 選擇第n個串聯裝置
(例) 當我們要清除第一個裝置(物件名稱為faya7seg)的顯示設定內容時,程式如下:
faya7seg.setIntensity(0,8);
- 物件名稱 .setDigit(n-1,m,number,dp)
n-1 : 選擇第n個串聯裝置
m : 控制的位數(3=千位、2=百位、1=十位、0=個位)
number : 要顯示的數字 (0~9)
dp : true代表顯示小數點、false代表不顯示
(例) 當我們要顯示第一個裝置(物件名稱為faya7seg)的4個位數為587.2時,程式如下
faya7seg.setDigit(0,3,5,false);
faya7seg.setDigit(0,2,8,false);
faya7seg.setDigit(0,1,7,true);
faya7seg.setDigit(0,0,2,false);
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
原本四字七段顯示器的控制方式,需透過8條訊號線控制一個數字(7條訊號線控制組成數字的節+1條訊號線控制小數點),再加上4條訊號線,輪流掃描點亮四個位數,利用視覺暫留的關係,讓四個數字看起來同時亮。
這個方式的缺點是需要拉很多訊號線,掃描的時候也會占用控制器的資源,有鑑於此,我們可借助一顆IC來處理顯示的工作,降低控制器的負擔。
晶片 Max7219 就是針對所需要的功能設計出來的,他具配了BCD解碼電路、掃描電路和串列埠電路,能夠輕易地將控制器送來的串列訊號解碼送至顯示器,內建的掃描功能也能夠讓顯示器一次顯示所有的數字。本模組的電路如下 (Dig0~3為掃描線、SegA~G為訊號線),接法是固定的,有興趣深入研究的人可以參考datasheet。
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)按下左邊觸控按鈕時,七段顯示器加1,最多顯示到9999
(2)按下邊觸控按鈕時,七端顯示器規歸0
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_12 ===> 串列七段顯示模組_DIN
Arduino_11 ===> 串列七段顯示模組_CLK
Arduino_10 ===> 串列七段顯示模組_LOAD
Arduino_2 ===> 觸控開關模組(左)_OUT
Arduino_3 ===> 觸控開關模組(右)_OUT
範例程式:
備註:
- 本程式需要用到[LedControl]函式庫,請下載並解壓縮至Arduino Libraries 資料夾
- 觸控開關的使用方式,請參考[模組介紹 : faya觸控開關模組]
- L53 : 數字每次加1,就呼叫副程式,更新顯示
- L59 : show4digits 副程式,會把傳送的4位數字拆成千/百/十/個4個數字
- L62 : 把數字除以1000所得的商就是千位數字
- L63 : 把數字除以1000所得的餘數再除以100所得的商就是百位數字
- L64 : 把數字除以100所得的餘數再除以10所得的商就是十位數字
- L65 : 把數字除以10所得的餘數就是個位數字
- L67~70 : 利用剛剛取得的千/百/十/個位數字點亮各個LED燈
範例結果:
討論:
- 從範例結果可以看到每按一次計數鈕,數字會+1累計,但是如果一直按著技術鈕不放開時,由於程式在void loop()裡面跑,因此會不斷的重複+1,要解決此問題,可以在L56和L57中間插入底下兩行程式碼
delay(30);
如此一來,只要手指頭還留在按鍵上,程式就會卡在第一行,第二行作用為除彈跳,雖然觸控開關沒有機械彈跳的問題,但是離開的瞬間,我們發現還是有電壓上下變化的現象產生,因此還是加個延遲將此現象忽略。
- 範例中可以發現數字跳得有點慢,大家可以試著寫一個加速程式,當按愈久的時候,數字跳得愈快。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言