#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MsTimer2.h>
#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h>
#include "RTClib.h"
RTC_DS3231 rtc;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
String input_string;
#define button1    A0                      // Button B1 is connected to Arduino pin 9
#define button2    A1 


int dataPin = 6;
int latchPin = 5;
int clockPin = 3;
int strsize;
int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0, flag6 = 0, flag7 = 0, flag8 = 0,flag9=0;
int flicker = 0;
int RLED1 = 9;
int GLED1 = 10;
int y, m, d, h, mi, s;
int temp1, temp2, temp3, temp4;
int BT = 0;
int t1 = 0;
int selected = 0;
int entered = 0;
int M1=0,M2=0,M3=0;


byte OP[5];
unsigned char my_str[5], password[5];
byte JJ[5];
byte cmd[20];
byte dd[10];
byte tt[10];
byte ss;
byte rr;
char Time[] = "  :  :  ";
char Calendar[] = "  /  /20  ";
char temperature[] = " 00.00";
char temperature_msb;
String daysOfWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
byte i, second, minute, hour, day, date, month, year, temperature_lsb;



static const unsigned char PROGMEM logo_bmp1[] = { //僑
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X87,0X80,0X01,0X78,0X00,0X01,
0X08,0X40,0X02,0XFF,0XE0,0X02,0X11,0X00,0X06,0X3F,0X80,0X0A,0XD1,0X60,0X02,0X1F,
0X00,0X02,0X00,0X00,0X02,0X7F,0XE0,0X02,0X40,0X20,0X02,0X5F,0X20,0X02,0X51,0X20,
0X02,0X5F,0X20,0X02,0X40,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};

static const unsigned char PROGMEM logo_bmp2[] = { //僑泰
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,
0X3C,0X01,0X80,0X00,0X0B,0XC0,0X01,0X00,0X00,0X08,0X42,0X3F,0XFE,0X00,0X17,0XFF,
0X02,0X00,0X00,0X10,0X88,0X0F,0XF8,0X00,0X31,0XFC,0X04,0X00,0X00,0X56,0X8B,0X7F,
0XFF,0X00,0X10,0XF8,0X08,0X08,0X00,0X10,0X00,0X10,0XC4,0X00,0X13,0XFF,0X28,0X8A,
0X00,0X12,0X01,0X44,0X91,0X00,0X12,0XF9,0X02,0XB0,0X00,0X12,0X89,0X0C,0X8C,0X00,
0X12,0XF9,0X30,0X84,0X00,0X12,0X03,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};

static const unsigned char PROGMEM logo_bmp3[] = { //僑太高
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X18,0X78,0X03,0X00,0X02,0X00,0X00,0X17,0X80,0X02,0X00,
0X01,0X04,0X00,0X10,0X84,0X7F,0XFC,0XFF,0XFE,0X00,0X2F,0XFE,0X04,0X00,0X00,0X00,
0X00,0X21,0X10,0X1F,0XF0,0X1F,0XE0,0X00,0X63,0XF8,0X08,0X00,0X10,0X20,0X00,0XAD,
0X16,0XFF,0XFE,0X1F,0XE0,0X00,0X21,0XF0,0X10,0X10,0X40,0X04,0X00,0X20,0X00,0X21,
0X88,0X7F,0XFE,0X00,0X27,0XFE,0X51,0X14,0X40,0X04,0X00,0X24,0X02,0X89,0X22,0X4F,
0XC4,0X00,0X25,0XF2,0X05,0X60,0X48,0X44,0X00,0X25,0X12,0X19,0X18,0X4F,0XC4,0X00,
0X25,0XF2,0X61,0X08,0X40,0X1C,0X00,0X24,0X06,0X07,0X00,0X40,0X08,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00};


static const unsigned char PROGMEM logo_bmp4[] = { //僑泰高中
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X78,0X03,0X00,0X02,
0X00,0X01,0X80,0X00,0X17,0X80,0X02,0X00,0X01,0X04,0X01,0X00,0X00,0X10,0X84,0X7F,
0XFC,0XFF,0XFE,0X01,0X00,0X00,0X2F,0XFE,0X04,0X00,0X00,0X00,0X41,0X04,0X00,0X21,
0X10,0X1F,0XF0,0X1F,0XE0,0X7F,0XFE,0X00,0X63,0XF8,0X08,0X00,0X10,0X20,0X41,0X04,
0X00,0XAD,0X16,0XFF,0XFE,0X1F,0XE0,0X41,0X04,0X00,0X21,0XF0,0X10,0X10,0X40,0X04,
0X41,0X04,0X00,0X20,0X00,0X21,0X88,0X7F,0XFE,0X41,0X04,0X00,0X27,0XFE,0X51,0X14,
0X40,0X04,0X7F,0XFC,0X00,0X24,0X02,0X89,0X22,0X4F,0XC4,0X41,0X04,0X00,0X25,0XF2,
0X05,0X60,0X48,0X44,0X01,0X00,0X00,0X25,0X12,0X19,0X18,0X4F,0XC4,0X01,0X00,0X00,
0X25,0XF2,0X61,0X08,0X40,0X1C,0X01,0X00,0X00,0X24,0X06,0X07,0X00,0X40,0X08,0X01,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};

void testdrawbitmap1(void) //
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(25, 0);
    display.print("C0636");
    display.drawBitmap(0, 20, logo_bmp1, 23, 21, 1);
    display.display();
}
void testdrawbitmap2(void) //
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(25, 0);
    display.print("C0636");
    display.drawBitmap(0, 20, logo_bmp2, 33, 21, 1);
    display.display();
}
void testdrawbitmap3(void) //
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(25, 0);
    display.print("C0636");
    display.drawBitmap(0, 20, logo_bmp3, 51, 21, 1);
    display.display();
}
void testdrawbitmap4(void) //
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(25, 0);
    display.print("C0636");
    display.drawBitmap(0, 20, logo_bmp4, 67, 21, 1);
    display.display();
}

void onTimer()
{
    if (BT == 1)
    {
        flicker++;
    }
    if ((strsize = (Serial.available())) > 0) // 如有藍芽封包資料,進入將資料存起來
    {
        for (int i = 0; i < strsize; i++)
        {
            cmd[i] = char(Serial.read());
        }
        if (cmd[0] == 0X1A && cmd[1] == 0x01) // 藍芽連線
        {
            BT = 1;
        }
        else if (cmd[0] == 0X1A && cmd[1] == 0x02) // 藍芽關閉
        {
            BT = 2;
        }
        else if (cmd[0] == 0X1B && cmd[1] == 0x01) // 動作1
        {
            BT = 1;
            flag5 = 1;
        }
        else if (cmd[0] == 0x1C && cmd[1] == 0x02) // 動作2
        {
            BT = 1;
            JJ[0] = cmd[2];
            JJ[1] = cmd[3];
            JJ[2] = cmd[4];
            flag4=6;
        }
        else if (cmd[0] == 0x1D && cmd[1] == 0x01) // 接收密碼
        {
            my_str[0] = cmd[2];
            my_str[1] = cmd[3];
            my_str[2] = cmd[4];
            flag3 = 1;
        }
        else if (cmd[0] == 0x1D && cmd[1] == 0x02) // 接收訊號之後記憶
        {
            //flag1 = 7;
        }
        else if (cmd[0] == 0x3A && cmd[1] == 0x01) // 接收電腦時間RTC可記錄
        {
            dd[0] = cmd[2];
            dd[1] = cmd[3];
            dd[2] = cmd[4];
            dd[3] = cmd[5];
            dd[4] = cmd[6];
            dd[5] = cmd[7];
            dd[6] = cmd[8];
            dd[7] = cmd[9];

            tt[0] = cmd[10];
            tt[1] = cmd[11];
            tt[2] = cmd[12];
            tt[3] = cmd[13];
            tt[4] = cmd[14];
            tt[5] = cmd[15];
            BT = 1;
            flag7 = 1;
        }
        else if (cmd[0] == 0x4A && cmd[1] == 0x03) // 
        {
            my_str[0] = cmd[2];
            show74595(my_str[0]);
            BT = 1;
        }
    }
}

void setup()
{
    Serial.begin(57600);
    MsTimer2::set(20, onTimer);
    MsTimer2::start();
    
    pinMode(RLED1, OUTPUT);
    pinMode(GLED1, OUTPUT);
    pinMode(latchPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(A0, INPUT_PULLUP);
    pinMode(A1, INPUT_PULLUP);
    pinMode(A2, INPUT_PULLUP);
    pinMode(A3, INPUT_PULLUP);
    show74595(0);
    rtc.begin();
    //rtc.adjust(DateTime(2021, 01, 12, 04, 16, 11));
    digitalWrite(RLED1, HIGH);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(25, 0);
    testdrawbitmap1();
    delay(1000);
    testdrawbitmap2();
    delay(1000);
    testdrawbitmap3();
    delay(1000);
    testdrawbitmap4();
    delay(1000);

    display.display();
}

void loop()
{
    if (BT == 0)
    {           
        int gg1 = 0, gg2 = 0, gg3 = 0, gg4 = 0;
        int mm1 = 2000, mm2 = 1, mm3 = 1, mm4 = 0;
        if (digitalRead(A1) == LOW)
        {
            selected = selected + 1;
            delay(200);
        };
        if (digitalRead(A0) == LOW)
        {
            selected = selected - 1;
            delay(200);
        };
        if (digitalRead(A2) == LOW)
        {
            entered = 1;
            delay(200);
        };
        if (digitalRead(A3) == LOW)
        {
            selected = 0;
            entered = 0;
        }
        
        if (selected == 0 && entered == 0) // SET TIME
        {
            display.clearDisplay();
            display.fillRect(0, 0, 128, 15, SSD1306_WHITE);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_BLACK);
            display.setCursor(10, 0);
            display.println("SET  TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SET  DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 48);
            display.println("SHOW DATA");
            display.display();

            display.display();
            delay(200);
        }
        else if (selected == 1 && entered == 0) //  SET DATA
        {
            display.clearDisplay();
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_WHITE);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SET  TIME");

            display.setTextColor(SSD1306_BLACK);
            display.setCursor(10, 16);
            display.println("SET  DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 48);
            display.println("SHOW DATA");
            display.display();

            display.display();
            delay(200);
        }

        else if (selected == 2 && entered == 0) //  SHOW TIME
        {
            display.clearDisplay();
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_WHITE);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SET  TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SET  DATA");

            display.setTextColor(SSD1306_BLACK);
            display.setCursor(10, 32);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 48);
            display.println("SHOW DATA");
            display.display();

            display.display();
            delay(200);
        }
        else if (selected == 3 && entered == 0) //  SHOW DATA
        {
            display.clearDisplay();
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_WHITE);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SET  TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SET  DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_BLACK);
            display.setCursor(10, 48);
            display.println("SHOW DATA");
            display.display();

            display.display();
            delay(200);
        }

        while (selected == 0 && entered == 1) // 設定時間
        {
            if (digitalRead(A3) == LOW)
            {
                rtc.adjust(DateTime(mm1, mm2, mm3, gg1, gg2, gg3));
                break;
            }
            if (digitalRead(A2) == LOW)
            {

                gg4 += 1;
                delay(200);
            }
            if (gg4 == 0)
            {
                if (digitalRead(A0) == LOW)
                {
                    gg1 = gg1 + 1;
                    delay(200);
                    if (gg1 > 11)
                    {
                        gg1 = 0;
                    }
                }
                if (digitalRead(A1) == LOW)
                {
                    gg1 = gg1 - 1;
                    delay(200);
                    if (gg1 < 1)
                    {
                        gg1 = 12;
                    }
                }
            }
            if (gg4 == 1)
            {
                if (digitalRead(A0) == LOW)
                {
                    gg2 = gg2 + 1;
                    delay(200);
                    if (gg2 > 59)
                    {
                        gg2 = 0;
                    }
                }
                if (digitalRead(A1) == LOW)
                {
                    gg2 = gg2 - 1;
                    delay(200);
                    if (gg2 < 0)
                    {
                        gg2 = 59;
                    }
                }
            }
            if (gg4 == 2)
            {
                if (digitalRead(A0) == LOW)
                {
                    gg3 = gg3 + 1;
                    delay(200);
                    if (gg3 > 59)
                    {
                        gg3 = 0;
                    }
                }
                if (digitalRead(A1) == LOW)
                {
                    gg3 = gg3 - 1;
                    delay(200);
                    if (gg3 < 0)
                    {
                        gg3 = 59;
                    }
                }
            }
            display.clearDisplay();
            display.setTextColor(2);
            display.setCursor(0, 10);
            display.print(gg1);
            display.print(':');
            display.print(gg2);
            display.print(':');
            display.print(gg3);
            display.display();
        }
        while (selected == 1 && entered == 1) // 設定日期
        {
            if (digitalRead(A3) == LOW)
            {
                rtc.adjust(DateTime(mm1, mm2, mm3, gg1, gg2, gg3));
                break;
            }
            if (digitalRead(A2) == LOW)
            {
                mm4 += 1;
                delay(200);
            }
            if (mm4 == 0)
            {
                if (digitalRead(A0) == LOW)
                {
                    mm1 = mm1 + 1;
                    delay(200);
                    if (mm1 > 2100)
                    {
                        mm1 = 2000;
                    }
                }
                if (digitalRead(A1) == LOW)
                {
                    mm1 = mm1 - 1;
                    delay(200);
                    if (mm1 < 2000)
                    {
                        mm1 = 2100;
                    }
                }
            }
            if (mm4 == 1)
            {
                if (digitalRead(A0) == LOW)
                {
                    mm2 = mm2 + 1;
                    delay(200);
                    if (mm2 > 12)
                    {
                        mm2 = 1;
                    }
                }
                if (digitalRead(A1) == LOW)
                {
                    mm2 = mm2 - 1;
                    delay(200);
                    if (mm2 < 1)
                    {
                        mm2 = 12;
                    }
                }
            }
            if (mm4 == 2)
            {
              if (digitalRead(A0) == LOW)
                {
                    mm3 = mm3 + 1;
                    delay(200);
                    if (mm3 > 30)
                    {
                        mm3 = 1;
                    }
                }
              if (digitalRead(A1) == LOW)
                {
                    mm3 = mm3 - 1;
                    delay(200);
                    if (mm3 < 1)
                    {
                        mm3 = 30;
                    }
                }
            }
            display.clearDisplay();
            display.setTextColor(2);
            display.setCursor(0, 10);
            display.print(mm1);
            display.print(':');
            display.print(mm2);
            display.print(':');
            display.print(mm3);
            display.display();
        }

        if (selected == 2 && entered == 1) // 秀時間
        {
            
            DateTime now = rtc.now();
            display.clearDisplay();
            display.setTextColor(2);
            display.setCursor(0, 10);
            display.print(now.hour(), DEC);
            display.print(':');
            display.print(now.minute(), DEC);
            display.print(':');
            display.print(now.second(), DEC);
            display.display();
            delay(100);
        }
        if (selected == 3 && entered == 1) // 秀日期
        {
            
            DateTime now = rtc.now();
            display.clearDisplay();
            display.setTextColor(2);
            display.setCursor(0, 10);
            display.print(now.year(), DEC);
            display.print('/');
            display.print(now.month(), DEC);
            display.print('/');
            display.print(now.day(), DEC);
            display.display();
            delay(100);
        }
    }
    /*if (BT == 2)
    {
        digitalWrite(9, 1);
    }
    if (BT == 1)
    {
        int S1 = digitalRead(A0);
        int S2 = digitalRead(A1);
        int S3 = digitalRead(A2);
        int S4 = digitalRead(A3);
        int selected = 100;
        int entered = 100;

        if (flicker < 25) // LED閃爍0.5秒
        {
            digitalWrite(RLED1, HIGH);
        }
        else if (flicker > 25 && flicker < 40)
        {
            digitalWrite(RLED1, LOW);
        }
        else if (flicker > 40)
        {
            flicker = 0;
        }
        if (flag7 == 1) // 通過電腦時間紀錄RTC
        {
            change();
            rtc.adjust(DateTime(y, m, d, h, mi, s));
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SHOW DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("TEMP");
            display.display();

            flag7 = 0;
        }

        // if (flag5 == 1) // 顯示錯誤
        // {

        //     display.setCursor(0, 10);
        //     display.clearDisplay();
        //     display.print("ERROR!");
        //     display.display();
        // }

        if (S1 == LOW)
        {
            flag9++;
            delay(50);
        }
        if (flag9 == 1)
        {
            selected = 100;
            entered = 100;
            display.clearDisplay();
            display.setTextColor(2);
            DateTime now = rtc.now();

            display.setCursor(0, 10);
            display.print(now.hour(), DEC);
            display.print(':');
            display.print(now.minute(), DEC);
            display.print(':');
            display.print(now.second(), DEC);
            display.display();
            delay(100);
        }
        else if (flag9 == 2)
        {
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SHOW DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("TEMP");
            display.display();
            flag9++;
        }
        if (S2 == LOW)
        {
            flag8++;
            delay(50);
        }
        if (flag8 == 1)
        {
            selected = 100;
            entered = 100;
            display.clearDisplay();
            display.setTextColor(2);
            DateTime now = rtc.now();

            display.setCursor(0, 10);
            display.print(now.year(), DEC);
            display.print('/');
            display.print(now.month(), DEC);
            display.print('/');
            display.print(now.day(), DEC);
            display.display();
            delay(100);
        }
        else if (flag8 == 2)
        {
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SHOW DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("TEMP");
            display.display();
            flag8++;
        }
        if (S3 == LOW) // 傳送溫度
        {
            flag6++;
            delay(50);
        }
        if (flag6 == 1)
        {
            byte FF[4];
            FF[0] = 0xA2;
            long ab = long((rtc.getTemperature() * 10));
            FF[1] = ab / 100;
            FF[2] = (ab % 100) / 10;
            FF[3] = ab % 10;
            Serial.write(FF, 6);
            display.setCursor(0, 10);
            display.clearDisplay();
            display.print(rtc.getTemperature(), 1);
            display.display();
            delay(10);
        }
        else if (flag6 == 2)
        {
            display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
            display.fillRect(0, 16, 128, 31, SSD1306_BLACK);
            display.fillRect(0, 32, 128, 47, SSD1306_BLACK);
            display.fillRect(0, 48, 128, 64, SSD1306_BLACK);
            display.setTextSize(2);

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 0);
            display.println("SHOW TIME");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 16);
            display.println("SHOW DATA");

            display.setTextColor(SSD1306_WHITE);
            display.setCursor(10, 32);
            display.println("TEMP");
            display.display();
            show74595(0);
            byte FF[4];
            FF[0] = 0xA3;
            Serial.write(FF, 3);
            
            flag6++;
        }
        if (S4 == LOW)
        {
            byte OO[4];
            OO[0] = 0xA5;
            Serial.write(OO, 3);
            display.clearDisplay();
            display.display();
            delay(50);
        }

        if (S4 == LOW)
        {
            byte OO[4];
            OO[0] = 0xA5;
            Serial.write(OO, 3);
            display.clearDisplay();
            display.display();
            delay(50);
        }

        if (flag4 == 6)
        {
            password[1] = char(EEPROM.read(0));
            password[2] = char(EEPROM.read(1));
            password[3] = char(EEPROM.read(2));

            if (password[1] == (JJ[0]+48) && password[2] == (JJ[1]+48) && password[3] == (JJ[2]+48) )
            {
                byte OP[2];
                OP[0] = 0xA6;
                Serial.write(OP, 3);
                show74595(8);
                display.clearDisplay();
                display.setCursor(5, 30);
                display.print(JJ[0]);
                display.setCursor(20, 30);
                display.print(JJ[1]);
                display.setCursor(36, 30);
                display.print(JJ[2]);
                for (int i = 15; i <= 18; i++)
                {
                    display.drawLine(i, 64, i, 64 - JJ[0] * 7, WHITE);
                }
                for (int j = 30; j <= 33; j++)
                {

                    display.drawLine(j, 64, j, 64 - JJ[1] * 7, WHITE);
                }
                for (int k = 45; k <= 48; k++)
                {

                    display.drawLine(k, 64, k, 64 - JJ[2] * 7, WHITE);
                }
                display.display();
                }
            
            else //if (password[1] != (JJ[0]+48) || password[2] != (JJ[1]+48) || password[3] != (JJ[2]+48) )
            {
                display.setTextSize(2);
                display.clearDisplay();
                display.setCursor(5, 30);
                display.print("ERROR");
                display.display();
                byte OL[2];
                OL[0] = 0xA7;
                Serial.write(OL, 3);
                show74595(0);
            }
            flag4=8;                                      //只判斷一次
        }
        
        if (flag3 == 1) // 記憶密碼
        {
            EEPROM.write(0, my_str[0]);
            EEPROM.write(1, my_str[1]);
            EEPROM.write(2, my_str[2]);
        }

        // if (flag1 == 7) // 輸出密碼
        // {
        //     password[0] = 0xB5;
        //     password[1] = char(EEPROM.read(0));
        //     password[2] = char(EEPROM.read(1));
        //     password[3] = char(EEPROM.read(2));
        //     Serial.write(password, 5);
        //     password[0] = 0xB5;
        //     password[1] = char(EEPROM.read(0));
        //     password[2] = char(EEPROM.read(1));
        //     password[3] = char(EEPROM.read(2));
        //     Serial.write(password, 5);
        //     flag1 = 0;
        // }
    }*/
}

void show74595(int a)
{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, a);
    digitalWrite(latchPin, HIGH);
}
void Bshow74595(int a) // 左到右
{
    int A = 0;
    for (int i = 0; i < 8; i++)
    {
        A |= ((a >> i) & 0x01) << (7 - i);
    }
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, A);
    digitalWrite(latchPin, HIGH);
}
void showOLED(int a, int b, byte c)
{
    display.setCursor(a, b);
    display.println(c);
}

// void rtctime() // 顯示星期日期時間溫度
// {
//     display.clearDisplay();
//     display.setTextColor(2);
//     DateTime now = rtc.now();
//     display.setCursor(0, 0);
//     display.println(daysOfWeek[now.dayOfTheWeek()]); // 顯示星期幾
//     display.setCursor(0, 10);
//     display.print(now.year(), DEC);
//     display.print('/');
//     display.print(now.month(), DEC);
//     display.print('/');
//     display.print(now.day(), DEC);
//     display.setCursor(0, 20);
//     display.print(now.hour(), DEC); // 以 10进制显示 时
//     display.print(':');
//     display.print(now.minute(), DEC); // 以 10进制显示 分
//     display.print(':');
//     display.print(now.second(), DEC); // 以 10进制显示 秒
//     display.setCursor(0, 30);
//     display.print(rtc.getTemperature(), 1); // 溫度顯示小數點後1位
//     display.display();
//     delay(100);
// }

void change() // 轉換數值
{
    temp1 = (int)dd[0];
    temp2 = (int)dd[1];
    temp3 = (int)dd[2];
    temp4 = (int)dd[3];
    y = temp1 * 1000 + temp2 * 100 + temp3 * 10 + temp4;
    // now month
    temp1 = (int)dd[4];
    temp2 = (int)dd[5];
    m = temp1 * 10 + temp2;
    // now date
    temp1 = (int)dd[6];
    temp2 = (int)dd[7];
    d = temp1 * 10 + temp2;
    // now Day of Week
    // dOW = (int)inString[6] - 48;
    // now hour
    temp1 = (int)tt[0];
    temp2 = (int)tt[1];
    h = temp1 * 10 + temp2;
    // now minute
    temp1 = (int)tt[2];
    temp2 = (int)tt[3];
    mi = temp1 * 10 + temp2;
    // now second
    temp1 = (int)tt[4];
    temp2 = (int)tt[5];
    s = temp1 * 10 + temp2;
}