#include <Adafruit_NeoPixel.h>
#include <U8g2lib.h>
#include "time.h"
#include "SPI.h"
#include <WiFi.h>
#include <Wire.h>
#define PIN 21
#define NUMPIXELS 12
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//WIFI
// const char *ssid = "Roger";
// const char *password = "09870987";
#define DELAYVAL 500
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Initialize the OLED display using U8G2 library
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);
// NTP時間
const char* ntpServer = "time.google.com";
const long gmtOffset_sec = 28800; // 台灣時間
const int daylightOffset_sec = 0;
struct tm timeinfo;
void setup() {
// 初始化OLED顯示屏
u8g2.begin();
u8g2.enableUTF8Print(); // Enable UTF8 support
u8g2.setFont(u8g2_font_unifont_t_chinese1); // Set font to support Chinese characters
// 初始化串口
Serial.begin(115200);
Serial.print("正在連接WiFi");
// 連接WiFi
WiFi.begin("Wokwi-GUEST", "", 6); //ssid, password
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" 已連接");
// 配置NTP時間
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println(F("已獲取NTP時間"));
// 初始化NeoPixel條
pixels.begin();
}
void loop() {
pixels.clear();
// 獲取本地時間
if (!getLocalTime(&timeinfo)) {
Serial.println("獲取時間失敗");
return;
}
int hour = timeinfo.tm_hour; //返回當前小時的值,範圍是 0 到 23
int min1 = timeinfo.tm_min; //返回當前分鐘的值,範圍是 0 到 59
int sec = timeinfo.tm_sec; //返回當前秒數的值,範圍是 0 到 59
int day = timeinfo.tm_mday; //返回當前日期的值,範圍是 1 到 31
int mon = timeinfo.tm_mon + 1; //返回的值範圍是 0 到 11(0 表示 1 月,11 表示 12 月),所以需要加 1 才能得到常規的月份值,範圍是 1 到 12
int year = timeinfo.tm_year + 1900; //返回的是從 1900 年開始的年份數,例如,如果 timeinfo.tm_year 是 123,表示的年份是 2023 年。所以需要加 1900 才能得到實際年份
int wday = timeinfo.tm_wday; //返回當前星期幾的值,範圍是 0 到 6(0 表示星期天,6 表示星期六)
int rocYear = year - 1911; //中華民國紀年是從 1912 年開始的,因此用公曆年份減去 1911 可以得到中華民國年份。例如,2023 年減去 1911 得到 112 年,即中華民國 112 年
// 確定星期幾
const char* weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //"日", "一", "二", "三", "四", "五", "六"
// 更新OLED顯示 u8g2庫https://drive.google.com/file/d/1nrf34A4qL7WiS8nm78jMgG5wWOl88rkM/view
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese1);
u8g2.setCursor(50, 63);
u8g2.print("中華民國");
u8g2.print(rocYear);
u8g2.print("年");
u8g2.setCursor(0, 15);
u8g2.print(weekdays[wday]);
u8g2.setCursor(32, 40);
u8g2.print(hour < 10 ? "0" : ""); u8g2.print(hour);
u8g2.print(":");
u8g2.print(min1 < 10 ? "0" : ""); u8g2.print(min1);
u8g2.print(".");
u8g2.print(sec < 10 ? "0" : ""); u8g2.print(sec);
u8g2.setCursor(0, 63);
u8g2.print(year); //u8g2.print("/");
u8g2.setCursor(80, 15);
u8g2.print(mon < 10 ? "0" : ""); u8g2.print(mon); u8g2.print("/");
u8g2.print(day < 10 ? "0" : ""); u8g2.print(day);
u8g2.sendBuffer();
// 每個LED表示5分鐘
int min_d = map(min1, 0, 59, 0, NUMPIXELS);
// 每個LED表示5秒鐘
int sec_d = map(sec, 0, 59, 0, NUMPIXELS);
delay(100);
pixels.setPixelColor(min_d, pixels.Color(0, 0, 0)); //關燈
//設置分鐘的LED顏色從藍色漸變到綠色
// pixels.setPixelColor(min_d, pixels.Color(r, g, b));
//定義顏色
int min_r = 0;
int min_g = 70;
int min_b = 0;
//分鐘顏色
pixels.setPixelColor(min_d, pixels.Color(min_r, min_g, min_b));
//定義顏色
int sec_r = 0;
int sec_g = 0;
int sec_b = 70;
//秒鐘顏色
pixels.setPixelColor(sec_d, pixels.Color(sec_r, sec_g, sec_b));
//設置秒鐘的LED顏色從紅色漸變到黃色
// for (int i = 0; i < NUMPIXELS; i++) {
// if (i < sec_d) { // 只處理位於sec_d之前的LED燈
// pixels.setPixelColor(sec_d, pixels.Color(r, g, b)); // // 設置第sec_d個LED燈的顏色為(r, g, b)
// uint32_t currentColor = pixels.getPixelColor(i); // 獲取當前第i個LED燈的顏色
// uint8_t currentRed = (currentColor >> 16) & 0xFF; // 從currentColor中提取紅色成分
// uint8_t currentGreen = (currentColor >> 8) & 0xFF; // 從currentColor中提取綠色成分
// uint8_t currentBlue = currentColor & 0xFF; // 從currentColor中提取藍色成分
// int r = 255; // 將紅色設置為255
// int g = map(i, 0, NUMPIXELS - 1, 0, 255); // 將綠色設置為根據i的位置從0到255之間的映射值
// int b = 0; // 將藍色設置為0
// // 混合顏色
// r = (r + currentRed) / 2; // 將新紅色設置為當前紅色與之前紅色的平均值
// g = (g + currentGreen) / 2; // 將新綠色設置為當前綠色與之前綠色的平均值
// b = (b + currentBlue) / 2; // 將新藍色設置為當前藍色與之前藍色的平均值
// pixels.setPixelColor(i, pixels.Color(r, g, b)); // 設置第i個LED燈的顏色為新的(r, g, b)
// }
// }
pixels.show();
delay(999);
}