#include <WiFi.h>
#include <time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Wi-Fi credentials — Wokwi default / Wokwi default credentials
// Gercek donanim icin kendi SSID ve sifrenizle degistirin!
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = ""; // Wokwi-GUEST sifresizdir
// Pin tanimlari / Pin definitions
#define LED_PIN 2
#define I2C_SDA 21
#define I2C_SCL 22
// NTP sunuculari / NTP servers
const char* NTP_SERVER_1 = "tr.pool.ntp.org";
const char* NTP_SERVER_2 = "pool.ntp.org";
const char* NTP_SERVER_3 = "time.google.com";
// Turkiye sabit UTC+3 (yaz saati yok) / Turkey fixed UTC+3 (no DST)
const long GMT_OFFSET_SEC = 3 * 3600;
const int DAYLIGHT_OFFSET_SEC = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char* dayNames[] = {"Pzr","Pzt","Sal","Car","Per","Cum","Cmt"};
void splash() {
lcd.setCursor(3, 0);
lcd.print("BlueGrays");
lcd.setCursor(4, 1);
lcd.print("NTP v1.0");
delay(3000);
lcd.clear();
}
void showLine(uint8_t row, const char* tr, const char* en) {
lcd.setCursor(0, row);
if (row == 0) lcd.print(tr);
else lcd.print(en);
}
void connectWiFi() {
lcd.clear();
showLine(0, "WiFi baglaniyor", "Connecting WiFi");
showLine(1, "WiFi baglaniyor", "Connecting WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) {
delay(500);
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(LED_PIN, HIGH);
}
}
void syncNTP() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Zaman aliniyor");
lcd.setCursor(0, 1);
lcd.print("Fetching time");
configTime(GMT_OFFSET_SEC, DAYLIGHT_OFFSET_SEC,
NTP_SERVER_1, NTP_SERVER_2, NTP_SERVER_3);
struct tm timeinfo;
unsigned long start = millis();
while (!getLocalTime(&timeinfo) && millis() - start < 10000) {
delay(500);
}
lcd.clear();
}
void setup() {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// V1 default I2C: SDA=21 SCL=22 / V1 I2C default
Wire.begin(I2C_SDA, I2C_SCL);
lcd.init();
lcd.backlight();
splash();
connectWiFi();
syncNTP();
}
void loop() {
// WiFi koparsa yeniden bagla / Reconnect if WiFi dropped
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_PIN, (millis() / 500) % 2);
WiFi.reconnect();
delay(2000);
return;
}
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
lcd.setCursor(0, 0);
lcd.print("Zaman alinamadi ");
lcd.setCursor(0, 1);
lcd.print("NTP fail ");
delay(1000);
return;
}
// Tarih satiri: GG.AA.YYYY Gun / Date row: DD.MM.YYYY Day
lcd.setCursor(0, 0);
if (timeinfo.tm_mday < 10) lcd.print("0");
lcd.print(timeinfo.tm_mday);
lcd.print(".");
if (timeinfo.tm_mon + 1 < 10) lcd.print("0");
lcd.print(timeinfo.tm_mon + 1);
lcd.print(".");
lcd.print(timeinfo.tm_year + 1900);
lcd.print(" ");
lcd.print(dayNames[timeinfo.tm_wday]);
// Saat satiri (ortali): HH:MM:SS / Time row (centered)
lcd.setCursor(4, 1);
if (timeinfo.tm_hour < 10) lcd.print("0");
lcd.print(timeinfo.tm_hour);
lcd.print(":");
if (timeinfo.tm_min < 10) lcd.print("0");
lcd.print(timeinfo.tm_min);
lcd.print(":");
if (timeinfo.tm_sec < 10) lcd.print("0");
lcd.print(timeinfo.tm_sec);
delay(500);
}