學習目標 : 認識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
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/7/18 | |
// Faya-Nugget 範例程式 (Serial7Seg_1.ino) | |
// 單元: 模組介紹:faya串列七段顯示模組 | |
// 網址: https://fayalab.blogspot.com/2017/07/serial7seg.html | |
// 目標: (1) 按下一觸控開關時,七段顯示器開始計數 | |
// (2) 按下另一觸控開關時,七段顯示器歸零 | |
// (3) 七段顯示器達最大值9999後歸零繼續 | |
// 接線: Arduino ==> faya模組 | |
// D10 ==> LOAD (7段顯示器模組) | |
// D11 ==> CLK (7段顯示器模組) | |
// D12 ==> DIN (7段顯示器模組) | |
// D2 ==> OUT (觸控開關模組 - 計數用) | |
// D3 ==> OUT (觸控開關模組 - 歸零用) | |
#include <LedControl.h> | |
//定義Arduino與七字節模組的連接腳位與參數 | |
LedControl faya7seg=LedControl(12,11,10,1); // DIN, CLK, LOAD, 串列數量 | |
int countButton = 2; // 計數鈕接數位2腳 | |
int resetButton = 3; // 歸零鈕接數位3腳 | |
int counter = 0; // 計數變數 | |
int delay_time = 200; // 延遲時間 | |
void setup() | |
{ | |
pinMode(countButton,INPUT); | |
pinMode(resetButton,INPUT); | |
// 初始化七字節顯示器 | |
faya7seg.shutdown(0,false); // 第0個元件不要進入省電模式 | |
faya7seg.setIntensity(0,8); // 第0個的元件亮度8 (0~15) | |
faya7seg.clearDisplay(0); // 清除第0個元件 | |
show4digits(0); // 輸出數字0000 | |
} | |
void loop() | |
{ | |
if(digitalRead(resetButton) == HIGH) // 按reset鈕時,數字歸0 | |
{ | |
counter = 0; | |
show4digits(counter); | |
} | |
else if(digitalRead(countButton) == HIGH) // 按count鈕時,數字+1 | |
{ // 9999後歸0 | |
if(counter == 9999) | |
{ | |
counter = 0; | |
} | |
else | |
{ | |
counter = counter+1; | |
show4digits(counter); | |
delay(delay_time); | |
} | |
} | |
} | |
void show4digits(int number) | |
{ | |
int num1,num2,num3,num4; | |
num1=number/1000; //千位數 | |
num2=(number%1000)/100; //百位數 | |
num3=(number%100)/10; //十位數 | |
num4=number%10; //個位數 | |
faya7seg.setDigit(0,3,num1,false); //點亮千位數 | |
faya7seg.setDigit(0,2,num2,false); //點亮百位數 | |
faya7seg.setDigit(0,1,num3,false); //點亮十位數 | |
faya7seg.setDigit(0,0,num4,false); //點亮個位數 | |
} |
備註:
- 本程式需要用到[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本篇留言版
沒有留言:
張貼留言