#include <WiFi.h> // v3.0.0
#include <WebServer.h> // v3.0.0
#include <FastLED.h> // v3.6.0

const char* ap_ag_adi = "ESP32_Led_Sistemi"; // ESP32'nin yayacağı ağ adı belirlendi
const char* ap_sifre = "12345678"; // Ağın şifresi belirlendi

WebServer sunucu(80); // Sunucu 80 portunda başlatıldı

const int veri_pini = 23; // Donanımsal VSPI MOSI pini atandı
const int saat_pini = 18; // Donanımsal VSPI SCK pini atandı
const int led_sayisi = 1; // Sistem tek piksel olarak tanımlandı

CRGB ledler[led_sayisi]; // FastLED renk dizisi oluşturuldu

bool otomatik_mod = false; // Otomatik döngü durumu kapalı yapıldı
int mevcut_adim = 0; // Adım sayacı sıfırlandı
unsigned long onceki_zaman = 0; // Süre ölçüm referansı ayarlandı

const unsigned long bekleme_5_saat = 18000000UL; // 5 saat limiti belirlendi
const unsigned long bekleme_4_saat = 14400000UL; // 4 saat limiti belirlendi

// HTML Arayüzü
const char* html_arayuz = R"rawliteral(
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>P9813 Sürücü Paneli</title>
<style>
  body { font-family: sans-serif; text-align: center; margin-top: 50px; background-color: #2c3e50; color: white;}
  .btn { padding: 15px 30px; margin: 10px; font-size: 18px; cursor: pointer; border: none; border-radius: 8px; color: white; width: 160px; font-weight: bold;}
  .kirmizi { background-color: #e74c3c; }
  .yesil { background-color: #2ecc71; }
  .mavi { background-color: #3498db; }
  .mor { background-color: #9b59b6; }
  .beyaz { background-color: #ffffff; color: black; }
  .kapat { background-color: #000000; border: 1px solid white;}
  .oto { background-color: #f1c40f; color: black; }
</style>
<script>
  function komutGonder(istek) {
    fetch('/aksiyon?tur=' + istek);
  }
</script>
</head>
<body>
  <h2>ESP32 Bağımsız Kontrol Paneli</h2>
  <button class="btn kirmizi" onclick="komutGonder('kirmizi')">Kırmızı</button><br>
  <button class="btn yesil" onclick="komutGonder('yesil')">Yeşil</button><br>
  <button class="btn mavi" onclick="komutGonder('mavi')">Mavi</button><br>
  <button class="btn mor" onclick="komutGonder('mor')">Mor</button><br>
  <button class="btn beyaz" onclick="komutGonder('beyaz')">Beyaz</button><br>
  <button class="btn kapat" onclick="komutGonder('kapat')">Kapat</button><br><br>
  <button class="btn oto" onclick="komutGonder('otomatik')">Otomatik</button>
</body>
</html>
)rawliteral";

void ledleri_sur(CRGB renk) {
  ledler[0] = renk; // Diziye renk atandı
  FastLED.show(); // Veri çipe iletildi
}

void sayfayi_yukle() {
  sunucu.send(200, "text/html", html_arayuz); // İstek geldiğinde HTML arayüzü sunuldu
}

void istekleri_isle() {
  if (sunucu.hasArg("tur")) { 
    String komut = sunucu.arg("tur"); 
    otomatik_mod = false; // Kullanıcı komut gönderdiğinde döngü durduruldu

    if (komut == "kirmizi") ledleri_sur(CRGB::Red); 
    else if (komut == "yesil") ledleri_sur(CRGB::Green); 
    else if (komut == "mavi") ledleri_sur(CRGB::Blue); 
    else if (komut == "mor") ledleri_sur(CRGB::Purple); 
    else if (komut == "beyaz") ledleri_sur(CRGB::White); // Beyaz ışık komutu eklendi
    else if (komut == "kapat") ledleri_sur(CRGB::Black); 
    else if (komut == "otomatik") {
      otomatik_mod = true; // Döngü yetkisi verildi
      mevcut_adim = 0; // Adımlar sıfırlandı
      onceki_zaman = millis(); // Başlangıç saati referans alındı
      ledleri_sur(CRGB::Red); // İlk adım başlatıldı
    }
  }
  sunucu.send(200, "text/plain", "OK"); // Fetch mimarisi için arka planda onay dönüldü
}

void donguyu_yonet() {
  if (!otomatik_mod) return; // Otomatik mod kapalıysa işlem yapılmadan dönüldü

  unsigned long gecen_zaman = millis() - onceki_zaman; // Adım süresi hesaplandı
  unsigned long hedef_zaman = (mevcut_adim == 3) ? bekleme_4_saat : bekleme_5_saat; // 4 saat / 5 saat hedefi belirlendi

  if (gecen_zaman >= hedef_zaman) { // Bekleme süresi dolduğunda tetiklendi
    onceki_zaman = millis(); // Kronometre sıfırlandı
    mevcut_adim++; // Sonraki adıma geçildi
    
    if (mevcut_adim > 4) mevcut_adim = 0; // Başa dönüldü

    switch (mevcut_adim) { // Sıradaki renk modüle gönderildi
      case 0: ledleri_sur(CRGB::Red); break;
      case 1: ledleri_sur(CRGB::Green); break;
      case 2: ledleri_sur(CRGB::Blue); break;
      case 3: ledleri_sur(CRGB::Purple); break;
      case 4: ledleri_sur(CRGB::Black); break; 
    }
  }
}

void setup() {
  Serial.begin(115200); // Sistem loglarını görmek için seri port açıldı

  // Donanım uyuşmazlığını çözen 1MHz sınırlamalı başlatma
  FastLED.addLeds<P9813, veri_pini, saat_pini, RGB, DATA_RATE_MHZ(1)>(ledler, led_sayisi);
  ledleri_sur(CRGB::Black); // Açılış parlaması önlendi

  // AP Modu (Kendi WiFi Ağını Yaratma)
  Serial.println("AP Modu baslatiliyor...");
  WiFi.softAP(ap_ag_adi, ap_sifre); // Harici modeme bağlanmak yerine kendi ağını kurdu
  
  IPAddress ip_adresi = WiFi.softAPIP(); // Kurulan ağın varsayılan IP adresi değişkene alındı
  Serial.print("Arayuz IP Adresi: ");
  Serial.println(ip_adresi); // Genellikle 192.168.4.1'dir ve ekrana yazdırıldı

  sunucu.on("/", sayfayi_yukle); // Ana sayfa rotası bağlandı
  sunucu.on("/aksiyon", istekleri_isle); // Komut rotası bağlandı
  sunucu.begin(); // Sunucu dinlemeye başladı
}

void loop() {
  sunucu.handleClient(); // Ağdan gelen istekler dinlendi
  donguyu_yonet(); // Non-blocking zamanlayıcı çalıştırıldı
}

Categories:

Tags:

No responses yet

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Dersler