aitendo 4桁7セグとRTCでデジタル時計をつくってみた。

aitendoで4桁7セグがなんと30円で売っていたので、勢いでポチってしまった。

4桁7セグ

買ってから使い方をググってみると、意外とめんどくさい。特に今回買ったのがアノードコモンだったので、Arduinoで使う場合DOの電流が足りないらしい。

そこで、秋月でトランジスタアレイを購入してなんとか使ってみる。
前回のLCDを使ったデジタル時計を、7セグでトライ。

材料

Arduino pro mini 5V
4桁7セグ
トランジスタアレイ:TD62783APG
抵抗330Ω:8個
リアルタイムクロック(RTC):DS3231

回路

アノード側をHIGH、カソード側をLOWにすることで各LEDが点灯する。
アノードコモンの7セグの場合は、どのカソードをLOWにするかで何の数字を表示するかを選択し、どのアノードをHIGHにするかでどの桁の数字を点灯させるかを選択する。4桁違う数字を表示するにはHIGHにするアノードを高速で切り替えることで残像を利用して4桁表示しているように見せるらしい。制御するArduinoからみたら結構忙しいね。

【接続】
回路2

【7セグのピン配置】 (aitendo HPから抜粋)
7seg

CakeBoardを使って抵抗を裏側に配置することで、少しはすっきりしたかな。
配線

ソースコード

リアルタイムクロックの分と秒を表示する時計にしてみた。

//デジタル時計:7セグ

#include "RTC_DS3231.h"
#include <Wire.h>

#define RTC_addr 0x68
RTC_DS3231 rtc(RTC_addr);
#define ASCII_ZERO 48;

int pin_A[4] = {4,2,3,5};             //アノード 桁選択
int pin_n[7] = {6,7,8,9,10,12,13};    //カソード 数値選択
int pin_k = 11;                       //: 2桁目のみ

byte num_def[11] = {B10001000,  // 0  (各bit: 0_ON, 1_OFF)
                B11101101,      // 1
                B10010100,      // 2
                B10100100,      // 3
                B11100001,      // 4
                B10100010,      // 5
                B10000010,      // 6
                B11101100,      // 7
                B10000000,      // 8
                B10100000,      // 9
                B11111111};     // OFF

void setup(void) {
  Wire.begin();

  //各ピンの初期化
  for(int i=2; i<=5; i++){
    pinMode(i,OUTPUT);  
    digitalWrite(i,LOW);
  }  
  for(int i=6; i<=13; i++){
    pinMode(i,OUTPUT);  
    digitalWrite(i,HIGH);
  }  
}

void loop(void) {
  
  rtc.getTime();
  seg_clock();
  
}

void seg_clock(void){
  //7セグに時刻を出力
  int buf[4] = {0,0,0,0};
  char *time = rtc.acTime;

  buf[0] = time[3] - ASCII_ZERO;    //分 10位
  buf[1] = time[4] - ASCII_ZERO;    //分 1位
  buf[2] = time[6] - ASCII_ZERO;    //秒 10位
  buf[3] = time[7] - ASCII_ZERO;    //秒 1位
  
  //4桁表示
  for (int i=0; i<=3; i++){
    digitalWrite(pin_A[i],HIGH);    
    for (int j=0; j<7; j++ ){
      digitalWrite(pin_n[j],bitRead(num_def[buf[i]],j));  
    }
    digitalWrite(pin_k,LOW);    //:を表示  
    delay(5);  
    digitalWrite(pin_A[i],LOW);
  }
  
}


動作確認

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です