Android Things Tutorial(九)GPIO輸出 - 七段顯示器 by Michael | CodeData
top

Android Things Tutorial(九)GPIO輸出 - 七段顯示器

分享:

Android Things Tutorial(八)GPIO輸出 – LED << 前情

認識七段顯示器

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

att_09_01

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

att_09_02

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

att_09_03

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

att_09_04

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

att_09_05

連接七段顯示器

瞭解七段顯示器的規格以後,你可以把它看成是八個LED組合起來的零件,使用之前已經瞭解的GPIO實作方式,就可以在應用程式中顯示0~9的數字與小數點。在執行接下來的工作之前,先準備好下列的零件與設備:

  • 麵包板
  • 電阻、220 ohm
  • 七段顯示器、一位數、共陰極、0.6英吋
  • 公-母杜邦線 X 8
  • 麵包板連接線 X 1

參考下面的線路圖連接好所有的零件:

att_09_06

你可以調整線路的連接,只要是一般用途的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的數字。

使用共陽極規格的七段顯示器

如果你使用共陽極規格的七段顯示器,依照下面的線路圖連接所有的零件:

att_09_07

應用程式的部份也要執行部份的修改,在建立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瀏覽與下載。

https://github.com/macdidi5/Android-Things-Tutorial

後續 >> Android Things Tutorial(十)GPIO輸出 – 繼電器模組

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

張益裕。目前的工作是講師與作者,專長是教育訓練課程規劃、教材編製與課程推廣,技術書籍與專欄寫作。涵蓋的領域有OOAD、Java程式設計、JavaFX、Java Embedded、Android與SQL。已出版電子書Google Play圖書Pubu

熱門論壇文章

熱門技術文章