見出し画像

7seg+NANO(3) TM1637

TM1637というドライバICのついた4ケタ7セグのモジュールをAliで買った。

中国発、ドミニカ共和国経由で送られてきた

3.3/5V駆動。端子はVCC、GND、CLK、DIOの4つでデータのやり取りは2本の線で行う。シフトレジスタ(3本でやりとり)より優れている。時刻表示用に2ケタ目と3ケタ目の間にコロンを表示できるようになっている。
検索をかけるとTM1637を扱うライブラリがいくつかあがってきたが、事例の多い<TM1637Display.h>をインストールした。
すると、サンプルスケッチを参考にあっという間にできてしまった。しかも明るい。これまでの苦労は何やったんか。(→ 7seg+NANO(1)7seg+NANO(2))以下にスケッチを示す。

/* NANO_TM1637_01.ino

     Arduino NANO                          serial port is COM3 for hp_PC.
                      1・     ・VIN             3,11 is interfered by tone().
                      0・     ・GND             A6,A7 is analog only.
                  Reset・     ・Reset
                    GND・     ・5V
       TM1637_CLK <-- 2・     ・A7
       TM1637_DIO <-- 3・     ・A6
                      4・     ・19/A5
                      5・     ・18/A4
                      6・     ・17/A3
                      7・     ・16/A2
                      8・     ・15/A1
                      9・     ・14/A0
                     10・     ・AREF
                     11・     ・3.3V
                     12・ USB ・13*
*/

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);

uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };  // 7seg用データ(0000)を表示
int digit[4]; // 表示する4ケタの数
void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:
  display.clear();
  display.setBrightness(0x0c);  // 輝度 max 0x0f
}

uint8_t alpha_data[26] = {
  0b01110111, /* 1a  */  0b01111100, /* 2b  */  0b01011000, /* 3c  */  0b01011110, // 4d
  0b01111001, /* 5e  */  0b01110001, /* 6f  */  0b00111101, /* 7g  */  0b01110100, // 8h
  0b00000100, /* 9i  */  0b00011110, /* 10j */  0b01110101, /* 11k */  0b00111000, // 12l
  0b00110111, /* 13m */  0b01010100, /* 14n */  0b01011100, /* 15o */  0b01110011, // 16p
  0b01100111, /* 17q */  0b01010000, /* 18r */  0b01101100, /* 19s */  0b01111000, // 20t
  0b00011100, /* 21u */  0b00111110, /* 22v */  0b01111110, /* 23w */  0b01110110, // 24x
  0b01101110, /* 25y */  0b00011011, // 26z
};

uint8_t num_data[10] = {
  0b00111111, /* 0 */  0b00000110, /* 1 */  0b01011011, /* 2 */  0b01001111, /* 3 */
  0b01100110, /* 4 */  0b01101101, /* 5 */  0b01111101, /* 6 */  0b00100111, /* 7 */
  0b01111111, /* 8 */  0b01101111  // 10
};

void loop() {
  for (int i = 0; i < 10; i++) {  //  0 - 9 のフロー
    uint8_t data[] = {num_data[i], num_data[(i + 1) % 10], num_data[(i + 2) % 10], num_data[(i + 3) % 10]};
    display.setSegments(data);
    delay(500);
  }
  display.clear(); delay(500);

  for (int i = 0; i < 26; i++) {   // a - z のフロー
    uint8_t data[] = {alpha_data[i], alpha_data[(i + 1) % 26], alpha_data[(i + 2) % 26], alpha_data[(i + 3) % 26]};
    display.setSegments(data);
    delay(500);
  }
  display.clear(); delay(500);

  // [表示する数値],[0表示],[桁数(下位から表示)],[左から(○-1)番目から表示※0~3]
  display.showNumberDec(1234, true, 4, 0);
  delay(1000);
  display.clear(); delay(500);


  // 時刻表示用[表示する数値],[コロン],[0表示]
  display.showNumberDecEx(123, 0x40, true);
  delay(1000);
  display.clear(); delay(500);

  int i = 9999; //  9999からのカウントダウン
  while (i < 10000) {
    disp_digit(i);
    i--;
    delay(500);
  }
}

void disp_digit(int N) {  //  4ケタの数をディスプレイに表示
  for (int i = 0; i < 4; i++) { // 一位から千位まで順に各ケタの数を7segデータに変換
    digit[i] = N % 10;  // 各位の数を求める
    data[3 - i] = display.encodeDigit(digit[i]);  // 7segのデータに変換
    Serial.print(data[3 - i]); Serial.print(" ");
    N = N / 10; //
  }
  Serial.println();
  display.setSegments(data);  // dataをディスプレイに表示
}

0~9のフロー → アルファベットのフロー → 1234の表示 → 01:23の表示 → 9999からのカウントダウン(アルファベットはご愛敬ということで。。 マニアックすぎる)

お世話になったサイト
 TM1637Display.hライブラリの使い方
 4桁7セグメントLEDをLINX(Arduino UNO)で使ってみる
 7segment_display.pdf