esphome: name: hangul-clock friendly_name: Hangul Clock on_boot: priority: -10 then: - light.turn_on: id: led_strip brightness: 80% effect: "clock" esp32: board: esp32-s3-devkitc-1 framework: type: esp-idf logger: api: ota: - platform: esphome wifi: ssid: "" password: "" ap: ssid: "HangulClock-Setup" password: "12345678" captive_portal: time: - platform: sntp id: sntp_time timezone: Asia/Seoul light: - platform: esp32_rmt_led_strip id: led_strip name: "Hangul Clock" pin: GPIO5 num_leds: 36 rgb_order: GRB chipset: WS2812 effects: - addressable_lambda: name: "clock" update_interval: 100ms lambda: |- static uint8_t hue_base = 0; hue_base += 1; auto t = id(sntp_time).now(); for (int i = 0; i < it.size(); i++) { it[i] = Color(0, 0, 0); } if (!t.is_valid()) return; int h = t.hour; int m = t.minute; auto set_led = [&](int i) { if (i >= 0 && i < it.size()) { it[i] = ESPHSVColor(hue_base + (i * 7), 240, 255); } }; // [자정] 0시 0분 - 자(2), 정(1) if (h == 0 && m == 0) { set_led(2); set_led(1); } // [정오] 12시 0분 - 정(1), 오(0) else if (h == 12 && m == 0) { set_led(1); set_led(0); } else { int h12 = h % 12; if (h12 == 0) h12 = 12; // [시간 단위] switch (h12) { case 1: set_led(5); break; // 한 case 2: set_led(6); break; // 두 case 3: set_led(17); break; // 세 case 4: set_led(18); break; // 네 case 5: set_led(29); set_led(30); break; // 다 섯 case 6: set_led(4); set_led(7); break; // 여 섯 case 7: set_led(16); set_led(19); break; // 일 곱 case 8: set_led(28); set_led(31); break; // 여 덟 case 9: set_led(3); set_led(8); break; // 아 홉 case 10: set_led(15); break; // 열 case 11: set_led(15); set_led(20); break; // 열 한 case 12: set_led(15); set_led(27); break; // 열 두 } set_led(32); // 시 } // [분 단위] if (m != 0) { int tens = m / 10; int ones = m % 10; // 십분 단위 (이, 삼, 사, 오 + 십) if (tens >= 1) { if (tens >= 2) { switch (tens) { case 2: set_led(9); break; // 이 case 3: set_led(14); break; // 삼 case 4: set_led(21); break; // 사 case 5: set_led(26); break; // 오 } } set_led(33); // 십 } // 일분 단위 (일, 이, 삼, 사, 오, 육, 칠, 팔, 구) if (ones != 0) { switch (ones) { case 1: set_led(10); break; // 일 case 2: set_led(13); break; // 이 case 3: set_led(22); break; // 삼 case 4: set_led(25); break; // 사 case 5: set_led(11); break; // 오 case 6: set_led(34); break; // 육 case 7: set_led(12); break; // 칠 case 8: set_led(23); break; // 팔 case 9: set_led(24); break; // 구 } } set_led(35); // 분 }