/*
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TM1637Display.h>
// ===== WiFi Config =====
const char* ssid = "Wokwi-GUEST"; // ใส่ชื่อ WiFi ของคุณ
const char* password = ""; // ใส่รหัสผ่าน WiFi
// ===== TM1637 Pins =====
#if defined(ESP32)
#define CLK 18
#define DIO 19
#else
#define CLK D5
#define DIO D6
#endif
TM1637Display display(CLK, DIO);
// ===== NTP Config =====
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 7 * 3600); // +7 ชั่วโมง (ไทย)
bool showColon = true; // สำหรับกระพริบโคลอน
void setup() {
Serial.begin(115200);
display.setBrightness(7);
display.showNumberDecEx(0, 0b01000000, true);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
timeClient.begin();
}
void loop() {
timeClient.update();
int hours = timeClient.getHours();
int minutes = timeClient.getMinutes();
int displayTime = hours * 100 + minutes;
// สลับสถานะโคลอนทุก 1 วินาที (กระพริบเหมือนนาฬิกาจริง)
showColon = !showColon;
uint8_t colonMask = showColon ? 0b01000000 : 0;
display.showNumberDecEx(displayTime, colonMask, true);
Serial.printf("Time: %02d:%02d\n", hours, minutes);
delay(1000);
}
*/
// mode 0: เวลา HH:MM → โคลอนกระพริบ
// mode 1: วันที่ DD:MM → ใช้โคลอนคั่น
// mode 2: วันสัปดาห์
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TM1637Display.h>
// ===== WiFi Config =====
const char* ssid = "Wokwi-GUEST"; // ใส่ชื่อ WiFi ของคุณ
const char* password = ""; // ใส่รหัสผ่าน WiFi
// ===== TM1637 Pins =====
#if defined(ESP32)
#define CLK 18
#define DIO 19
#else
#define CLK D5
#define DIO D6
#endif
TM1637Display display(CLK, DIO);
// ===== NTP =====
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 7 * 3600); // UTC+7
// ===== ตัวแปร =====
bool showColon = true;
unsigned long lastToggle = 0;
unsigned long lastModeSwitch = 0;
uint8_t mode = 0; // 0=เวลา,1=วันที่,2=วันสัปดาห์
// วันสัปดาห์แมปเป็นตัวอักษรที่ TM1637 แสดงได้จริง
const char* week2[] = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" };
// แปลงตัวอักษรที่ TM1637 รองรับ
uint8_t mapCharTM1637(char c) {
switch (c) {
case '0' ... '9': return display.encodeDigit(c - '0');
case 'H': return 0b01110110;
case 'L': return 0b00111000;
case 'P': return 0b01110011;
case 'U': return 0b00111110;
case 'Y': return 0b01101110;
case 'b': return 0b01111100;
case 'd': return 0b01011110;
case 'C': return 0b00111001;
case 'E': return 0b01111001;
default: return 0; // แสดงว่าง
}
}
void setup() {
Serial.begin(115200);
display.setBrightness(7);
display.showNumberDecEx(0, 0b01000000, true);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
timeClient.begin();
}
void loop() {
timeClient.update();
unsigned long now = millis();
// กระพริบโคลอนทุก 1 วินาที
if (now - lastToggle >= 1000) {
lastToggle = now;
showColon = !showColon;
}
// สลับโหมดทุก 5 วินาที
if (now - lastModeSwitch >= 5000) {
lastModeSwitch = now;
mode = (mode + 1) % 3;
}
// ดึงเวลาปัจจุบัน
time_t rawTime = timeClient.getEpochTime();
struct tm* timeInfo = localtime(&rawTime);
int hours = timeInfo->tm_hour;
int minutes = timeInfo->tm_min;
int day = timeInfo->tm_mday;
int month = timeInfo->tm_mon + 1;
int wday = timeInfo->tm_wday;
if (mode == 0) {
// เวลา HH:MM
int displayTime = hours * 100 + minutes;
display.showNumberDecEx(displayTime, showColon ? 0b01000000 : 0, true);
Serial.printf("Time: %02d:%02d\n", hours, minutes);
} else if (mode == 1) {
// วันที่ DD:MM
int displayDate = day * 100 + month;
display.showNumberDecEx(displayDate, 0b01000000, true); // โคลอนระหว่าง DD และ MM
Serial.printf("Date: %02d:%02d\n", day, month);
} else if (mode == 2) {
// แสดงวันสัปดาห์เป็นตัวเลข 0=SUN ... 6=SAT
int displayWeek = wday;
display.showNumberDecEx(displayWeek, 0, true);
Serial.printf("Weekday: %d\n", wday);
}
delay(1000);
// delay(50); // รีเฟรชเร็วเพื่อโคลอนกระพริบชัด
}