#include <WiFi.h>
// 網路設定
const char* ssid = "OPPO Reno8 5G"; // Nokia 5.4
const char* password = "y5q6xvzn"; // 12345678
// 取得網路時間相關參數設定
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_R1 13
#define pin_G1 12
#define pin_B1 14
#define pin_R2 27
#define pin_G2 26
#define pin_B2 25
#define pin_R3 33
#define pin_G3 32
#define pin_B3 23
#define pin_R4 22
#define pin_G4 1
#define pin_B4 3
#define pin_A 15
#define pin_B 2
#define pin_C 4
#define pin_D 5
#define pin_E 18
#define pin_F 19
#define pin_G 21
int pinDigital[4][3]={
{pin_R1, pin_G1, pin_B1},
{pin_R2, pin_G2, pin_B2},
{pin_R3, pin_G3, pin_B3},
{pin_R4, pin_G4, pin_B4},};
int pinSegment[7]={pin_A, pin_B, pin_C, pin_D, pin_E, pin_F, pin_G};
// Pulse Cycle 20ms,使用50Hz(每秒重複50次),週期為20ms的PWM訊號來控制馬達
// pulse width 0.5ms~2.4ms => 0 ~ 180
double pulseWidth_min = 500; // 0.5毫秒 = 500微秒
double pulseWidth_max = 2400;
double anglePulse = (pulseWidth_max-pulseWidth_min)/180; // 計算1度的脈寬值
void servoPulse(int ServoPin, int angle){
int pulseWidth = (angle*anglePulse) + pulseWidth_min; // 將角度轉為脈寬值
for(int i=0; i<10; i++){ // 50Hz(給伺服馬達足夠時間轉至指定角度即可)
digitalWrite(ServoPin, HIGH); // 將servoPin拉至高電位持續pulseWidth微秒
delayMicroseconds(pulseWidth);
digitalWrite(ServoPin, LOW); // 將servoPin拉至高電位持續pulseWidth微秒
delayMicroseconds(20000- pulseWidth);
}
}
// 共陰極、共陽極設定
#define hardwareConfig 0 //COMMON_ANODE=1 COMMON_CATHODE=0
#if hardwareConfig==0
// 共陰極
void Colorset(unsigned char redVal, unsigned char greenVal, unsigned char blueVal, int digital){
analogWrite(pinDigital[digital][0], redVal);
analogWrite(pinDigital[digital][1], greenVal);
analogWrite(pinDigital[digital][2], blueVal);
}
#define digitOn 255
#define digitOff 0
#define light 0
#define dark 1
#else
// 共陽極(請思考共陽極與共陰極最暗~最亮數值轉換方式)
void Colorset(unsigned char redVal, unsigned char greenVal, unsigned char blueVal, int digital){
//redVal=255-redVal;
//greenVal=255-greenVal;
//blueVal=255-blueVal;
analogWrite(pinDigital[digital][0], 255-redVal);
analogWrite(pinDigital[digital][1], 255-redVal);
analogWrite(pinDigital[digital][2], 255-redVal);
}
#define digitOn 0
#define digitOff 255
#define light 1
#define dark 0
#endif
int num[10][7]={
{light,light,light,light,light,light,dark },//0
{dark ,light,light,dark ,dark ,dark ,dark },//1
{light,light,dark ,light,light,dark ,light},//2
{light,light,light,light,dark ,dark ,light},//3
{dark ,light,light,dark ,dark ,light,light},//4
{light,dark ,light,light,dark ,light,light},//5
{light,dark ,light,light,light,light,light},//6
{light,light,light,dark ,dark ,dark ,dark },//7
{light,light,light,light,light,light,light},//8
{light,light,light,light,dark,light ,light},//9
};
int RGB[4][3] = {
{255, 0, 0},
{0, 255, 0},
{0, 0, 255},
{255, 255, 255},
};
int k = 5;
void displayNum(int digtal, int number) {
for (int i = 0; i < 7; i++) {
digitalWrite(pinSegment[i], dark);
};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
analogWrite(pinDigital[i][j], digitOff);
};
};
Colorset(RGB[digtal][0], RGB[digtal][1], RGB[digtal][2], digtal);
for (int i = 0; i < 7; i++) {
digitalWrite(pinSegment[i], num[number][i]);
};
}
double ScanTime = 1.0 / (16 * 4) * 1000;
void display(int num0,int num1,int num2,int num3,int ms ){
for(int i=0; i<ms/(ScanTime*4); i++){
displayNum(0,num0);delay(ScanTime);
displayNum(1,num1);delay(ScanTime);
displayNum(2,num2);delay(ScanTime);
displayNum(3,num3);delay(ScanTime);
};
}
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin("Wokwi-GUEST"); // 以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()); // 回傳分配到的IP位址
Serial.print("WiFi RSSI: ");
Serial.println(WiFi.RSSI()); // 回傳接收訊號強度(以 dBm 為單位).
for(int i=0; i<7; i++){
pinMode(pinSegment[i], OUTPUT);
digitalWrite(pinSegment[i], dark);
};
for(int i=0; i<4; i++){
for(int j=0; i<3; i++){
pinMode(pinDigital[i][j], OUTPUT);
digitalWrite(pinDigital[i][j], digitOff);
};
};
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.print("Hour: "); //顯示英文 時 24小時制
Serial.println(timeinfo.tm_hour);
Serial.print("Minute: "); //顯示英文 分
Serial.println(timeinfo.tm_min);
Serial.print("Second: "); //顯示英文 秒
Serial.println(timeinfo.tm_sec);
int num0 = timeinfo.tm_hour/10;
int num1 = timeinfo.tm_hour%10;
int num2 = timeinfo.tm_min/10;
int num3 = timeinfo.tm_min%10;
display(num0,num1,num2,num3,1000);
int RGB[4][3] = {
{255-k, 0+k, 0+k},
{0+k, 255-k, 0+k},
{0+k, 0+k, 255-k},
{255-k, 255+k, 255-k},
};
}
void loop() {
printLocalTime();
//displayNum(0,4);
//delay(1000);
//display(1,2,3,4,ScanTime);
}