今回は【難易度★★★】です。
かなり前に作ってあまり覚えていないためスケッチの解読は各自でお願いします(←)

仕様
- リセットボタンで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年ほど連続動作して問題ないことが確認できました