aitendoで4桁7セグがなんと30円で売っていたので、勢いでポチってしまった。
買ってから使い方をググってみると、意外とめんどくさい。特に今回買ったのがアノードコモンだったので、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からみたら結構忙しいね。
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); } }