onegoup

自動で同期する大きなデジタル時計を作成

使ったもの

  • 超大型4桁LED表示キット(秋月電子通商)1500円
    • 大型16セグメント赤色LED表示器(KA2311)を7セグメント表示器として使用
    • アノードコモン(+が共通→LOWにすると点灯。HIGHにすると消灯)
  • ESP32

工夫したこと

  • 接続端子が下になるように設計されていますが、座りが悪いので上下反対にしました。
  • 枠と台座を3Dプリンタで作成しました。
  • 寝室で使うのでLED接続抵抗を大きく(220Ω)して、光を微弱にしました。(電気を消さないと時刻を確認することができません。)

配線

各ピンは下記の通り各LEDと接続されています。 また、今回は上下逆さにして使用しましので、下記図を意識して数字を作っていきます。 (例えば、数字の1を作るときは本来ならBとCのLEDを点灯させるのですが、今回はEとFのLEDを点灯させます。)

コード

#include <WiFi.h>
#include <time.h>

unsigned long time_data = 0;

#define JST 3600* 9

//ご自身の環境に合わせて変更して下さい。
const char* ssid = "xxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxx";

int i = 0;
//pinの割り当て
int pinA = 23;
int pinB = 14;
int pinC = 33;
int pinD = 26;
int pinE = 27;
int pinF = 12;
int pinG = 32;
int pinDP = 25;
int D1 = 5;
int D2 = 18;
int D3 = 19;
int D4 = 21;
int t = 250; // time delay

void setup() {
Serial.begin(115200);
delay(100);
Serial.print("\n\nStart\n");

WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.printf("Connected, IP address: ");
Serial.println(WiFi.localIP());

time_data = millis();

configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");

// pinの初期化
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinDP, OUTPUT); //今回不使用
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);

}

void loop() {
time_t t;
struct tm *tm;
t = time(NULL);
tm = localtime(&t);
int h10 = (("%02d",tm->tm_hour) / 10) % 10 ;
int h1 = (("%02d",tm->tm_hour) / 1) % 10 ;
int m10 = (("%02d",tm->tm_min) / 10) % 10 ;
int m1 = (("%02d",tm->tm_min) / 1) % 10 ;
getTime();

//4桁をOFF
write_D1();
print_off();
delay(1);

write_D2();
print_off();
delay(1);

write_D3();
print_off();
delay(1);

write_D4();
print_off();
delay(1);

if(m1 == 0){
write_D1();
print_0();
delay(1);
}
if(m1 == 1){
write_D1();
print_1();
delay(1);
}
if(m1 == 2){
write_D1();
print_2();
delay(1);
}
if(m1 == 3){
write_D1();
print_3();
delay(1);
}
if(m1 == 4){
write_D1();
print_4();
delay(1);
}
if(m1 == 5){
write_D1();
print_5();
delay(1);
}
if(m1 == 6){
write_D1();
print_6();
delay(1);
}
if(m1 == 7){
write_D1();
print_7();
delay(1);
}
if(m1 == 8){
write_D1();
print_8();
delay(1);
}
if(m1 == 9){
write_D1();
print_9();
delay(1);
}
if(m10 == 0){
write_D2();
print_0();
delay(1);
}
if(m10 == 1){
write_D2();
print_1();
delay(1);
}
if(m10 == 2){
write_D2();
print_2();
delay(1);
}
if(m10 == 3){
write_D2();
print_3();
delay(1);
}
if(m10 == 4){
write_D2();
print_4();
delay(1);
}
if(m10 == 5){
write_D2();
print_5();
delay(1);
}
if(h1 == 0){
write_D3();
print_0();
delay(1);
}
if(h1 == 1){
write_D3();
print_1();
delay(1);
}
if(h1 == 2){
write_D3();
print_2();
delay(1);
}
if(h1 == 3){
write_D3();
print_3();
delay(1);
}
if(h1 == 4){
write_D3();
print_4();
delay(1);
}
if(h1 == 5){
write_D3();
print_5();
delay(1);
}
if(h1 == 6){
write_D3();
print_6();
delay(1);
}
if(h1 == 7){
write_D3();
print_7();
delay(1);
}
if(h1 == 8){
write_D3();
print_8();
delay(1);
}
if(h1 == 9){
write_D3();
print_9();
delay(1);
}

if(h10 == 0){
write_D4();
print_0();
delay(1);
}
if(h10 == 1){
write_D4();
print_1();
delay(1);
}
if(h10 == 2){
write_D4();
print_2();
delay(1);
}

}
//30分毎にインターネットと同期
void getTime(){
if(millis()-time_data > 60000 * 30){
configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
time_data = millis();
}
}

//各桁書込み設定
void write_D1()
{
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
}

void write_D2()
{
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
}

void write_D3()
{
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
}

void write_D4()
{
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
}

// 数字書き込み設定
void print_0() // writing 0
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinDP, HIGH); // the decimal point is always off by default
}

void print_1() // writing 1
{
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinDP, HIGH);
}

void print_2() // writing 2
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_3() // writing 3
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_4() // writing 4
{
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_5() // writing 5
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_6() // writing 6
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_7() // writing 7
{
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinDP, HIGH);
}

void print_8() // writing 8
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_9() // writing 9
{
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinDP, HIGH);
}

void print_off(){
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinDP, HIGH);
}
//今回は使用してません。
void print_decimal() // writing the decimal point
{
digitalWrite(pinDP, HIGH);
}

コード解説

  • 各数字を表示する関数を作成
  • 各桁をIF関数でチェックし、数字を表示
  • 30分毎にインターネットに接続して時刻を同期

フレーム作成

  • そのままでは自立しないので3Dプリンタでフレームを作成しました。