今回は【難易度★★★】です。

 

かなり前に作ってあまり覚えていないためスケッチの解読は各自でお願いします(←)

 

仕様

 

  • リセットボタンでGPSから時計合わせ
  • カソードコモン7セグLEDを6つで分秒表示
  • DS3231でより正確な時刻・バックアップ

だったと思います()

 

 

用意するもの

 

 

 

↑↓どちらか

 

 

発光部分は各自で用意した7セグに合わせてください

 

 

接続

 

 

7セグ部分

 

   Arduino---7seg
   D2---a
   D3---b
   .
   .
   .
   D8---g
   D9---G1
   D10---G2
   D11---G3
   D12---G4

   D13---D.P
   A0---G5
   A1---G6

 

 

NEO-6M(GPS)

 

   Arduino---NEO6M
   5V(3.3V)---VCC
   GND---GND
   A2---TX
   A3---RX

 

 

DS3231

 

   5V---VCC
   GND---GND
   SDA---SDA
   SCL---SCL

 

スケッチ

 

/* How to Connection
   Arduino---7seg
   D2---a
   D3---b
   .
   .
   .
   D8---g
   ---D.P
   D9---G1
   D10---G2
   D11---G3
   D12---G4
   A0---G5
   A1---G6


   Arduino---NEO6M
   5V(3.3V)---VCC
   GND---GND
   A2---TX
   A3---RX

*/
bool Century = false;
static const int RXPin = A2, TXPin = A3;  //NEO 6M

long year, month, day, hour, minute, second;
int c[6];

#include <TinyGPS++.h>
TinyGPSPlus gps;

#include <SoftwareSerial.h>
SoftwareSerial ss(RXPin, TXPin);

#include <DS3231.h>
#include <Wire.h>
DS3231 Clock;

bool h12Flag = false;
bool pmFlag = false;
bool century = false;

boolean Num_Array[10][7] = {
  {1, 1, 1, 1, 1, 1, 0}, //0
  {0, 1, 1, 0, 0, 0, 0}, //1
  {1, 1, 0, 1, 1, 0, 1}, //2
  {1, 1, 1, 1, 0, 0, 1}, //3
  {0, 1, 1, 0, 0, 1, 1}, //4
  {1, 0, 1, 1, 0, 1, 1}, //5
  {1, 0, 1, 1, 1, 1, 1}, //6
  {1, 1, 1, 0, 0, 1, 0}, //7
  {1, 1, 1, 1, 1, 1, 1}, //8
  {1, 1, 1, 1, 0, 1, 1}  //9
};

void setup()
{

  Serial.begin(9600);

  Wire.begin();

  for (int i = 2; i < 16; i++)
  {
    pinMode(i, OUTPUT);
  }

  ReadGPS();


}
void loop()
{
  year = Clock.getYear();
  month = Clock.getMonth(Century);
  day = Clock.getDate();
  hour = Clock.getHour(h12Flag, pmFlag);
  minute = Clock.getMinute();
  second = Clock.getSecond();

  hour += 9; //JST=UTC+9
  if (hour >= 24)
  {
    day += hour / 24;
    hour = hour % 24;
  }
  Serial.print("sevseg: ");
  Serial.println(hour * 10000 + minute * 100 + second);
  /*
    Serial.print("GPS: ");
    Serial.println( gps.time.hour() * 10000 + gps.time.minute() * 100 + gps.time.second());
    Serial.println();
  */
  SevSegShowTime(hour * 10000 + minute * 100 + second);
}

void ReadGPS()
{
Reset:

  ss.begin(9600);
  long WaitTime = millis();

  c7s(0);

  while (!ss.available() && WaitTime + 6000 > millis() && gps.satellites.value() == 0)
  {
    digitalWrite(5, HIGH);

    if (((millis() - WaitTime) / 1000) < 4)
    {
      digitalWrite(((millis() - WaitTime) / 1000) + 9, LOW);
      c7s(0);
    }
    if (3 < ((millis() - WaitTime) / 1000) && ((millis() - WaitTime) / 1000) < 6)
    {
      digitalWrite(((millis() - WaitTime) / 1000) + 10, LOW);
      c7s(0);
    }
  }

  c7s(0);

  while (ss.available())
  {
    //Serial.print(ss.read());
    char g = ss.read();
    gps.encode(g);
  }
  if (gps.time.minute() == 0)
  {
    goto Reset;
  }
  else
  {
    Clock.setYear(gps.date.year() - 2000);
    Clock.setMonth(gps.date.month());
    Clock.setDate(gps.date.day());
    //    Clock.setDoW(DoW);
    Clock.setHour(gps.time.hour());
    Clock.setMinute(gps.time.minute());
    Clock.setSecond(gps.time.second());
  }

  ss.end();

}


void SevSegShowTime(long Time6)
{
  for (int i = 0; i < 6; i++)
  {
    c[5 - i] = Time6 % 10;
    Time6 /= 10;
  }

  NumPrint(c[0]);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delayMicroseconds(200);
  c7s(1);

  NumPrint(c[1]);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delayMicroseconds(200);
  c7s(1);

  NumPrint(c[2]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[3]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[4]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[5]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  delay(2);
  c7s(1);

}

void NumPrint(int Number) {

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(i + 2, Num_Array[Number][i]);
  }
}

void c7s(int Delay)
{
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delay(Delay);
}

 

 

スケッチ解説?

 

GPSから時計を受信&DS3231に書き込み

void ReadGPS()
{
Reset:

  ss.begin(9600);
  long WaitTime = millis();

  c7s(0);

  while (!ss.available() && WaitTime + 6000 > millis() && gps.satellites.value() == 0)
  {
    digitalWrite(5, HIGH);

    if (((millis() - WaitTime) / 1000) < 4)
    {
      digitalWrite(((millis() - WaitTime) / 1000) + 9, LOW);
      c7s(0);
    }
    if (3 < ((millis() - WaitTime) / 1000) && ((millis() - WaitTime) / 1000) < 6)
    {
      digitalWrite(((millis() - WaitTime) / 1000) + 10, LOW);
      c7s(0);
    }
  }

  c7s(0);

  while (ss.available())
  {
    //Serial.print(ss.read());
    char g = ss.read();
    gps.encode(g);
  }
  if (gps.time.minute() == 0)
  {
    goto Reset;
  }
  else
  {
    Clock.setYear(gps.date.year() - 2000);
    Clock.setMonth(gps.date.month());
    Clock.setDate(gps.date.day());
    //    Clock.setDoW(DoW);
    Clock.setHour(gps.time.hour());
    Clock.setMinute(gps.time.minute());
    Clock.setSecond(gps.time.second());
  }

  ss.end();

}

 

 

この関数に6桁の数字を入れると時分秒で表示

 

void SevSegShowTime(long Time6)
{
  for (int i = 0; i < 6; i++)
  {
    c[5 - i] = Time6 % 10;
    Time6 /= 10;
  }

  NumPrint(c[0]);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delayMicroseconds(200);
  c7s(1);

  NumPrint(c[1]);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delayMicroseconds(200);
  c7s(1);

  NumPrint(c[2]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[3]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[4]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  delay(2);
  c7s(1);

  NumPrint(c[5]);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  delay(2);
  c7s(1);

}

 

 

この関数に1桁の数字を入れると7セグ1本ずつ表示

void NumPrint(int Number) {

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(i + 2, Num_Array[Number][i]);
  }
}

 

最後に

 

 

かなり適当になってしまいましたが、

スケッチの参考になれば幸いです。

一応1年ほど連続動作して問題ないことが確認できました