#include "RTClib.h"
#include <TimerOne.h>
#include <Keypad.h>
RTC_DS1307 rtc;
const uint8_t ROWS = 4;
const uint8_t COLS = 3;
char keys[ROWS][COLS] = {
{ '1', '2', '3'},
{ '4', '5', '6'},
{ '7', '8', '9'},
{ '*', '0', '#'}
};
uint8_t colPins[COLS] = { 5, 4, 3 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
Keypad keypad1(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Clock myClock(0, 0, 0, 0);
int sec = 59;
unsigned long t1;
unsigned long period;
bool _update1 = false;
bool _update2 = false;
int hour = 23;
int minute = 59;
int misec = 99;
void showTime()
{
Serial.print(myClock._hour);
Serial.print(":");
Serial.print(myClock._minute);
Serial.print(":");
Serial.print(myClock._second);
}
void setup()
{
// 初始化串口
Serial.begin(9600);
Serial.println(" ");
// 初始化LCD 2004 顯示器
myClock.init_LCD();
lcd.backlight();
Timer1.initialize(10000); // us單位
Timer1.attachInterrupt(abc);
//Timer1.initialize(10000);
//Timer1.attachInterrupt(def);
// 設定時鐘初始時間
myClock.setTime(1, 2, 3, 1);
myClock.getTime();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop()
{
DateTime now = rtc.now();
char key = keypad1.getKey();
if (key != NO_KEY) {
//Serial.println(key);
lcd.setCursor(0, 0);
lcd.print(key);
}
// 讀取Serial monitor輸入
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
myClock.setTime(now.hour(), now.minute(), now.second(), 2);
if (_update1)
{
lcd.setCursor(0, 3);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
if (sec < 10){
lcd.print("0");
lcd.print(sec);
}
else
lcd.print(sec);
lcd.print(".");
lcd.print(misec);
_update1=false;
}
myClock.updateTime();
myClock.displayTime();
myClock.getTime();
delay(1000);
}
void abc(){
if (misec > 0)
misec--;
else{
misec = 99;
if (sec > 0){
sec--;
}
else{
sec = 59;
if (minute > 0){
minute--;
}
else{
minute = 59;
hour--;
}
}
}
_update1 = true;
}
// LCD 2004 顯示器初始化
LiquidCrystal_I2C lcd(0x27, 20, 4);
// 宣告時鐘類別
Clock::Clock(int h, int m, int s, int d) {
_hour = h;
_minute = m;
_second = s;
_mode = d;
}
void Clock::init_LCD() {
lcd.init();
lcd.backlight();
}
// 取得時鐘時間
void Clock::getTime() {
Serial.print(_hour);
Serial.print(":");
Serial.print(_minute);
Serial.print(":");
Serial.println(_second);
}
// 設定時鐘時間
void Clock::setTime(int h, int m, int s, int d) {
_hour = h;
_minute = m;
_second = s;
_mode = d;
}
// 顯示時鐘時間
void Clock::displayTime() {
lcd.setCursor(0,0);
lcd.print("myClock:S1152040");
lcd.setCursor(0,2);
if (_hour < 10)
{
lcd.print("0");
lcd.print(_hour);
}
if (_hour >= 10)
{
lcd. print(_hour);
}
lcd.print(":");
if (_minute < 10)
{
lcd.print("0");
lcd.print(_minute);
}
if (_minute >= 10)
{
lcd.print(_minute);
}
lcd.print(":");
if (_second < 10)
{
lcd.print("0");
lcd.print(_second);
}
if (_second >= 10)
{
lcd.print(_second);
}
lcd.print(" ");
lcd.setCursor(0, 1);
if (_mode == 1)
{
lcd.print("Manual");
}
else if (_mode == 2)
{
lcd.print("2023/04/16");
}
}
// 更新時鐘時間
void Clock::updateTime() {
_second++;
if (_second >= 60) {
lcd.setCursor(0,13);
lcd.print(" ");
_second = 0;
_minute++;
if (_minute >= 60) {
lcd.setCursor(0,10);
lcd.print(" ");
_minute = 0;
_hour++;
if (_hour >= 24) {
lcd.setCursor(0,7);
lcd.print(" ");
_hour = 0;
}
}
}
};