//#include <Arduino_JSON.h>
#include <EEPROM.h>
#include <GyverOLED.h>
#include <Wire.h>
#include "DS3231.h"
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
//GyverOLED<SSH1106_128x64> oled;
DS3231 clock;
RTCDateTime now;
RTCAlarmTime a1;
RTCAlarmTime a2;
//--------------- 元件接腳名稱控制參數設定 -----------------------
#define LED_9 9
#define SQW_PIN 2
//-------------- 74595 IC 元件接腳名稱控制參數設定 ---------------
#define SH1 8
#define ST1 7
#define DATA1 6
#define SH2 11
#define ST2 10
#define DATA2 9
#define SH3 5
#define ST3 4
#define DATA3 3
//----- 請重頭到尾仔細確認系統用到的所有輸入及輸出 GPIO 陣列集合 -----
char pinOUT[] = {SH1,ST1,DATA1,SH2,ST2,DATA2,SH3,ST3,DATA3, LED_9};
//------------------------------------------------------------
#define BTN_1 14
#define BTN_2 15
#define BTN_3 16
#define BTN_4 17
//----- 請重頭到尾仔細確認系統用到的所有輸入及輸出 GPIO 陣列集合 -----
char pinINPUT[] = {BTN_1, BTN_2, BTN_3, BTN_4, SQW_PIN};
//-------------------------------ATM 328 接腳定義------------------------------
//FUN RST RX TX PWM VCC GND PWM PWM
//PIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14
//PORT PC6 PD0 PD1 PD2 PD3 PD4 PB6 PB7 PD5 PD6 PD7 PB0
//GPIO 0 1 2 3 4 5 6 7 8
//----------------------------------------------------------------------------
//FUN PWM PWM PWM VCC AER GND AD0 AD1 AD2 AD3 AD4 AD5
//PIN 15 16 17 18 19 20 21 22 23 24 25 26 27 28
//PORT PB1 PB2 PB3 PB4 PB5 PC0 PC1 PC2 PC3 PC4 PC5
//GPIO 9 10 11 12 13 A0(14) A1(15) A2(16) A3(17) A4(18) A5(19)
//----------------------------------------------------------------------------
int rtcyear, rtcmonth, rtcday, rtchour, rtcmin, rtcsec;
int leddis;
void setup()
{
Serial.begin(115200);
for (int i = 0; i < (sizeof(pinOUT) / sizeof(char)); i++)
pinMode(pinOUT[i], OUTPUT);
for (int i = 0; i < (sizeof(pinINPUT) / sizeof(char)); i++)
pinMode(pinINPUT[i], INPUT_PULLUP);
//digitalWrite(SQW_PIN, LOW);
leddis = 0x00;
oled.init(); oled.clear(); oled.update();
Wire.begin();
clock.begin();
clock.clearAlarm1();
clock.clearAlarm2();
//clock.setDateTime(__DATE__, __TIME__);
//clock.setDateTime(2023,12,2,7,30,25);
}
//------------------------------------------------------------
byte seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x63,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0xa7,0xff,0xef};// 含小數點的 0~9
byte Buff[]={0,0,0,0,0,0,0,0};
byte scan[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//------------------------------------------------------------
void setdatabus()
{
digitalWrite(ST3, 0);
shiftOut(DATA3, SH3, MSBFIRST, ~leddis);
digitalWrite(ST3, 1);
}
//------------------------------------------------------------
void nowtime()
{
now = clock.getDateTime();
rtcyear = now.year; rtcmonth = now.month; rtcday = now.day;
rtchour = now.hour; rtcmin = now.minute; rtcsec = now.second;
}
//------------------------------------------------------------
void disp(byte data7s,byte num7s)
{
digitalWrite(ST2,0);
shiftOut(DATA2,SH2,MSBFIRST,0x00);
digitalWrite(ST2,1);
digitalWrite(ST1,0);
shiftOut(DATA1,SH1,MSBFIRST,~seg[data7s]);
digitalWrite(ST1,1);
digitalWrite(ST2,0);
shiftOut(DATA2,SH2,MSBFIRST,scan[num7s]);
digitalWrite(ST2,1);
//delay(2);
}
//------------------------------------------------------------
byte no=7;
void show()
{
disp(Buff[no],no);
no=(no+1)%8;
setdatabus();
//delay(1);
}
//------------------------------------------------------------
int segmode=0,segmc=0;
unsigned long segmt=0;
void segshow()
{
now = clock.getDateTime();
int T=clock.readTemperature()*100;
switch(segmode)
{
case 1:
Buff[0]=now.hour/10; Buff[1]=now.hour%10;
Buff[2]=17; Buff[3]=now.minute/10;
Buff[4]=now.minute%10; Buff[5]=17;
Buff[6]=now.second/10; Buff[7]=now.second%10;
break;
case 2:
Buff[0]=now.year/1000; Buff[1]=now.year/100%10;
Buff[2]=now.year/10%10; Buff[3]=now.year%10;
Buff[4]=now.month/10; Buff[5]=now.month%10;
Buff[6]=now.day/10; Buff[7]=now.day%10;
break;
case 3:
Buff[0]=17; Buff[1]=T/1000;
Buff[2]=T/100%10+19; Buff[3]=T/10%10;
Buff[4]=T%10; Buff[5]=18;
Buff[6]=12; Buff[7]=17;
break;
case 4:
if(millis()-segmt>=1000)
{
segmt=millis();
segmc=(segmc%14)+1;
if(segmc>=1&&segmc<=8)
{
Buff[0]=now.hour/10; Buff[1]=now.hour%10;
Buff[2]=17; Buff[3]=now.minute/10;
Buff[4]=now.minute%10; Buff[5]=17;
Buff[6]=now.second/10; Buff[7]=now.second%10;
}
else if(segmc>=9&&segmc<=11)
{
Buff[0]=now.year/1000; Buff[1]=now.year/100%10;
Buff[2]=now.year/10%10; Buff[3]=now.year%10;
Buff[4]=now.month/10; Buff[5]=now.month%10;
Buff[6]=now.day/10; Buff[7]=now.day%10;
}
else if(segmc>=12&&segmc<=14)
{
Buff[0]=17; Buff[1]=T/1000;
Buff[2]=T/100%10+19; Buff[3]=T/10%10;
Buff[4]=T%10; Buff[5]=18;
Buff[6]=12; Buff[7]=17;
}
}
}
}
//------------------------------------------------------------
char Readkey()
{
char key = 0;
if ( digitalRead(BTN_4) == 0 ) key |= 8;
if ( digitalRead(BTN_3) == 0 ) key |= 4;
if ( digitalRead(BTN_2) == 0 ) key |= 2;
if ( digitalRead(BTN_1) == 0 ) key |= 1;
return key;
}
//------------------------------------------------------------
unsigned long switchkeym=0;
int newkey,oldkey;
//------------------------------------------------------------
int modec = 1, menu = 0, aa = 0;
int oledsegmode=1;
void switchkey()
{
if(millis()-switchkeym>=50)
{
switchkeym=millis();
newkey=Readkey();
if (newkey != oldkey)
{
switch(newkey)
{
case 1:
switch(menu)
{
case 0: modec--; if(modec<1)modec=4; break;
default:break;
}
break;
case 2:
oled.clear();
switch(modec)
{
case 1: menu=1; oledsegmode=2; segmode=1; nowtime(); break;
case 2: menu=2; oledsegmode=2; segmode=2; nowtime(); break;
case 3: menu=3; oledsegmode=2; segmode=3; nowtime(); break;
case 4: menu=4; oledsegmode=2; segmode=4; break;
default:break;
}
break;
case 4:
oled.clear(); segmode=0;
switch(menu)
{
case 1: menu=0; modec=1; oledsegmode=1; break;
case 2: menu=0; modec=2; oledsegmode=1; break;
case 3: menu=0; modec=3; oledsegmode=1; break;
case 4: menu=0; modec=4; oledsegmode=1; break;
default:break;
}
break;
case 8:
switch(menu)
{
case 0: modec=(modec%4)+1; break;
default:break;
}
default:break;
}
oldkey = newkey;
}
}
}
//------------------------------------------------------------
void oledshow()
{
if(menu==0)
{
oled.setScale(1);
for (int i = 1; i <= 4; i++)
{
oled.setCursor(0, i);
oled.invertText(modec == i);
switch (i)
{
case 1: oled.print(" now time "); break;
case 2: oled.print(" now date "); break;
case 3: oled.print(" now temp "); break;
case 4: oled.print(" time-date-temp "); break;
}
}
oled.invertText(false);
oled.setCursor(0, 0);
oled.print(" RTC show ");
oled.update();
}
else
{
oled.invertText(false);
oled.setScale(2);
oled.setCursor(0, 0);
switch(menu)
{
case 1: oled.print(">Now Time<"); break;
case 2: oled.print(">Now Date<"); break;
case 3: oled.print(">Now Temp<"); break;
case 4: oled.setCursor(0, 0);oled.print("Time->8S");
oled.setCursor(0, 2);oled.print("Date->3S");
oled.setCursor(0, 4);oled.print("Temp->3S"); break;
default:break;
}
oled.update();
}
}
//------------------------------------------------------------
unsigned long segoledt=0;
char oledflag=0;
void loop()
{
switchkey();
switch(oledsegmode)
{
case 1: oledshow();oledflag=0; break;
case 2:
segshow();
show();
//if((millis()-segoledt>=1000&&oledflag==0))
if(oledflag==0)
{
segoledt=millis();
oledshow();
oledflag=1;
}
break;
default:break;
}
}