/*
https://github.com/Treboada/Ds1302
A C/C++ library to use DS1302 RTC chip.
https://github.com/avishorp/TM1637
Arduino library for TM1637 (LED Driver)
*/
#include <Ds1302.h>
#include "TM1637Display.h"
#define CLK1 9
#define DIO1 10
#define CLK2 11
#define DIO2 12
#define DS1302_RAMSIZE 31
Ds1302 rtc(5, 7, 6);
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);
uint8_t prev_second;
const char data[] = "Hello World";
const static char* WeekDays[] =
{
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
void setup()
{
Serial.begin(115200);
display1.setBrightness(7);
display2.setBrightness(7);
rtc.init();
Ds1302::DateTime dt = {
.year = 22,
.month = Ds1302::MONTH_NOV,
.day = 27,
.hour = 2,
.minute = 15,
.second = 30,
.dow = Ds1302::DOW_SUN
};
rtc.setDateTime(&dt);
for (int i = 0; i < 11; ++i)
{
pinMode(6, OUTPUT);
shiftOut(6, 7, LSBFIRST, 0xC0 + 2 * i);
shiftOut(6, 7, LSBFIRST, data[i]);
}
}
uint8_t readByte()
{
pinMode(6, INPUT);
uint8_t value = 0;
for (uint8_t i = 0; i < 8; ++i)
{
uint8_t bit = digitalRead(6);
value |= (bit << i);
digitalWrite(7, HIGH);
digitalWrite(7, LOW);
}
return value;
}
void printTime(Ds1302::DateTime &now)
{
Serial.print("20");
Serial.print(now.year);
Serial.print('-');
if (now.month < 10)
{
Serial.print('0');
}
Serial.print(now.month);
Serial.print('-');
if (now.day < 10)
{
Serial.print('0');
}
Serial.print(now.day);
Serial.print(' ');
Serial.print(WeekDays[now.dow - 1]);
Serial.print(' ');
if (now.hour < 10)
{
Serial.print('0');
}
Serial.print(now.hour);
Serial.print(':');
if (now.minute < 10)
{
Serial.print('0');
}
Serial.print(now.minute);
Serial.print(':');
if (now.second < 10)
{
Serial.print('0');
}
Serial.print(now.second);
Serial.println();
}
void loop()
{
Ds1302::DateTime now;
rtc.getDateTime(&now);
if (now.second != prev_second)
{
prev_second = now.second;
uint8_t ram[DS1302_RAMSIZE];
for (int i = 0; i < 11; ++i)
{
pinMode(6, OUTPUT);
shiftOut(6, 7, LSBFIRST, 0xC1 + 2 * i);
ram[i] = readByte();
}
Serial.print((const char*)ram);
Serial.print(' ');
printTime(now);
}
display1.showNumberDec(now.hour, 0x80, 2, 2);
display2.showNumberDecEx(now.minute, 0x80, 2, 2);
display2.showNumberDecEx(now.second, 0x80, true, 2, 2);
delay(100);
}