//#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_NeoPixel.h>
#include <TinyGPS.h>
#define DISPLAY_PIN 4
RTC_DS1307 rtc;
Adafruit_NeoPixel *leds;
TinyGPS gps;
#define RED 0x00ff0000
#define BLUE 0x000000088
#define GREEN 0x00008800
#define WHITE 0x00ffffff
const uint8_t font[] = {
0x1f, 0x11, 0x1f, // 0
0x12, 0x1F, 0x10, // 1
0x1D, 0x15, 0x17, // 2
0x15, 0x15, 0x1f, // 3
0x07, 0x04, 0x1F, // 4
0x17, 0x15, 0x1D, // 5
0x1F, 0x15, 0x1D, // 6
0x01, 0x01, 0x1F, // 7
0x1F, 0x15, 0x1F, // 8
0x17, 0x15, 0x1F, // 9
0x00, 0x0A, 0x00, // :
0x00, 0x0A, 0x00, // ;
};
void draw(int x, int y, char *text, uint32_t color) {
uint8_t pos = 0;
for (unsigned int l = 0; l < strlen(text); l++) {
uint8_t ch = text[l] - 0x30;
for (uint8_t c = 0; c < 3 ; c++) {
uint8_t colbits = font[ch * 3 + c];
if (colbits != 0) {
for (int r = 0; r < 5; r++) {
uint32_t col = ((colbits & (1 << r)) == 0) ? 0 : color;
uint32_t pixel = 32 * (y + r) + x + pos;
leds->setPixelColor(pixel, col);
}
pos += 1;
}
}
if (l < strlen(text) - 1)
pos += 1;
}
}
bool isDST(DateTime now) {
// from sunday before last friday of march
// to last sunday of october
DateTime d = DateTime(now.year(), 4, 1) - TimeSpan(1, 0, 0, 0);
while (d.dayOfTheWeek() != 5)
d = d - TimeSpan(1, 0, 0, 0);
while (d.dayOfTheWeek() != 0)
d = d - TimeSpan(1, 0, 0, 0);
DateTime dststart = d;
d = DateTime(now.year(), 11, 1) - TimeSpan(1, 0, 0, 0);
while (d.dayOfTheWeek() != 1)
d = d - TimeSpan(1, 0, 0, 0);
DateTime dstend = d;
if ((now == dststart && now.hour() >= 2) ||
(now > dststart && now < dstend) ||
(now == dstend && now.hour() < 2))
return true;
return false;
}
void setup() {
Serial.begin(9600);
Serial.println("start");
Serial2.begin(4800);
leds = new Adafruit_NeoPixel(32 * 8, DISPLAY_PIN, NEO_GRB + NEO_KHZ800);
leds->begin();
leds->show();
leds->clear();
//leds->setBrightness(BRIGHTNESS);
rtc.begin();
}
unsigned long gpsDate;
unsigned long gpsTime;
void loop() {
while (Serial2.available()) {
char c = Serial2.read();
//delay(10);
Serial.print(c);
if (gps.encode(c)) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("XXXXXX");
unsigned long age;
gps.get_datetime(&gpsDate, &gpsTime, &age);
//Serial.print(gpsDate);
//Serial.print(" ");
//Serial.print(gpsTime);
//Serial.print(" ");
//Serial.println(age);
}
}
DateTime now;
// if not provisioned, check gps, time=0:0:0
//if (rtc.isrunning())
if (gpsDate && gpsTime) {
int day = gpsDate / 10000;
int month = (gpsDate / 100) % 100;
int year = gpsDate % 100;
int hour = gpsTime / 1000000;
int minute = (gpsTime / 10000) % 100;
int second = (gpsTime / 100) % 100;
now = DateTime(year, month, day, hour, minute, second);
rtc.adjust(now);
} else
now = DateTime();
char buf[6];
sprintf(buf, "%02d:%02d", now.hour(), now.minute());
//Serial.println(buf);
draw(2, 1, buf, 0xff0000);
sprintf(buf, ";%02d", now.second());
//Serial.println(buf);
draw(21, 1, buf, 0x880000);
leds->show();
delay(10);
}