Android Things Tutorial(八)GPIO輸出 – LED << 前情
認識七段顯示器
七段顯示器是一種很常見的電子零件,它有各種尺寸與規格,可以顯示一位數到多位數的數字與小數點,有些顯示器也會整合其它符號,例如電子時鐘的冒號(:)與上、下午(AM、PM)。下面的圖片是常見的一位、兩位和四位數的七段顯示器:

一個一位數七段顯示器,包含顯示一個數字的七個條狀LED,與一個顯示小數點的圓形LED。七段顯示器通常會把內部的LED編製一個代碼,顯示數字的七個條狀LED為A到G,DP用來顯示小數點。依照需要顯示的數字,點亮或關閉指定位置的LED,就可以顯示0到9的數字與小數點:

七段顯示器提供控制內部LED的針腳,為了提供嵌入式設備不同的線路設計,分為「共陽極」與「共陰極」兩種規格,決定共用針腳與其它控制針腳的控制方式。下面的圖形是共用針腳兩種規格的連接方式:

以共陰極規格的七段顯示器來說,如果要點亮與關閉編號G的LED,也就是數字中間的橫線,可以使用下面圖型的連接方式:

如果是共陽極規格的七段顯示器來說,要點亮與關閉編號G的LED,也就是數字中間的橫線,可以使用下面圖型的連接方式:

連接七段顯示器
瞭解七段顯示器的規格以後,你可以把它看成是八個LED組合起來的零件,使用之前已經瞭解的GPIO實作方式,就可以在應用程式中顯示0~9的數字與小數點。在執行接下來的工作之前,先準備好下列的零件與設備:
- 麵包板
- 電阻、220 ohm
- 七段顯示器、一位數、共陰極、0.6英吋
- 公-母杜邦線 X 8
- 麵包板連接線 X 1
參考下面的線路圖連接好所有的零件:

你可以調整線路的連接,只要是一般用途的GPIO,都可以用來控制七段顯示器,不過後面說明的範例程式,就要執行對應的修改才可以正確的運作。
顯示數字
應用程式需要在七段顯示器顯示0到9的數字,必須使用七個GPIO控制,為了簡化顯示數字的工作,可以設計一個顯示數字的對照表類別。雖然這裡的範例使用共陰極規格的七段顯示器,下面的類別同時提供共陰極與共陽極兩種規格的顯示資訊:
package net.macdidi5.at.hellosevensegment;
public class DisplayMap {
// 共陰極數字與顯示器針腳對照表
public static final int[][] COMMON_CATHODE = {
// a, b, c, d, e, f, g
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{0, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1} // 9
};
// 共陽極數字與顯示器針腳對照表
public static final int[][] COMMON_ANODE = {
// a, b, c, d, e, f, g
{0, 0, 0, 0, 0, 0, 1}, // 0
{1, 0, 0, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0}, // 2
{0, 0, 0, 0, 1, 1, 0}, // 3
{1, 0, 0, 1, 1, 0, 0}, // 4
{0, 1, 0, 0, 1, 0, 0}, // 5
{1, 1, 0, 0, 0, 0, 0}, // 6
{0, 0, 0, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0}, // 8
{0, 0, 0, 1, 1, 0, 0} // 9
};
}
完成上面的類別以後,顯示數字就簡單多了。參考下面的程式碼,完成控制七段顯示器的App:
package net.macdidi5.at.hellosevensegment;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;
import java.io.IOException;
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
// 控制數字顯示的Handler物件
private Handler numberHandler = new Handler();
// 連接七段顯示器的GPIO pin
private final String[] PIN_NAMES =
{"BCM24", "BCM23", "BCM21", "BCM20", "BCM16", "BCM25", "BCM12"};
// 連接七段顯示器的GPIO物件
private Gpio[] gpios = new Gpio[PIN_NAMES.length];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
// 建立設備管理員服物物件
PeripheralManagerService service = new PeripheralManagerService();
try {
// 建立GPIO物件
for (int i = 0; i < PIN_NAMES.length; i++) {
gpios[i] = service.openGpio(PIN_NAMES[i]);
// 設定GPIO為輸出模式,預設為低電壓
gpios[i].setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
}
// 啟動控制數字顯示的Handler物件
numberHandler.post(numberRunnable);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
// 移除控制數字顯示的Handler物件
numberHandler.removeCallbacks(numberRunnable);
try {
// 關閉GPIO物件
for (Gpio gpio : gpios) {
gpio.close();
}
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
finally {
gpios = null;
}
}
// 顯示參數指定的數字
private void displayNumber(int number) throws IOException {
if (number < 0 || number > 9) {
return;
}
for (int i = 0; i < gpios.length; i++) {
// 根據共陰極對照表設定針腳的狀態輸出電壓
boolean status = DisplayMap.COMMON_CATHODE[number][i] == 1;
gpios[i].setValue(status);
}
}
// 控制數字顯示的Runnable物件
private Runnable numberRunnable = new Runnable() {
int number = 0;
@Override
public void run() {
try {
displayNumber(number++);
if (number > 9) {
number = 0;
}
numberHandler.postDelayed(numberRunnable, 500);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
};
}
執行應用程式,七段顯示器會重複顯示0到9的數字。
使用共陽極規格的七段顯示器
如果你使用共陽極規格的七段顯示器,依照下面的線路圖連接所有的零件:

應用程式的部份也要執行部份的修改,在建立GPIO物件的時候,要設定預設輸出為高電壓:
try {
// 建立GPIO物件
for (int i = 0; i < PIN_NAMES.length; i++) {
gpios[i] = service.openGpio(PIN_NAMES[i]);
// 設定GPIO為輸出模式,預設為高電壓
gpios[i].setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
}
// 啟動控制數字顯示的Handler物件
numberHandler.post(numberRunnable);
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
顯示數字的對照表使用共陽極的設定:
// 顯示參數指定的數字
private void displayNumber(int number) throws IOException {
if (number < 0 || number > 9) {
return;
}
for (int i = 0; i < gpios.length; i++) {
// 根據共陽極對照表設定針腳的狀態輸出電壓
boolean status = DisplayMap.COMMON_ANODE[number][i] == 1;
gpios[i].setValue(status);
}
}
下一步
GPIO的輸出的高電壓是3.3V,如果需要控制比較高電壓或是交流電的設備,例如電燈,就需要透過繼電器這類的零件,接下來會說明繼電器模組的應用,還有開發控制交流電設備的應用程式。
相關的檔案都可以在GitHub瀏覽與下載。
http://github.com/macdidi5/Android-Things-Tutorial
後續 >> Android Things Tutorial(十)GPIO輸出 – 繼電器模組
|