2019-08-22

Arduino 控制 3461SRB 四位七段顯示器

上次測試過七段顯示器,便測試四位七段顯示器
本以為左只是七段顯示器由 1支電源引腳 控制 對應 1位數字 ,增加至 4支電源引腳 只是控制對應 4位數字
但當實際測試時,原理是完全不同

見下文
見下文
四位七段顯示器 的外觀
四位七段顯示器 共有 12支引腳

見下文
電子迴路元件圖示

引腳編排及用途

引腳4引腳H引腳G引腳3引腳2引腳F
用途右4電源左上右3電源右2電源右上
左下右下右1電源
正(有字印刷)引腳A引腳B引腳C引腳D引腳E引腳1

引腳編號用途
A左下 LED 接地線
B下 LED 接地線
C點 LED 接地線
D右下 LED 接地線
E中 LED 接地線
1右1 電源線
F右上 LED 接地線
2右2 電源線
3右3 電源線
G左上 LED 接地線
H上 LED 接地線
4右4 電源線


LED 位置 (模擬及示範效果)

左上右上右下左下左上右上右下左下左上右上右下左下左上右上右下左下

接駁

同樣接通線路前必須先接駁電阻,否則 LED 會燒毀

見下文
基本的接駁方法

見下文
在下的接駁方法

見下文
四位七段顯示器 的正面、前方、右側

見下文
四位七段顯示器 的正面、前方、左側

見下文
四位七段顯示器 的正面、後方、右側

見下文
跳線 接駁至 Arduino 2號 至 13號 引腳

見下文
四位七段顯示器 接駁至 麵包板 上,通過 跳線 接駁至 Arduino

見下文
四位七段顯示器 可以當作將 4個七段顯示器 連接在一齊

其中 8支引腳 與 七段顯示器 相同,都是控制 七段顯示器 的 8個LED ,而且連接所有對應位置的 LED 貫通四位
另外 4支引腳 就是控制對應位置的數字
將12支引腳接駁正確,當然是四位七段顯示器所有 LED 都著亮,但這會導致四位都著亮相同 LED

要讓四位都亮著不同 LED ,不能讓 LED 持續接通電源
需要 不斷接通與切斷對應位置及 LED 的電源
只要 接通與切斷電源的時間比人類視覺更新時間少,在人類視覺上便不會發生 LED 有切斷感覺

例如
  • 右1位 亮著 第1段 LED
  • 右2位 亮著 第2段 LED
  • 右3位 亮著 第3段 LED
  • 右4位 亮著 第4段 LED

測試

const byte SEGMENT_PINS[4] = {9, 8, 7, 6};
const byte POWER_PINS[4] = {10, 11, 12, 13};
const byte SEGMENT_LENGTH = sizeof(SEGMENT_PINS) / sizeof(byte);
const byte POWER_LENGTH = sizeof(POWER_PINS) / sizeof(byte);

void setup() {
    for (byte segmentPin : SEGMENT_PINS) {
        pinMode(segmentPin, OUTPUT);
        digitalWrite(segmentPin, HIGH);
    }
    for (byte powerPin : POWER_PINS) {
        pinMode(powerPin, OUTPUT);
        digitalWrite(powerPin, LOW);
    }
}
 
void loop() {
    setLED(POWER_PINS[0], SEGMENT_PINS[0]);
    setLED(POWER_PINS[1], SEGMENT_PINS[1]);
    setLED(POWER_PINS[2], SEGMENT_PINS[2]);
    setLED(POWER_PINS[3], SEGMENT_PINS[3]);
}
 
void setLED(byte powerPin, byte segmentPin, bool enabled) {
    digitalWrite(powerPin, enabled ? HIGH : LOW);
    digitalWrite(segmentPin, enabled ? LOW : HIGH);
    delay(1);
}
 
void setLED(byte powerPin, byte segmentPin) {
    setLED(powerPin, segmentPin, true);
    setLED(powerPin, segmentPin, false);
}

效果

見下文
延遲時間為 千分之1秒,不會有閃動感覺
延遲時間很短,一般攝影裝置都不會拍攝到有閃動情況

見下文
延遲時間為 千分之40秒 (25 FPS , PAL 制式),會有明顯閃動感覺

計時器示範

const byte SEGMENT_PINS[8] = {9, 8, 7, 6, 2, 3, 4, 5};
const byte POWER_PINS[4] = {10, 11, 12, 13};
const byte SEGMENT_LENGTH = sizeof(SEGMENT_PINS) / sizeof(byte);
const byte POWER_LENGTH = sizeof(POWER_PINS) / sizeof(byte);
const unsigned int SEGMENTS[8] = {
    // middle
    1 << 0,
    // top left
    1 << 1,
    // top
    1 << 2,
    // top right
    1 << 3,
    // dot
    1 << 4,
    // bottom right
    1 << 5,
    // bottom
    1 << 6,
    // bottom left
    1 << 7
};
const unsigned int DIGITS[10] = {
    // 0
    (SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]),
    // 1
    (SEGMENTS[3] | SEGMENTS[5]),
    // 2
    (SEGMENTS[0] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[6] | SEGMENTS[7]),
    // 3
    (SEGMENTS[0] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6]),
    // 4
    (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[3] | SEGMENTS[5]),
    // 5
    (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[5] | SEGMENTS[6]),
    // 6
    (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]),
    // 7
    (SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5]),
    // 8
    (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]),
    // 9
    (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6])
};
unsigned int x = 0;

void setup() {
    for (byte segmentPin : SEGMENT_PINS) {
        pinMode(segmentPin, OUTPUT);
        digitalWrite(segmentPin, HIGH);
    }
    for (byte powerPin : POWER_PINS) {
        pinMode(powerPin, OUTPUT);
        digitalWrite(powerPin, LOW);
    }
}

void loop() {
    x %= 10000;
    // loop 4 digits for assigning the dot
    for (byte k = 0; k < POWER_LENGTH; k++) {
        for (byte j = 0; j < (100 / POWER_LENGTH); j++) {
            // loop 4 digits
            unsigned int y = 1;
            for (byte i = 0; i < POWER_LENGTH; i++) {
                y *= 10;
                // set segments to the digit
                // assign the dot to the digit each 250ms
                setLED(POWER_PINS[i], DIGITS[(x / (y / 10)) % 10] | ((k == i) ? SEGMENTS[4] : 0));
            }
            // total delay 8ms 4 digits
            // delay extra 2ms to be 10ms in a period
            delay(2);
        }
    }
    x++;
}

void setLED(byte powerPin, unsigned int segmentValue, bool enabled) {
    digitalWrite(powerPin, enabled ? HIGH : LOW);
    for (byte i = 0; i < SEGMENT_LENGTH; i++) {
        if ((segmentValue & SEGMENTS[i]) > 0) {
            digitalWrite(SEGMENT_PINS[i], enabled ? LOW : HIGH);
        }
    }
    delay(1);
}

void setLED(byte powerPin, unsigned int segmentValue) {
    setLED(powerPin, segmentValue, true);
    setLED(powerPin, segmentValue, false);
}

計時器效果

見下文
在無外光情況下,會有些微閃動情況

總結

因為 LED 不斷亮著及熄滅,所以 光度會比較暗

見下文
如果獨立接駁 4個七段顯示器 亮著 LED ,則可以保持亮度
但 1個七段顯示器 需要用 9支引腳 , 4個七段顯示器便要使用 36支引腳,路線便會非常複雜
而且 Arduino UNO Rev 3 亦沒有 36支引腳可以使用,要使用 Arduino Mega 才足夠

在下使用 電腦時間 及 多部電話計時器 測試,全部計時速度都比在下的 Arduino 計時器快
計時器使用 delay ,雖然 delay 是延遲 千分秒,但可能操作程序太複雜
導致 計時器 好像並不是確切的 千分秒 運作,顯示器顯示的時間好似不太準確

雖然本文的章是以四位七段顯示器測試
但在下認為凡是多位七段顯示器是以這種方式製作,操作方式都是相同,只是增加電源引腳即可

沒有留言 :

張貼留言