/*
七段顯示器可顯示:時,分,秒 || 年的後兩位,月,日
(按鈕可切換,燈亮時為年月日)
*/
#include <WiFi.h>
#include <stdio.h>
// Wifi Setting
const char* ssid = "Yun_22Ultra";
const char* password = "94879487";
// 取得網路時間相關參數設定
const char* ntpServer = "time.google.com"; // Google - NTP Server
const long gmtOffset_sec = 28800; //台灣時區+8hr,28800=8*60*60
const int daylightOffset_sec = 0; //無日光節約時間
// Define pin
#define pin_DIG1 5
#define pin_DIG2 21
#define pin_DIG3 22
#define pin_DIG4 25
#define pin_DIG5 32
#define pin_DIG6 33
#define pin_A 18
#define pin_B 23
#define pin_C 27
#define pin_D 12
#define pin_E 13
#define pin_F 19
#define pin_G 26
#define pin_DP 14
#define hardwareConfig 0 //COMMON_ANODE=1 COMMON_CATHODE=0
// Common Setting
#if hardwareConfig==0
#define DigOn 0
#define DigOff 1
#define light 1
#define dark 0
#else
#define DigOn 1
#define DigOff 0
#define light 0
#define dark 1
#endif
//
bool Button = 1;
int DigitalPin[6] = {pin_DIG1, pin_DIG2, pin_DIG3, pin_DIG4, pin_DIG5, pin_DIG6};
int Segment[8] = {pin_A, pin_B, pin_C, pin_D, pin_E, pin_F, pin_G, pin_DP};
int Num[10][8] =
{
{light, light, light, light, light, light, dark, dark}, //0
{dark, light, light, dark, dark, dark, dark, dark}, //1
{light, light, dark, light, light, dark, light, dark}, //2
{light, light, light, light, dark, dark, light, dark}, //3
{dark, light, light, dark, dark, light, light, dark}, //4
{light, dark, light, light, dark, light, light, dark}, //5
{light, dark, light, light, light, light, light, dark}, //6
{light, light, light, dark, dark, light, dark, dark}, //7
{light, light, light, light, light, light, light, dark},//8
{light, light, light, light, dark, light, light, dark}, //9
};
void DisplayNum(int Dig, int Number)
{
for(int i=0; i<6; i++)
{
digitalWrite(DigitalPin[i], DigOff);
}
for(int i=0; i<8; i++)
{
digitalWrite(Segment[i], Num[Number][i]);
}
digitalWrite(DigitalPin[Dig], DigOn);
}
const int ScanTime = 10;//1.0/(16*6)*1000
void Display(int *Num, int Time) // Time(ms)
{
for(int temp=Time; temp>ScanTime*4; temp=temp-ScanTime*4)
{
for(int i=0; i<6; i++)
{
DisplayNum(i,Num[i]);
delay(ScanTime);
}
}
delay(Time % ScanTime);
}
void PrintNum()
{
int Num[6];
struct tm timeinfo;
if(!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
if(Button)
{
Num[0] = timeinfo.tm_hour / 10;
Num[1] = timeinfo.tm_hour % 10;
Num[2] = timeinfo.tm_min / 10;
Num[3] = timeinfo.tm_min % 10;
Num[4] = timeinfo.tm_sec / 10;
Num[5] = timeinfo.tm_sec % 10;
}
else
{
Num[0] = (timeinfo.tm_year % 100) / 10;
Num[1] = timeinfo.tm_year % 10;
Num[2] = (timeinfo.tm_mon + 1) / 10;
Num[3] = (timeinfo.tm_mon + 1) % 10;
Num[4] = timeinfo.tm_mday / 10;
Num[5] = timeinfo.tm_mday % 10;
}
Display(Num, 100);
Detect();
}
void Detect()
{
if(digitalRead(2))
{
digitalWrite(pin_DIG6, DigOff);
digitalWrite(15, Button);
Button = !Button;
while(digitalRead(2))
{}
}
}
void setup()
{
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
//WiFi.begin(ssid, password); //以STA(網路終端)模式連接到WiFi基地台
WiFi.begin("Wokwi-GUEST", "", 6); //wokwi提供的虛擬 WiFi 接入點
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("WiFi RSSI: ");
Serial.println(WiFi.RSSI());
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Pin_Init
for(int i=0; i<6; i++)
{
pinMode(DigitalPin[i], OUTPUT);
digitalWrite(DigitalPin[i], DigOff);
}
for(int i=0; i<8; i++)
{
pinMode(Segment[i], OUTPUT);
digitalWrite(Segment[i], dark);
}
pinMode(2, INPUT);
pinMode(4, OUTPUT);
pinMode(15, OUTPUT);
digitalWrite(4, HIGH);
}
void loop()
{
PrintNum();
}