{"id":1511,"date":"2026-04-22T21:02:54","date_gmt":"2026-04-22T14:02:54","guid":{"rendered":"https:\/\/kru-nu.com\/?page_id=1511"},"modified":"2026-04-24T14:00:09","modified_gmt":"2026-04-24T07:00:09","slug":"smart-logic-control","status":"publish","type":"page","link":"https:\/\/kru-nu.com\/index.php\/smart-logic-control\/","title":{"rendered":"\u0e23\u0e30\u0e1a\u0e1a\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e41\u0e25\u0e30\u0e15\u0e23\u0e23\u0e01\u0e30\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07 (Smart Logic Control)"},"content":{"rendered":"\n<h1 class=\"wp-block-heading has-text-align-center has-ast-global-color-7-background-color has-background has-large-font-size\">\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e1e\u0e31\u0e12\u0e19\u0e32\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 IoT<\/h1>\n\n\n\n<p>\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e23\u0e30\u0e1a\u0e1a Smart Farm \u0e2b\u0e23\u0e37\u0e2d IoT \u0e43\u0e14\u0e46 \u0e43\u0e2b\u0e49\u0e09\u0e25\u0e32\u0e14\u0e41\u0e25\u0e30\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e08\u0e23\u0e34\u0e07 \u0e40\u0e23\u0e32\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e02\u0e49\u0e32\u0e43\u0e08<strong>\u0e2b\u0e31\u0e27\u0e43\u0e08 4 \u0e2d\u0e22\u0e48\u0e32\u0e07<\/strong>\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 \u0e1a\u0e17\u0e40\u0e23\u0e35\u0e22\u0e19\u0e19\u0e35\u0e49\u0e08\u0e30\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e04\u0e33\u0e28\u0e31\u0e1e\u0e17\u0e4c\u0e22\u0e32\u0e01\u0e46 \u0e43\u0e2b\u0e49\u0e01\u0e25\u0e32\u0e22\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e43\u0e01\u0e25\u0e49\u0e15\u0e31\u0e27<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udce6 1. \u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 (Variables &amp; Data Types)<\/h2>\n\n\n\n<p>\u0e40\u0e27\u0e25\u0e32\u0e1a\u0e2d\u0e23\u0e4c\u0e14 ESP32 \u0e17\u0e33\u0e07\u0e32\u0e19 \u0e21\u0e31\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e17\u0e35\u0e48\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e08\u0e14\u0e08\u0e33\u0e2a\u0e34\u0e48\u0e07\u0e15\u0e48\u0e32\u0e07\u0e46 \u0e40\u0e0a\u0e48\u0e19 \u0e2d\u0e38\u0e13\u0e2b\u0e20\u0e39\u0e21\u0e34\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48 \u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33\u0e40\u0e1b\u0e34\u0e14\u0e2d\u0e22\u0e39\u0e48\u0e44\u0e2b\u0e21 \u0e40\u0e23\u0e32\u0e40\u0e23\u0e35\u0e22\u0e01\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e08\u0e14\u0e08\u0e33\u0e19\u0e35\u0e49\u0e27\u0e48\u0e32 <strong>\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23 (Variables)<\/strong> \u0e0b\u0e36\u0e48\u0e07\u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e2a\u0e21\u0e37\u0e2d\u0e19 <strong>&#8220;\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48\u0e02\u0e2d\u0e07&#8221;<\/strong> \u0e41\u0e15\u0e48\u0e02\u0e2d\u0e07\u0e41\u0e15\u0e48\u0e25\u0e30\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e01\u0e47\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e2a\u0e48\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e16\u0e39\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 \u0e40\u0e23\u0e32\u0e08\u0e36\u0e07\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e39\u0e49\u0e08\u0e31\u0e01 <strong>\u0e0a\u0e19\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 (Data Types)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-1024x559.png\" alt=\"\" class=\"wp-image-1553\" style=\"aspect-ratio:1.831896551724138;width:810px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-1024x559.png 1024w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-300x164.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-768x419.png 768w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-1536x838.png 1536w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_fcm7lbfcm7lbfcm7-2048x1117.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>int<\/code> (Integer)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e40\u0e25\u0e02\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e15\u0e47\u0e21&#8221;<\/strong> \u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e28\u0e19\u0e34\u0e22\u0e21\n<ul class=\"wp-block-list\">\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 <code>int relayPin = 2;<\/code> (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e23\u0e35\u0e40\u0e25\u0e22\u0e4c\u0e15\u0e48\u0e2d\u0e2d\u0e22\u0e39\u0e48\u0e02\u0e32 2)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>float<\/code> (Floating Point)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e17\u0e28\u0e19\u0e34\u0e22\u0e21&#8221;<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 <code>float temp = 35.5;<\/code> (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e2d\u0e38\u0e13\u0e2b\u0e20\u0e39\u0e21\u0e34\u0e04\u0e37\u0e2d 35.5 \u0e2d\u0e07\u0e28\u0e32)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>String<\/code> (Text)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21&#8221;<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 <code>String myName = \"Krunu Farm\";<\/code> (\u0e08\u0e33\u0e0a\u0e37\u0e48\u0e2d\u0e1f\u0e32\u0e23\u0e4c\u0e21\u0e44\u0e27\u0e49)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>bool<\/code> (Boolean)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e2a\u0e16\u0e32\u0e19\u0e30 2 \u0e17\u0e32\u0e07&#8221;<\/strong> (\u0e08\u0e23\u0e34\u0e07\/\u0e40\u0e17\u0e47\u0e08 , \u0e40\u0e1b\u0e34\u0e14\/\u0e1b\u0e34\u0e14)\n<ul class=\"wp-block-list\">\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 <code>bool isPumpOn = false;<\/code> (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e1b\u0e31\u0e4a\u0e21\u0e1b\u0e34\u0e14\u0e2d\u0e22\u0e39\u0e48)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>long <\/code>(Long Integer) <\/strong>\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e40\u0e25\u0e02\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e15\u0e47\u0e21\u0e02\u0e19\u0e32\u0e14\u0e43\u0e2b\u0e0d\u0e48&#8221;<\/strong> (\u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e28\u0e19\u0e34\u0e22\u0e21)\n<ul class=\"wp-block-list\">\n<li>\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a \u0e40\u0e01\u0e47\u0e1a\u0e04\u0e48\u0e32\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e21\u0e2b\u0e32\u0e28\u0e32\u0e25\u0e17\u0e35\u0e48\u0e40\u0e01\u0e34\u0e19\u0e04\u0e27\u0e32\u0e21\u0e08\u0e38\u0e02\u0e2d\u0e07 int \u0e1b\u0e01\u0e15\u0e34 \u0e40\u0e0a\u0e48\u0e19 \u0e2b\u0e25\u0e31\u0e01\u0e41\u0e2a\u0e19 \u0e2b\u0e25\u0e31\u0e01\u0e25\u0e49\u0e32\u0e19\u0e02\u0e36\u0e49\u0e19\u0e44\u0e1b<\/li>\n\n\n\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 long totalWaterDrops = 1500000; (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e1b\u0e31\u0e4a\u0e21\u0e2b\u0e22\u0e14\u0e19\u0e49\u0e33\u0e44\u0e1b\u0e41\u0e25\u0e49\u0e27 1 \u0e25\u0e49\u0e32\u0e19 5 \u0e41\u0e2a\u0e19\u0e2b\u0e22\u0e14)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>unsigned long <\/code>(Unsigned Long)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48 <strong>&#8220;\u0e40\u0e25\u0e02\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e15\u0e47\u0e21\u0e1a\u0e27\u0e01\u0e02\u0e19\u0e32\u0e14\u0e43\u0e2b\u0e0d\u0e48\u0e21\u0e32\u0e01&#8221;<\/strong> (\u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e28\u0e19\u0e34\u0e22\u0e21\u0e41\u0e25\u0e30\u0e2b\u0e49\u0e32\u0e21\u0e15\u0e34\u0e14\u0e25\u0e1a)\n<ul class=\"wp-block-list\">\n<li>\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a \u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e40\u0e27\u0e25\u0e32\u0e43\u0e19\u0e23\u0e30\u0e1a\u0e1a \u0e43\u0e0a\u0e49\u0e04\u0e39\u0e48\u0e01\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 millis() \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e40\u0e27\u0e25\u0e32\u0e1a\u0e19\u0e42\u0e25\u0e01\u0e21\u0e35\u0e41\u0e15\u0e48\u0e40\u0e14\u0e34\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e44\u0e21\u0e48\u0e21\u0e35\u0e27\u0e31\u0e19\u0e15\u0e34\u0e14\u0e25\u0e1a<\/li>\n\n\n\n<li>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 unsigned long previousTime = 0; (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e08\u0e14\u0e40\u0e27\u0e25\u0e32\u0e04\u0e23\u0e31\u0e49\u0e07\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e44\u0e27\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e44\u0e2b\u0e23\u0e48)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>enum<\/code> (Enumeration)<\/strong> \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e08\u0e31\u0e14\u0e2b\u0e21\u0e27\u0e14\u0e2b\u0e21\u0e39\u0e48 <strong>&#8220;\u0e1b\u0e49\u0e32\u0e22\u0e0a\u0e37\u0e48\u0e2d\u0e41\u0e17\u0e19\u0e40\u0e25\u0e02\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e15\u0e47\u0e21&#8221;<\/strong> (\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e2d\u0e48\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22)\n<ul class=\"wp-block-list\">\n<li>\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a \u0e08\u0e31\u0e14\u0e01\u0e25\u0e38\u0e48\u0e21\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e17\u0e35\u0e48\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e02\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e0a\u0e49\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e0a\u0e37\u0e48\u0e2d\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e02\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e1a (State Machine) \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e42\u0e04\u0e49\u0e14\u0e2d\u0e48\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e20\u0e32\u0e29\u0e32\u0e04\u0e19 \u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e04\u0e2d\u0e22\u0e40\u0e14\u0e32\u0e27\u0e48\u0e32\u0e40\u0e25\u0e02\u0e19\u0e35\u0e49\u0e41\u0e1b\u0e25\u0e27\u0e48\u0e32\u0e2d\u0e30\u0e44\u0e23<\/li>\n\n\n\n<li><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07<\/strong> enum PumpState { OFF = 0, ON = 1, ERROR = 2 }; PumpState current = ON; \/\/ (\u0e08\u0e33\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e04\u0e37\u0e2d ON \u0e0b\u0e36\u0e48\u0e07\u0e40\u0e1a\u0e37\u0e49\u0e2d\u0e07\u0e2b\u0e25\u0e31\u0e07\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e40\u0e25\u0e02 1 \u0e19\u0e31\u0e48\u0e19\u0e40\u0e2d\u0e07)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udea6 2. \u0e15\u0e23\u0e23\u0e01\u0e30\u0e01\u0e32\u0e23\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08 (Control Structures)<\/h2>\n\n\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e33\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e14\u0e49\u0e41\u0e25\u0e49\u0e27 \u0e15\u0e48\u0e2d\u0e21\u0e32\u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e2a\u0e2d\u0e19\u0e43\u0e2b\u0e49\u0e21\u0e31\u0e19<strong>\u0e04\u0e34\u0e14\u0e41\u0e25\u0e30\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08<\/strong>\u0e44\u0e14\u0e49<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>if - else<\/code><\/strong><\/h3>\n\n\n\n<p>\u0e19\u0e35\u0e48\u0e04\u0e37\u0e2d\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e1a\u0e48\u0e2d\u0e22\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14 \u0e43\u0e0a\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e15\u0e31\u0e49\u0e07\u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e27\u0e48\u0e32 \u0e16\u0e49\u0e32\u0e40\u0e01\u0e34\u0e14\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e19\u0e35\u0e49 \u0e08\u0e30\u0e43\u0e2b\u0e49\u0e17\u0e33\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48 \u0e43\u0e2b\u0e49\u0e44\u0e1b\u0e17\u0e33\u0e2d\u0e35\u0e01\u0e2a\u0e34\u0e48\u0e07\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e41\u0e17\u0e19 \u0e40\u0e0a\u0e48\u0e19<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float soilMoisture = 40.5; \/\/ \u0e14\u0e34\u0e19\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e37\u0e49\u0e19 40.5%\n\n\/\/ \u0e2a\u0e2d\u0e19\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e43\u0e2b\u0e49\u0e15\u0e31\u0e14\u0e2a\u0e34\u0e19\u0e43\u0e08:\nif (soilMoisture &lt; 50.0) {\n  \/\/ \u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e40\u0e1b\u0e47\u0e19\u0e08\u0e23\u0e34\u0e07 -&gt; \u0e43\u0e2b\u0e49\u0e23\u0e14\u0e19\u0e49\u0e33\n  digitalWrite(relayPin, HIGH);\n  Serial.println(\"\u0e14\u0e34\u0e19\u0e41\u0e2b\u0e49\u0e07\u0e41\u0e25\u0e49\u0e27! \u0e40\u0e1b\u0e34\u0e14\u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33\u0e14\u0e48\u0e27\u0e19\");\n} else {\n  \/\/ \u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e17\u0e47\u0e08 -&gt; \u0e43\u0e2b\u0e49\u0e1b\u0e34\u0e14\u0e19\u0e49\u0e33\n  digitalWrite(relayPin, LOW);\n  Serial.println(\"\u0e14\u0e34\u0e19\u0e0a\u0e37\u0e49\u0e19\u0e14\u0e35\u0e41\u0e25\u0e49\u0e27 \u0e1b\u0e34\u0e14\u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33\u0e44\u0e14\u0e49\");\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u2699\ufe0f 3. \u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e40\u0e0a\u0e34\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30 (State Machine)<\/h2>\n\n\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e42\u0e1b\u0e23\u0e40\u0e08\u0e01\u0e15\u0e4c\u0e40\u0e23\u0e32\u0e43\u0e2b\u0e0d\u0e48\u0e02\u0e36\u0e49\u0e19 \u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e25\u0e07\u0e21\u0e32\u0e15\u0e23\u0e07\u0e46 \u0e2d\u0e32\u0e08\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e23\u0e30\u0e1a\u0e1a\u0e23\u0e27\u0e19\u0e44\u0e14\u0e49 <strong>State Machine<\/strong> \u0e04\u0e37\u0e2d\u0e40\u0e17\u0e04\u0e19\u0e34\u0e04\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e42\u0e14\u0e22\u0e41\u0e1a\u0e48\u0e07\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2d\u0e2d\u0e01\u0e40\u0e1b\u0e47\u0e19<strong>\u0e2a\u0e16\u0e32\u0e19\u0e30 (State)<\/strong> \u0e17\u0e35\u0e48\u0e0a\u0e31\u0e14\u0e40\u0e08\u0e19 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e23\u0e39\u0e49\u0e15\u0e31\u0e27\u0e40\u0e2a\u0e21\u0e2d\u0e27\u0e48\u0e32\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e44\u0e2b\u0e19 \u0e41\u0e25\u0e30\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23\u0e15\u0e48\u0e2d<\/p>\n\n\n\n<p><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 \u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e0b\u0e31\u0e01\u0e1c\u0e49\u0e32<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e23\u0e2d (Idle)<\/strong> \u0e23\u0e2d\u0e04\u0e19\u0e21\u0e32\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21<\/li>\n\n\n\n<li><strong>\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e40\u0e15\u0e34\u0e21\u0e19\u0e49\u0e33 (Filling)<\/strong> \u0e40\u0e1b\u0e34\u0e14\u0e27\u0e32\u0e25\u0e4c\u0e27\u0e19\u0e49\u0e33 \u0e23\u0e2d\u0e08\u0e19\u0e19\u0e49\u0e33\u0e40\u0e15\u0e47\u0e21<\/li>\n\n\n\n<li><strong>\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e0b\u0e31\u0e01 (Washing)<\/strong> \u0e21\u0e2d\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e2b\u0e21\u0e38\u0e19 20 \u0e19\u0e32\u0e17\u0e35<\/li>\n<\/ol>\n\n\n\n<p>\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14 \u0e40\u0e23\u0e32\u0e21\u0e31\u0e01\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>switch - case<\/code> \u0e21\u0e32\u0e0a\u0e48\u0e27\u0e22\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e2a\u0e16\u0e32\u0e19\u0e30<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int systemState = 0; \/\/ 0=\u0e23\u0e2d\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07, 1=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e14\u0e19\u0e49\u0e33, 2=\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e19\u0e49\u0e33\u0e2b\u0e21\u0e14\n\nswitch (systemState) {  \/\/\u0e19\u0e33\u0e04\u0e48\u0e32\u0e43\u0e19\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e21\u0e32\u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e17\u0e35\u0e22\u0e1a\u0e01\u0e31\u0e1a\u0e01\u0e23\u0e13\u0e35 (case) \u0e15\u0e48\u0e32\u0e07\u0e46\n  case 0: \/\/ \u0e16\u0e49\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30 0\n    Serial.println(\"\u0e23\u0e2d\u0e23\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e08\u0e32\u0e01\u0e41\u0e2d\u0e1b\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19...\");\n    break; \/\/ \u0e08\u0e1a\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e19\u0e35\u0e49\n    \n  case 1: \/\/ \u0e16\u0e49\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30 1\n    Serial.println(\"\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e14\u0e19\u0e49\u0e33\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49...\");\n    \/\/ \u0e43\u0e2a\u0e48\u0e42\u0e04\u0e49\u0e14\u0e40\u0e1b\u0e34\u0e14\u0e1b\u0e31\u0e4a\u0e21\u0e15\u0e23\u0e07\u0e19\u0e35\u0e49\n    break;\n    \n  case 2: \/\/ \u0e16\u0e49\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30 2\n    Serial.println(\"\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19: \u0e19\u0e49\u0e33\u0e43\u0e19\u0e41\u0e17\u0e47\u0e07\u0e01\u0e4c\u0e2b\u0e21\u0e14!\");\n    break;\n}<\/code><\/pre>\n\n\n\n<p><strong>\u0e02\u0e49\u0e2d\u0e14\u0e35<\/strong> \u0e42\u0e04\u0e49\u0e14\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e1a\u0e21\u0e32\u0e01 \u0e41\u0e01\u0e49\u0e44\u0e02\u0e07\u0e48\u0e32\u0e22 \u0e41\u0e25\u0e30\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e07\u0e32\u0e19\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u23f1\ufe0f 4. \u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e40\u0e27\u0e25\u0e32 (Non-blocking Delay \u0e14\u0e49\u0e27\u0e22 millis)<\/h2>\n\n\n\n<p>\u0e15\u0e2d\u0e19\u0e40\u0e23\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e23\u0e35\u0e22\u0e19 \u0e40\u0e23\u0e32\u0e21\u0e31\u0e01\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>delay(2000);<\/code> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e23\u0e2d 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35<\/p>\n\n\n\n<p><strong>\u274c \u0e17\u0e33\u0e44\u0e21 <code>delay()<\/code> \u0e16\u0e36\u0e07\u0e44\u0e21\u0e48\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e1a\u0e32\u0e07\u0e42\u0e2d\u0e01\u0e32\u0e2a<\/strong> \u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>delay<\/code> \u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e2a\u0e21\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e1a\u0e2d\u0e23\u0e4c\u0e14<strong>\u0e01\u0e34\u0e19\u0e22\u0e32\u0e19\u0e2d\u0e19\u0e2b\u0e25\u0e31\u0e1a<\/strong>\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e19\u0e31\u0e49\u0e19 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e2b\u0e25\u0e31\u0e1a\u0e25\u0e36\u0e01 \u0e44\u0e21\u0e48\u0e23\u0e31\u0e1a\u0e23\u0e39\u0e49\u0e42\u0e25\u0e01\u0e20\u0e32\u0e22\u0e19\u0e2d\u0e01 \u0e16\u0e49\u0e32\u0e21\u0e35\u0e04\u0e19\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e1b\u0e34\u0e14\u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33 \u0e2b\u0e23\u0e37\u0e2d\u0e21\u0e35\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e37\u0e49\u0e19\u0e2d\u0e31\u0e19\u0e15\u0e23\u0e32\u0e22\u0e2a\u0e48\u0e07\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e44\u0e21\u0e48\u0e2a\u0e19\u0e40\u0e25\u0e22 \u0e0b\u0e36\u0e48\u0e07\u0e2d\u0e31\u0e19\u0e15\u0e23\u0e32\u0e22\u0e21\u0e32\u0e01\u0e43\u0e19\u0e07\u0e32\u0e19\u0e23\u0e30\u0e1a\u0e1a\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21<\/p>\n\n\n\n<p><strong>\u2705 <code>millis()<\/code> \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32\u0e08\u0e31\u0e1a\u0e40\u0e27\u0e25\u0e32<\/strong> \u0e04\u0e37\u0e2d\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e17\u0e35\u0e48\u0e1a\u0e2d\u0e01\u0e27\u0e48\u0e32 <strong>\u0e15\u0e31\u0e49\u0e07\u0e41\u0e15\u0e48\u0e40\u0e1b\u0e34\u0e14\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e21\u0e32 \u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b\u0e01\u0e35\u0e48\u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e41\u0e25\u0e49\u0e27<\/strong> \u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 <code>millis()<\/code> \u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e23\u0e32\u0e01\u0e33\u0e25\u0e31\u0e07\u0e15\u0e49\u0e21\u0e21\u0e32\u0e21\u0e48\u0e32 \u0e41\u0e15\u0e48\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e23\u0e2d 3 \u0e19\u0e32\u0e17\u0e35 \u0e40\u0e23\u0e32\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e22\u0e37\u0e19\u0e08\u0e49\u0e2d\u0e07\u0e2b\u0e21\u0e49\u0e2d\u0e40\u0e09\u0e22\u0e46 (delay) \u0e40\u0e23\u0e32\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e1a\u0e14\u0e39\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e1e\u0e31\u0e01\u0e46 \u0e41\u0e25\u0e30\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e19\u0e31\u0e49\u0e19\u0e40\u0e23\u0e32\u0e01\u0e47\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e27\u0e32\u0e14\u0e1a\u0e49\u0e32\u0e19 \u0e25\u0e49\u0e32\u0e07\u0e08\u0e32\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e15\u0e2d\u0e1a\u0e41\u0e0a\u0e17\u0e44\u0e1b\u0e14\u0e49\u0e27\u0e22\u0e44\u0e14\u0e49 (Non-blocking)<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e39\u0e15\u0e23\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 <code>millis()<\/code><\/strong><\/h3>\n\n\n\n<p>\u0e40\u0e23\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e2b\u0e25\u0e31\u0e01\u0e01\u0e32\u0e23\u0e04\u0e13\u0e34\u0e15\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c\u0e07\u0e48\u0e32\u0e22\u0e46 \u0e04\u0e37\u0e2d <strong><code>\u0e40\u0e27\u0e25\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 - \u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e08\u0e14\u0e44\u0e27\u0e49\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14 &gt;= \u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e23\u0e2d<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>unsigned long previousMillis = 0;  \/\/ \u0e01\u0e25\u0e48\u0e2d\u0e07\u0e40\u0e01\u0e47\u0e1a\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e08\u0e14\u0e44\u0e27\u0e49\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14 (\u0e43\u0e0a\u0e49 unsigned long \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e40\u0e25\u0e02\u0e21\u0e31\u0e19\u0e08\u0e30\u0e40\u0e22\u0e2d\u0e30\u0e21\u0e32\u0e01)\nconst long interval = 2000;        \/\/ \u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e17\u0e33\u0e07\u0e32\u0e19\u0e17\u0e38\u0e01\u0e46 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 (2000 \u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)\n\nvoid loop() {\n  unsigned long currentMillis = millis(); \/\/ \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e1a\u0e14\u0e39\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32\u0e27\u0e48\u0e32\u0e15\u0e31\u0e49\u0e07\u0e41\u0e15\u0e48\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e32 \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e40\u0e27\u0e25\u0e32\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b\u0e01\u0e35\u0e48\u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e41\u0e25\u0e49\u0e27\n\n  \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32\u0e40\u0e27\u0e25\u0e32\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b\u0e16\u0e36\u0e07 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e31\u0e07\n  if (currentMillis - previousMillis &gt;= interval) {\n    previousMillis = currentMillis; \/\/ \u0e08\u0e14\u0e40\u0e27\u0e25\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e40\u0e01\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e43\u0e0a\u0e49\u0e23\u0e2d\u0e1a\u0e2b\u0e19\u0e49\u0e32\n    \n    \/\/ \u0e17\u0e33\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 \u0e40\u0e0a\u0e48\u0e19 \u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e02\u0e36\u0e49\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\n    Serial.println(\"\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08!\");\n  }\n\n  \/\/ \u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e23\u0e2d\u0e43\u0e2b\u0e49\u0e04\u0e23\u0e1a 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e21\u0e32\u0e17\u0e33\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e15\u0e23\u0e07\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32!!\n  \/\/ \u0e40\u0e0a\u0e48\u0e19 \u0e01\u0e32\u0e23\u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32\u0e21\u0e35\u0e04\u0e19\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48\n  checkButtonPress(); \n}<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-ast-global-color-7-background-color has-background has-large-font-size\">\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Digital Input (Pull-up) \u0e41\u0e25\u0e30 Digital Output<\/h1>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e44\u0e2b\u0e23\u0e48\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 <code>OUTPUT<\/code><\/h2>\n\n\n\n<p><strong>\u0e01\u0e0e\u0e01\u0e32\u0e23\u0e08\u0e33<\/strong> \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e44\u0e2b\u0e19\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e08\u0e32\u0e01\u0e1a\u0e2d\u0e23\u0e4c\u0e14 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e21\u0e35\u0e01\u0e32\u0e23 <strong>\u0e02\u0e22\u0e31\u0e1a \u0e2a\u0e27\u0e48\u0e32\u0e07 \u0e2a\u0e48\u0e07\u0e40\u0e2a\u0e35\u0e22\u0e07<\/strong> \u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e42\u0e2b\u0e21\u0e14\u0e19\u0e35\u0e49<\/p>\n\n\n\n<p>\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e17\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e08\u0e48\u0e32\u0e22\u0e44\u0e1f\u0e44\u0e1b\u0e2a\u0e31\u0e48\u0e07\u0e07\u0e32\u0e19<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e43\u0e19 Smart Farm<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u0e23\u0e35\u0e40\u0e25\u0e22\u0e4c (Relay Module)<\/strong> \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e15\u0e31\u0e14\u0e15\u0e48\u0e2d\u0e44\u0e1f 220V \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e38\u0e21\u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33 \u0e1e\u0e31\u0e14\u0e25\u0e21\u0e1f\u0e32\u0e23\u0e4c\u0e21<\/li>\n\n\n\n<li><strong>\u0e2b\u0e25\u0e2d\u0e14\u0e44\u0e1f LED<\/strong> \u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e15\u0e34\u0e14\u0e2a\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e2a\u0e14\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30 \u0e40\u0e0a\u0e48\u0e19 \u0e44\u0e1f\u0e41\u0e14\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e19\u0e49\u0e33\u0e41\u0e2b\u0e49\u0e07<\/li>\n\n\n\n<li><strong>\u0e25\u0e33\u0e42\u0e1e\u0e07\u0e1a\u0e31\u0e0b\u0e40\u0e0b\u0e2d\u0e23\u0e4c (Active Buzzer)<\/strong> \u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e2a\u0e48\u0e07\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e40\u0e27\u0e25\u0e32\u0e21\u0e35\u0e02\u0e42\u0e21\u0e22\u0e40\u0e02\u0e49\u0e32\u0e1f\u0e32\u0e23\u0e4c\u0e21<\/li>\n\n\n\n<li><strong>\u0e42\u0e0b\u0e25\u0e34\u0e19\u0e2d\u0e22\u0e14\u0e4c\u0e27\u0e32\u0e25\u0e4c\u0e27 (Solenoid Valve)<\/strong> \u0e2a\u0e31\u0e48\u0e07\u0e40\u0e1b\u0e34\u0e14-\u0e1b\u0e34\u0e14\u0e27\u0e32\u0e25\u0e4c\u0e27\u0e19\u0e49\u0e33\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e44\u0e2b\u0e23\u0e48\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 <code>INPUT<\/code> \u0e41\u0e1a\u0e1a\u0e1b\u0e01\u0e15\u0e34<\/h3>\n\n\n\n<p><strong>\u0e01\u0e0e\u0e01\u0e32\u0e23\u0e08\u0e33<\/strong> \u0e43\u0e0a\u0e49\u0e01\u0e31\u0e1a\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19 <strong>\u0e41\u0e1c\u0e07\u0e27\u0e07\u0e08\u0e23\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08\u0e23\u0e39\u0e1b (\u0e21\u0e31\u0e01\u0e08\u0e30\u0e21\u0e35 3-4 \u0e02\u0e32)<\/strong> \u0e0b\u0e36\u0e48\u0e07\u0e21\u0e31\u0e19\u0e09\u0e25\u0e32\u0e14\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e2a\u0e48\u0e07\u0e44\u0e1f HIGH (1) \u0e2b\u0e23\u0e37\u0e2d LOW (0) \u0e21\u0e32\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27<\/p>\n\n\n\n<p>\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e1e\u0e27\u0e01\u0e19\u0e35\u0e49\u0e21\u0e35\u0e0a\u0e34\u0e1b\u0e1b\u0e23\u0e30\u0e21\u0e27\u0e25\u0e1c\u0e25\u0e43\u0e19\u0e15\u0e31\u0e27 \u0e21\u0e31\u0e19\u0e08\u0e36\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e1b\u0e31\u0e0d\u0e2b\u0e32 &#8220;\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e25\u0e2d\u0e22\u0e15\u0e31\u0e27 (Floating)&#8221; \u0e40\u0e23\u0e32\u0e40\u0e25\u0e22\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14 Pull-up \u0e0a\u0e48\u0e27\u0e22<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e43\u0e19 Smart Farm<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e15\u0e23\u0e27\u0e08\u0e08\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e04\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e2b\u0e27 (PIR Sensor)<\/strong> \u0e21\u0e35\u0e04\u0e19\u0e40\u0e14\u0e34\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e2a\u0e48\u0e07 1 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e04\u0e19\u0e2a\u0e48\u0e07 0<\/li>\n\n\n\n<li><strong>\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e08\u0e31\u0e1a\u0e40\u0e2a\u0e49\u0e19\u0e02\u0e32\u0e27\u0e14\u0e33 \/ \u0e01\u0e35\u0e14\u0e02\u0e27\u0e32\u0e07 (IR Sensor)<\/strong> \u0e40\u0e08\u0e2d\u0e01\u0e33\u0e41\u0e1e\u0e07\u0e2a\u0e48\u0e07 0 \u0e44\u0e21\u0e48\u0e40\u0e08\u0e2d\u0e2a\u0e48\u0e07 1<\/li>\n\n\n\n<li><strong>\u0e42\u0e21\u0e14\u0e39\u0e25\u0e27\u0e31\u0e14\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e37\u0e49\u0e19\u0e14\u0e34\u0e19\u0e41\u0e1a\u0e1a\u0e14\u0e34\u0e08\u0e34\u0e17\u0e31\u0e25 (Soil Moisture DO Pin)<\/strong> \u0e16\u0e49\u0e32\u0e14\u0e34\u0e19\u0e41\u0e2b\u0e49\u0e07\u0e40\u0e01\u0e34\u0e19\u0e40\u0e01\u0e13\u0e11\u0e4c\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14 \u0e43\u0e2b\u0e49\u0e2a\u0e48\u0e07 1 \u0e21\u0e32\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e17\u0e31\u0e19\u0e17\u0e35<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e44\u0e2b\u0e23\u0e48\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 <code>INPUT_PULLUP<\/code> (\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a)<\/h3>\n\n\n\n<p><strong>\u0e01\u0e0e\u0e01\u0e32\u0e23\u0e08\u0e33<\/strong> \u0e43\u0e0a\u0e49\u0e01\u0e31\u0e1a\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19<strong>\u0e01\u0e25\u0e44\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a<\/strong>\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e21\u0e35\u0e44\u0e1f\u0e40\u0e25\u0e35\u0e49\u0e22\u0e07\u0e43\u0e19\u0e15\u0e31\u0e27<\/p>\n\n\n\n<p>\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e1e\u0e27\u0e01\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e21\u0e2d\u0e07 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e41\u0e1c\u0e07\u0e27\u0e07\u0e08\u0e23 \u0e40\u0e1b\u0e47\u0e19\u0e41\u0e04\u0e48\u0e40\u0e2b\u0e25\u0e47\u0e01 2 \u0e0a\u0e34\u0e49\u0e19\u0e41\u0e15\u0e30\u0e01\u0e31\u0e19 \u0e40\u0e23\u0e32\u0e08\u0e36\u0e07\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14\u0e23\u0e30\u0e1a\u0e1a Pull-up \u0e20\u0e32\u0e22\u0e43\u0e19\u0e1a\u0e2d\u0e23\u0e4c\u0e14 ESP32 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e0a\u0e48\u0e27\u0e22\u0e1b\u0e23\u0e30\u0e04\u0e2d\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e44\u0e1f\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e23\u0e27\u0e19<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e43\u0e19 Smart Farm<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14 (Push Button)<\/strong> \u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e40\u0e1b\u0e34\u0e14\u0e1b\u0e23\u0e30\u0e15\u0e39<\/li>\n\n\n\n<li><strong>\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e41\u0e21\u0e48\u0e40\u0e2b\u0e25\u0e47\u0e01 (Magnetic Switch)<\/strong> \u0e40\u0e2d\u0e32\u0e44\u0e27\u0e49\u0e15\u0e34\u0e14\u0e1b\u0e23\u0e30\u0e15\u0e39\u0e1f\u0e32\u0e23\u0e4c\u0e21 \u0e16\u0e49\u0e32\u0e1b\u0e23\u0e30\u0e15\u0e39\u0e40\u0e1b\u0e34\u0e14 \u0e41\u0e21\u0e48\u0e40\u0e2b\u0e25\u0e47\u0e01\u0e2b\u0e48\u0e32\u0e07\u0e01\u0e31\u0e19 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e23\u0e39\u0e49\u0e17\u0e31\u0e19\u0e17\u0e35<\/li>\n\n\n\n<li><strong>\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e25\u0e39\u0e01\u0e25\u0e2d\u0e22 (Float Switch)<\/strong> \u0e40\u0e2d\u0e32\u0e44\u0e27\u0e49\u0e2b\u0e22\u0e48\u0e2d\u0e19\u0e43\u0e19\u0e16\u0e31\u0e07\u0e19\u0e49\u0e33 \u0e16\u0e49\u0e32\u0e19\u0e49\u0e33\u0e40\u0e15\u0e47\u0e21 \u0e25\u0e39\u0e01\u0e25\u0e2d\u0e22\u0e08\u0e30\u0e25\u0e2d\u0e22\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32\u0e0a\u0e19\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c<\/li>\n\n\n\n<li><strong>\u0e44\u0e21\u0e42\u0e04\u0e23\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c (Limit Switch)<\/strong> \u0e15\u0e31\u0e27\u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32\u0e1b\u0e23\u0e30\u0e15\u0e39\u0e23\u0e31\u0e49\u0e27\u0e1f\u0e32\u0e23\u0e4c\u0e21\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e40\u0e1b\u0e34\u0e14\u0e44\u0e1b\u0e08\u0e19\u0e2a\u0e38\u0e14\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e31\u0e07<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e23\u0e38\u0e1b\u0e15\u0e32\u0e23\u0e32\u0e07\u0e04\u0e39\u0e48\u0e21\u0e37\u0e2d\u0e0a\u0e48\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1f\u0e32\u0e23\u0e4c\u0e21<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e42\u0e2b\u0e21\u0e14\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e17\u0e33\u0e07\u0e32\u0e19 (Active)<\/strong><\/td><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2a\u0e31\u0e48\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e43\u0e2b\u0e49\u0e17\u0e33\u0e07\u0e32\u0e19<\/strong> (\u0e2b\u0e25\u0e2d\u0e14\u0e44\u0e1f \u0e1b\u0e31\u0e4a\u0e21 \u0e40\u0e2a\u0e35\u0e22\u0e07)<\/td><td class=\"has-text-align-center\" data-align=\"center\"><code>OUTPUT<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\"><code>HIGH<\/code> (\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e1b\u0e34\u0e14) \/ <code>LOW<\/code> (\u0e2a\u0e31\u0e48\u0e07\u0e1b\u0e34\u0e14)<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e41\u0e1c\u0e07\u0e27\u0e07\u0e08\u0e23\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08\u0e23\u0e39\u0e1b<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><code>INPUT<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e23\u0e31\u0e1a <code>HIGH<\/code> \u0e2b\u0e23\u0e37\u0e2d <code>LOW<\/code> (\u0e15\u0e32\u0e21\u0e2a\u0e40\u0e1b\u0e01\u0e40\u0e0b\u0e19\u0e40\u0e0b\u0e2d\u0e23\u0e4c)<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e01\u0e25\u0e44\u0e01 \/ \u0e2b\u0e19\u0e49\u0e32\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e40\u0e1b\u0e25\u0e48\u0e32\u0e46<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><code>INPUT_PULLUP<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\"><code>LOW<\/code> (\u0e40\u0e27\u0e25\u0e32\u0e01\u0e14\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e2b\u0e23\u0e37\u0e2d\u0e2b\u0e19\u0e49\u0e32\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e0a\u0e19\u0e01\u0e31\u0e19)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\ud83d\udca1 <strong>\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e23\u0e23\u0e30\u0e27\u0e31\u0e07<\/strong> \u0e16\u0e49\u0e32\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e40\u0e2d\u0e32\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e25\u0e39\u0e01\u0e25\u0e2d\u0e22\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e19\u0e49\u0e33\u0e40\u0e15\u0e47\u0e21 2 \u0e40\u0e2a\u0e49\u0e19 \u0e21\u0e32\u0e15\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 ESP32 \u0e41\u0e25\u0e49\u0e27\u0e25\u0e37\u0e21\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e04\u0e33\u0e27\u0e48\u0e32 <code>_PULLUP<\/code> (\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e41\u0e04\u0e48 <code>INPUT<\/code> \u0e40\u0e09\u0e22\u0e46) \u0e1b\u0e31\u0e4a\u0e21\u0e19\u0e49\u0e33\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e34\u0e14-\u0e1b\u0e34\u0e14\u0e23\u0e31\u0e27\u0e46 \u0e08\u0e19\u0e21\u0e2d\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e44\u0e2b\u0e21\u0e49\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22 \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e30\u0e2d\u0e48\u0e32\u0e19\u0e04\u0e48\u0e32\u0e1c\u0e35\u0e2b\u0e25\u0e2d\u0e01 (Floating) \u0e19\u0e31\u0e48\u0e19\u0e40\u0e2d\u0e07<\/p>\n<\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-luminous-vivid-orange-background-color has-background has-large-font-size\">Lab 5 <strong>\u0e23\u0e30\u0e1a\u0e1a\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23\u0e2d\u0e31\u0e08\u0e09\u0e23\u0e34\u0e22\u0e30\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e02\u0e49\u0e32\u0e21\u0e16\u0e19\u0e19<\/strong> (<strong>Smart Traffic Light Control with Manual Override<\/strong>)<\/h1>\n\n\n\n<p>\u0e43\u0e19\u0e41\u0e25\u0e47\u0e1a\u0e19\u0e35\u0e49 \u0e40\u0e23\u0e32\u0e08\u0e30\u0e02\u0e49\u0e32\u0e21\u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e01\u0e30\u0e1e\u0e23\u0e34\u0e1a\u0e44\u0e1f\u0e41\u0e1a\u0e1a\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32 \u0e41\u0e15\u0e48\u0e08\u0e30\u0e40\u0e19\u0e49\u0e19\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e0a\u0e34\u0e07\u0e15\u0e23\u0e23\u0e01\u0e30\u0e41\u0e1a\u0e1a <strong>State Machine<\/strong> \u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 <strong>Non-blocking Delay (<\/strong><strong>millis()<\/strong><strong>)<\/strong> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 ESP32 \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e44\u0e14\u0e49\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e04\u0e49\u0e32\u0e07\u0e17\u0e35\u0e48\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 delay()<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e27\u0e31\u0e15\u0e16\u0e38\u0e1b\u0e23\u0e30\u0e2a\u0e07\u0e04\u0e4c<\/strong><\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e32\u0e43\u0e08\u0e43\u0e19\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e2a\u0e16\u0e32\u0e19\u0e30 (State) \u0e02\u0e2d\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21<\/li>\n\n\n\n<li>\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e1d\u0e36\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 Digital Input (Pull-up) \u0e41\u0e25\u0e30 Digital Output<\/li>\n\n\n\n<li>\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e35\u0e22\u0e19\u0e23\u0e39\u0e49\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14\u0e41\u0e1a\u0e1a Non-blocking \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e1b\u0e38\u0e48\u0e21\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e44\u0e14\u0e49\u0e17\u0e31\u0e19\u0e17\u0e35<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0e1a\u0e2d\u0e23\u0e4c\u0e14 ESP32 x 1<\/li>\n\n\n\n<li>LED (\u0e41\u0e14\u0e07 \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07 \u0e40\u0e02\u0e35\u0e22\u0e27) \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e25\u0e30 1 \u0e2b\u0e25\u0e2d\u0e14<\/li>\n\n\n\n<li>\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19 220-330 Ohm x 3 (\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a LED)<\/li>\n\n\n\n<li>Tact Switch x 1<\/li>\n\n\n\n<li>Breadboard \u0e41\u0e25\u0e30\u0e2a\u0e32\u0e22\u0e08\u0e31\u0e21\u0e40\u0e1b\u0e2d\u0e23\u0e4c<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e27\u0e07\u0e08\u0e23 (Wiring)<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e02\u0e32 <\/strong><strong>ESP32<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED \u0e41\u0e14\u0e07<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">GPIO 12<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e25\u0e07 Ground<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">GPIO 14<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e25\u0e07 Ground<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED \u0e40\u0e02\u0e35\u0e22\u0e27<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">GPIO 27<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e25\u0e07 Ground<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Tact Switch<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">GPIO 26<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e02\u0e32\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e25\u0e07 GND \u0e2d\u0e35\u0e01\u0e02\u0e32\u0e40\u0e02\u0e49\u0e32 GPIO 26 (\u0e43\u0e0a\u0e49 Internal Pull-up)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e42\u0e04\u0e49\u0e14\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>const int LED_R = 12;\nconst int LED_Y = 14;\nconst int LED_G = 27;\nconst int BTN_PIN = 26;\n\n\/\/ \u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e02\u0e2d\u0e07\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23\nenum TrafficState { GREEN, YELLOW, RED, MANUAL_STOP };\nTrafficState currentState = GREEN;\n\nunsigned long previousMillis = 0;\nconst long intervalGreen = 5000;  \/\/ \u0e40\u0e02\u0e35\u0e22\u0e27 5 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\nconst long intervalYellow = 2000; \/\/ \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\nconst long intervalRed = 5000;    \/\/ \u0e41\u0e14\u0e07 5 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\n\nvoid setup() {\n  Serial.begin(115200);\n  pinMode(LED_R, OUTPUT);\n  pinMode(LED_Y, OUTPUT);\n  pinMode(LED_G, OUTPUT);\n  pinMode(BTN_PIN, INPUT_PULLUP); \/\/ \u0e43\u0e0a\u0e49 Pull-up \u0e20\u0e32\u0e22\u0e43\u0e19 (\u0e01\u0e14\u0e41\u0e25\u0e49\u0e27\u0e40\u0e1b\u0e47\u0e19 LOW)\n  \n  Serial.println(\"System Start Traffic Light Lab 1\");\n}\n\nvoid loop() {\n  unsigned long currentMillis = millis();\n  \n  \/\/ \u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 (Manual Override)\n  \/\/ \u0e2b\u0e32\u0e01\u0e21\u0e35\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 \u0e43\u0e2b\u0e49\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35\n  if (digitalRead(BTN_PIN) == LOW) {\n    delay(50); \/\/ Debounce \u0e40\u0e25\u0e47\u0e01\u0e19\u0e49\u0e2d\u0e22\n    if (digitalRead(BTN_PIN) == LOW) {\n      Serial.println(\"Manual Override Change to RED!\");\n      currentState = RED;\n      previousMillis = currentMillis; \/\/ Reset \u0e40\u0e27\u0e25\u0e32\n    }\n  }\n\n  \/\/ State Machine \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23\n  switch (currentState) {\n    case GREEN:\n      updateLEDs(LOW, LOW, HIGH); \/\/ \u0e40\u0e02\u0e35\u0e22\u0e27\u0e15\u0e34\u0e14\n      if (currentMillis - previousMillis >= intervalGreen) {\n        currentState = YELLOW;\n        previousMillis = currentMillis;\n      }\n      break;\n\n    case YELLOW:\n      updateLEDs(LOW, HIGH, LOW); \/\/ \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e15\u0e34\u0e14\n      if (currentMillis - previousMillis >= intervalYellow) {\n        currentState = RED;\n        previousMillis = currentMillis;\n      }\n      break;\n\n    case RED:\n      updateLEDs(HIGH, LOW, LOW); \/\/ \u0e41\u0e14\u0e07\u0e15\u0e34\u0e14\n      if (currentMillis - previousMillis >= intervalRed) {\n        currentState = GREEN;\n        previousMillis = currentMillis;\n      }\n      break;\n  }\n}\n\n\/\/ \u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e0a\u0e48\u0e27\u0e22\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e2a\u0e16\u0e32\u0e19\u0e30 LED\nvoid updateLEDs(int r, int y, int g) {\n  digitalWrite(LED_R, r);\n  digitalWrite(LED_Y, y);\n  digitalWrite(LED_G, g);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e42\u0e04\u0e49\u0e14\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e01\u0e32\u0e28\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e41\u0e25\u0e30\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>const int LED_X = &#8230;<\/strong> \u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 const \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e1a\u0e2d\u0e01\u0e04\u0e2d\u0e21\u0e44\u0e1e\u0e40\u0e25\u0e2d\u0e23\u0e4c\u0e27\u0e48\u0e32\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07 \u0e0a\u0e48\u0e27\u0e22\u0e1b\u0e23\u0e30\u0e2b\u0e22\u0e31\u0e14 Memory \u0e41\u0e25\u0e30\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e01\u0e32\u0e23\u0e40\u0e1c\u0e25\u0e2d\u0e41\u0e01\u0e49\u0e04\u0e48\u0e32\u0e02\u0e32 GPIO \u0e43\u0e19\u0e42\u0e04\u0e49\u0e14\u0e2a\u0e48\u0e27\u0e19\u0e2d\u0e37\u0e48\u0e19<\/li>\n\n\n\n<li><strong>enum TrafficState { &#8230; }<\/strong> \u0e19\u0e35\u0e48\u0e04\u0e37\u0e2d\u0e2b\u0e31\u0e27\u0e43\u0e08\u0e02\u0e2d\u0e07 <strong>State Machine<\/strong> \u0e04\u0e23\u0e31\u0e1a \u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e08\u0e30\u0e08\u0e33\u0e27\u0e48\u0e32 0 = \u0e40\u0e02\u0e35\u0e22\u0e27 1 = \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07 \u0e40\u0e23\u0e32\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e35\u0e22\u0e01\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32\u0e40\u0e25\u0e22\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e42\u0e04\u0e49\u0e14\u0e2d\u0e48\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22 <\/li>\n\n\n\n<li><strong>unsigned long previousMillis<\/strong> \u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 unsigned long \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19 \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e04\u0e48\u0e32 millis() \u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46 \u0e08\u0e19\u0e21\u0e35\u0e04\u0e48\u0e32\u0e21\u0e2b\u0e32\u0e28\u0e32\u0e25 (\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13 50 \u0e27\u0e31\u0e19\u0e16\u0e36\u0e07\u0e08\u0e30\u0e27\u0e19\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e28\u0e39\u0e19\u0e22\u0e4c) \u0e2b\u0e32\u0e01\u0e43\u0e0a\u0e49 int \u0e08\u0e30\u0e40\u0e01\u0e34\u0e14\u0e1b\u0e31\u0e0d\u0e2b\u0e32 Variable Overflow<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e40\u0e27\u0e25\u0e32\u0e14\u0e49\u0e27\u0e22 <\/strong><strong>millis()<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>currentMillis &#8211; previousMillis &gt;= interval<\/strong> \u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32<strong>\u0e40\u0e27\u0e25\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19<\/strong>\u0e25\u0e1a<strong>\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e44\u0e27\u0e49\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14<\/strong> \u0e16\u0e36\u0e07\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e31\u0e07 \u0e16\u0e49\u0e32\u0e16\u0e36\u0e07\u0e41\u0e25\u0e49\u0e27\u0e04\u0e48\u0e2d\u0e22\u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e17\u0e33\u0e07\u0e32\u0e19 \u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e17\u0e33\u0e43\u0e2b\u0e49 CPU \u0e17\u0e33\u0e07\u0e32\u0e19\u0e27\u0e19 loop() \u0e44\u0e14\u0e49\u0e2b\u0e25\u0e32\u0e22\u0e25\u0e49\u0e32\u0e19\u0e23\u0e2d\u0e1a\u0e15\u0e48\u0e2d\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e0a\u0e47\u0e04\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e44\u0e1b\u0e14\u0e49\u0e27\u0e22<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e48\u0e27\u0e19\u0e02\u0e2d\u0e07 <\/strong><strong>setup()<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>pinMode(BTN_PIN, INPUT_PULLUP)<\/strong> \u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 INPUT_PULLUP \u0e2b\u0e21\u0e32\u0e22\u0e16\u0e36\u0e07 \u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e20\u0e32\u0e22\u0e43\u0e19 ESP32 \u0e14\u0e36\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e02\u0e32 26 \u0e44\u0e27\u0e49\u0e17\u0e35\u0e48 <strong>HIGH<\/strong> (3.3V) \u0e40\u0e2a\u0e21\u0e2d<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e48\u0e27\u0e19\u0e02\u0e2d\u0e07 <\/strong><strong>loop() <\/strong><strong>\u0e41\u0e25\u0e30 <\/strong><strong>switch case<\/strong><\/h2>\n\n\n\n<p>\u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49 switch \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e22\u0e01\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e41\u0e15\u0e48\u0e25\u0e30\u0e2a\u0e35\u0e44\u0e1f\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e01\u0e31\u0e19\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e47\u0e14\u0e02\u0e32\u0e14<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Manual Override<\/strong> \u0e42\u0e04\u0e49\u0e14\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48\u0e40\u0e0a\u0e47\u0e04 digitalRead(BTN_PIN) == LOW \u0e16\u0e39\u0e01\u0e27\u0e32\u0e07\u0e44\u0e27\u0e49\u0e19\u0e2d\u0e01 switch \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e21\u0e31\u0e19\u0e15\u0e23\u0e27\u0e08\u0e08\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32 (Real-time) \u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e44\u0e1f\u0e15\u0e2d\u0e19\u0e19\u0e31\u0e49\u0e19\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e35\u0e2d\u0e30\u0e44\u0e23\u0e01\u0e47\u0e15\u0e32\u0e21 \u0e2b\u0e32\u0e01\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e1b\u0e38\u0e4a\u0e1a currentState \u0e08\u0e30\u0e16\u0e39\u0e01\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19 RED \u0e17\u0e31\u0e19\u0e17\u0e35<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e40\u0e2a\u0e23\u0e34\u0e21 <\/strong><strong>updateLEDs()<\/strong><\/h2>\n\n\n\n<p>\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19 digitalWrite 3 \u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e17\u0e38\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e35\u0e44\u0e1f \u0e40\u0e23\u0e32\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e23\u0e31\u0e1a\u0e04\u0e48\u0e32 HIGH\/LOW 3 \u0e04\u0e48\u0e32\u0e23\u0e27\u0e14\u0e40\u0e14\u0e35\u0e22\u0e27<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0e0a\u0e48\u0e27\u0e22\u0e43\u0e2b\u0e49\u0e42\u0e04\u0e49\u0e14\u0e2a\u0e30\u0e2d\u0e32\u0e14\u0e02\u0e36\u0e49\u0e19 \u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e0b\u0e49\u0e33\u0e0b\u0e49\u0e2d\u0e19 \u0e41\u0e25\u0e30\u0e25\u0e14\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e40\u0e27\u0e25\u0e32\u0e40\u0e23\u0e32\u0e41\u0e01\u0e49\u0e02\u0e32\u0e44\u0e1f<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-luminous-vivid-orange-background-color has-background has-large-font-size\">Lab 5.1 \u0e01\u0e32\u0e23\u0e2b\u0e19\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22\u0e43\u0e19\u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e23\u0e32\u0e08\u0e23 (Safety Delay Design)<\/h1>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udca1<\/strong><strong> \u0e41\u0e19\u0e27\u0e04\u0e34\u0e14\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e15\u0e23\u0e23\u0e01\u0e30 (Logic Change)<\/strong><\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19<\/strong> \u0e01\u0e48\u0e2d\u0e19\u0e08\u0e30\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e44\u0e1f \u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e0a\u0e47\u0e04\u0e01\u0e48\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19<strong>\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27<\/strong>\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48<\/li>\n\n\n\n<li><strong>\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22<\/strong> \u0e2b\u0e32\u0e01\u0e21\u0e35\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e02\u0e13\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27 \u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 currentState \u0e40\u0e1b\u0e47\u0e19 YELLOW \u0e41\u0e17\u0e19 RED<\/li>\n\n\n\n<li><strong>\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e40\u0e27\u0e25\u0e32<\/strong> \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e40\u0e27\u0e25\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e43\u0e2b\u0e21\u0e48 (previousMillis = currentMillis) \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e15\u0e34\u0e14\u0e04\u0e49\u0e32\u0e07\u0e15\u0e32\u0e21\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49 \u0e01\u0e48\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e15\u0e32\u0e21\u0e27\u0e07\u0e08\u0e23\u0e1b\u0e01\u0e15\u0e34<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u2328\ufe0f <\/strong><strong>\u0e42\u0e04\u0e49\u0e14\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e41\u0e01\u0e49\u0e44\u0e02 (Snippet)<\/strong><\/h2>\n\n\n\n<p>\u0e43\u0e2b\u0e49\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e2a\u0e48\u0e27\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1b\u0e38\u0e48\u0e21 (Manual Override) \u0e43\u0e19 loop() \u0e41\u0e25\u0e49\u0e27\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  \/\/ \u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 (Manual Override)\n  if (digitalRead(BTN_PIN) == LOW) {\n    delay(50); \/\/ Debounce \u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e13\u0e23\u0e1a\u0e01\u0e27\u0e19\n    if (digitalRead(BTN_PIN) == LOW) {\n      \n      \/\/ \u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e43\u0e2b\u0e21\u0e48 \u0e16\u0e49\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e04\u0e37\u0e2d\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27 \u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e01\u0e48\u0e2d\u0e19\n      if (currentState == GREEN) {\n        Serial.println(\"Button Pressed Changing GREEN to YELLOW...\");\n        currentState = YELLOW;\n        previousMillis = currentMillis; \/\/ \u0e40\u0e23\u0e34\u0e48\u0e21\u0e19\u0e31\u0e1a\u0e40\u0e27\u0e25\u0e32\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48\n      } \n      \/\/ \u0e16\u0e49\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23 \u0e43\u0e2b\u0e49\u0e23\u0e30\u0e1a\u0e1a\u0e23\u0e31\u0e19\u0e15\u0e32\u0e21\u0e40\u0e27\u0e25\u0e32\u0e1b\u0e01\u0e15\u0e34\n    }\n  }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udcca <\/strong><strong>\u0e41\u0e1c\u0e19\u0e20\u0e32\u0e1e\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e43\u0e2b\u0e21\u0e48 (State Machine Diagram)<\/strong><\/h2>\n\n\n\n<p>\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07 \u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e08\u0e30\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e44\u0e1b\u0e14\u0e31\u0e07\u0e19\u0e35\u0e49<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-1024x559.png\" alt=\"\" class=\"wp-image-1536\" style=\"width:672px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-1024x559.png 1024w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-300x164.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-768x419.png 768w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-1536x838.png 1536w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_usnpiiusnpiiusnp-2048x1117.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Normal Flow<\/strong> : Green (5s) -&gt; Yellow (2s) -&gt; Red (5s) -&gt; Loop<\/li>\n\n\n\n<li><strong>Manual Flow<\/strong> : Green -&gt; <strong>[Button Pressed]<\/strong> -&gt; Yellow (2s) -&gt; Red (5s) -&gt; Loop<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udcda <\/strong><strong>\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e17\u0e32\u0e07\u0e14\u0e49\u0e32\u0e19\u0e04\u0e27\u0e32\u0e21\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22<\/strong> \u0e43\u0e19\u0e0a\u0e35\u0e27\u0e34\u0e15\u0e08\u0e23\u0e34\u0e07 \u0e2b\u0e32\u0e01\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27\u0e41\u0e25\u0e49\u0e27\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e41\u0e14\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35 \u0e23\u0e16\u0e17\u0e35\u0e48\u0e27\u0e34\u0e48\u0e07\u0e21\u0e32\u0e14\u0e49\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27\u0e08\u0e30\u0e40\u0e1a\u0e23\u0e01\u0e44\u0e21\u0e48\u0e17\u0e31\u0e19\u0e41\u0e25\u0e30\u0e40\u0e01\u0e34\u0e14\u0e2d\u0e38\u0e1a\u0e31\u0e15\u0e34\u0e40\u0e2b\u0e15\u0e38 \u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14\u0e43\u0e2b\u0e49\u0e1c\u0e48\u0e32\u0e19 YELLOW \u0e01\u0e48\u0e2d\u0e19\u0e08\u0e36\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e40\u0e25\u0e35\u0e22\u0e19\u0e41\u0e1a\u0e1a\u0e23\u0e30\u0e1a\u0e1a Safety \u0e43\u0e19\u0e07\u0e32\u0e19\u0e27\u0e34\u0e28\u0e27\u0e01\u0e23\u0e23\u0e21\u0e08\u0e23\u0e34\u0e07<\/li>\n\n\n\n<li><strong>Sequential Logic<\/strong> \u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e21\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e49\u0e2d\u0e07<strong>\u0e02\u0e49\u0e32\u0e21\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19<\/strong>\u0e40\u0e2a\u0e21\u0e2d\u0e44\u0e1b \u0e41\u0e15\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16<strong>\u0e40\u0e23\u0e48\u0e07\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19<\/strong>\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e16\u0e31\u0e14\u0e44\u0e1b\u0e44\u0e14\u0e49<\/li>\n\n\n\n<li><strong>State Interaction<\/strong> \u0e42\u0e04\u0e49\u0e14\u0e19\u0e35\u0e49\u0e41\u0e2a\u0e14\u0e07\u0e43\u0e2b\u0e49\u0e40\u0e2b\u0e47\u0e19\u0e27\u0e48\u0e32 Input (\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14) \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e21\u0e35\u0e1b\u0e0f\u0e34\u0e01\u0e34\u0e23\u0e34\u0e22\u0e32\u0e01\u0e31\u0e1a\u0e2a\u0e16\u0e32\u0e19\u0e30 (State) \u0e17\u0e35\u0e48\u0e41\u0e15\u0e01\u0e15\u0e48\u0e32\u0e07\u0e01\u0e31\u0e19\u0e44\u0e14\u0e49 \u0e40\u0e0a\u0e48\u0e19 \u0e16\u0e49\u0e32\u0e01\u0e14\u0e15\u0e2d\u0e19\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e08\u0e30\u0e44\u0e21\u0e48\u0e21\u0e35\u0e1c\u0e25\u0e2d\u0e30\u0e44\u0e23 \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e01\u0e14\u0e15\u0e2d\u0e19\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27\u0e08\u0e30\u0e21\u0e35\u0e1c\u0e25\u0e17\u0e31\u0e19\u0e17\u0e35 \u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e17\u0e35\u0e48\u0e0b\u0e31\u0e1a\u0e0b\u0e49\u0e2d\u0e19\u0e02\u0e36\u0e49\u0e19\u0e2d\u0e35\u0e01\u0e23\u0e30\u0e14\u0e31\u0e1a<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-luminous-vivid-orange-background-color has-background has-large-font-size\">Lab 5.2 \u0e40\u0e25\u0e02\u0e19\u0e31\u0e1a\u0e16\u0e2d\u0e22\u0e2b\u0e25\u0e31\u0e07 (Countdown Timer) \u0e1a\u0e19\u0e08\u0e2d OLED<\/h1>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-1024x559.png\" alt=\"\" class=\"wp-image-1549\" style=\"aspect-ratio:1.8319510923652906;width:676px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-1024x559.png 1024w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-300x164.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-768x419.png 768w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-1536x838.png 1536w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_l1lb62l1lb62l1lb-2048x1117.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udcd8<\/strong><strong> \u0e41\u0e19\u0e27\u0e04\u0e34\u0e14\u0e01\u0e32\u0e23\u0e04\u0e33\u0e19\u0e27\u0e13\u0e40\u0e27\u0e25\u0e32\u0e19\u0e31\u0e1a\u0e16\u0e2d\u0e22\u0e2b\u0e25\u0e31\u0e07 (Countdown Logic)<\/strong><\/h2>\n\n\n\n<p>\u0e43\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 millis() \u0e40\u0e23\u0e32\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e19\u0e31\u0e1a\u0e16\u0e2d\u0e22\u0e2b\u0e25\u0e31\u0e07\u0e42\u0e14\u0e22\u0e15\u0e23\u0e07 \u0e41\u0e15\u0e48\u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49\u0e27\u0e34\u0e18\u0e35<strong> \u0e40\u0e2d\u0e32\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14 \u0e25\u0e1a\u0e14\u0e49\u0e27\u0e22 \u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b\u0e41\u0e25\u0e49\u0e27<\/strong> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2b\u0e32\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e2d\u0e22\u0e39\u0e48<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e39\u0e15\u0e23\u0e01\u0e32\u0e23\u0e04\u0e33\u0e19\u0e27\u0e13<\/strong><strong><\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"271\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-8.png\" alt=\"\" class=\"wp-image-1541\" style=\"aspect-ratio:3.5981439516564153;width:767px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-8.png 975w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-8-300x83.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-8-768x213.png 768w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udccd \u0e15\u0e32\u0e23\u0e32\u0e07\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e32\u0e22<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e02\u0e32\u0e02\u0e2d\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e02\u0e32\u0e1a\u0e19 <\/strong><strong>ESP32<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38<\/strong><\/td><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>OLED<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">GND<\/td><td class=\"has-text-align-center\" data-align=\"center\">GND<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e2a\u0e32\u0e22\u0e01\u0e23\u0e32\u0e27\u0e14\u0e4c\u0e23\u0e48\u0e27\u0e21<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">VCC<\/td><td class=\"has-text-align-center\" data-align=\"center\">3.3V<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e2b\u0e49\u0e32\u0e21\u0e15\u0e48\u0e2d 5V \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e08\u0e2d\u0e2d\u0e32\u0e08\u0e44\u0e2b\u0e21\u0e49<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">SCL<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 22<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e13\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 I2C<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">SDA<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 21<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e13\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 I2C<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED <\/strong><strong>\u0e41\u0e14\u0e07<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e1a\u0e27\u0e01 (Long Leg)<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 12<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED <\/strong><strong>\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e1a\u0e27\u0e01 (Long Leg)<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 14<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>LED <\/strong><strong>\u0e40\u0e02\u0e35\u0e22\u0e27<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e1a\u0e27\u0e01 (Long Leg)<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 27<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e15\u0e48\u0e2d\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e31\u0e27\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Switch<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e17\u0e35\u0e48 1<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>GPIO 26<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e23\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 Manual<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e02\u0e32\u0e17\u0e35\u0e48 2<\/td><td class=\"has-text-align-center\" data-align=\"center\">GND<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e08\u0e30\u0e14\u0e36\u0e07\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e13\u0e25\u0e07 Ground<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u2328\ufe0f <\/strong><strong>\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e42\u0e04\u0e49\u0e14 Lab 5 + OLED Countdown<\/strong><\/h2>\n\n\n\n<p>\u0e40\u0e23\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49 Library <strong>Adafruit_SSD1306<\/strong> \u0e43\u0e19\u0e01\u0e32\u0e23\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e08\u0e2d \u0e41\u0e25\u0e30\u0e1b\u0e23\u0e31\u0e1a\u0e15\u0e23\u0e23\u0e01\u0e30\u0e43\u0e19 <strong>switch-case<\/strong> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e33\u0e19\u0e27\u0e13\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e01\u0e48\u0e2d\u0e19\u0e2a\u0e48\u0e07\u0e44\u0e1b\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e42\u0e04\u0e49\u0e14\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Wire.h>\n#include &lt;Adafruit_GFX.h>\n#include &lt;Adafruit_SSD1306.h>\n\n#define SCREEN_WIDTH 128\n#define SCREEN_HEIGHT 64\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, -1);\n\nconst int LED_R = 12, LED_Y = 14, LED_G = 27, BTN_PIN = 26;\n\nenum TrafficState { GREEN, YELLOW, RED };\nTrafficState currentState = GREEN;\n\nunsigned long previousMillis = 0;\nconst long intervalGreen = 10000; \/\/ 10 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\nconst long intervalYellow = 3000; \/\/ 3 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\nconst long intervalRed = 10000;   \/\/ 10 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\n\nvoid setup() {\n  Serial.begin(115200);\n  pinMode(LED_R, OUTPUT); pinMode(LED_Y, OUTPUT); pinMode(LED_G, OUTPUT);\n  pinMode(BTN_PIN, INPUT_PULLUP);\n\n  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { \n    Serial.println(\"OLED failed\"); \n    for(;;); \n  }\n  display.clearDisplay();\n}\n\nvoid loop() {\n  unsigned long currentMillis = millis();\n  long remainingTime = 0; \/\/ \u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e40\u0e01\u0e47\u0e1a\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e25\u0e37\u0e2d\n\n  \/\/ --- \u0e2a\u0e48\u0e27\u0e19\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14 (Manual Override) ---\n  if (digitalRead(BTN_PIN) == LOW) {\n    if (currentState == GREEN) {\n      currentState = YELLOW;\n      previousMillis = currentMillis;\n    }\n  }\n\n  \/\/ --- \u0e2a\u0e48\u0e27\u0e19 State Machine \u0e41\u0e25\u0e30\u0e04\u0e33\u0e19\u0e27\u0e13\u0e40\u0e27\u0e25\u0e32 ---\n  switch (currentState) {\n    case GREEN:\n      updateLEDs(LOW, LOW, HIGH);\n      remainingTime = (intervalGreen - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalGreen) {\n        currentState = YELLOW;\n        previousMillis = currentMillis;\n      }\n      showDisplay(\"GO!\", remainingTime, SSD1306_WHITE);\n      break;\n\n    case YELLOW:\n      updateLEDs(LOW, HIGH, LOW);\n      remainingTime = (intervalYellow - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalYellow) {\n        currentState = RED;\n        previousMillis = currentMillis;\n      }\n      showDisplay(\"WAIT\", remainingTime, SSD1306_WHITE);\n      break;\n\n    case RED:\n      updateLEDs(HIGH, LOW, LOW);\n      remainingTime = (intervalRed - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalRed) {\n        currentState = GREEN;\n        previousMillis = currentMillis;\n      }\n      showDisplay(\"STOP\", remainingTime, SSD1306_WHITE);\n      break;\n  }\n}\n\n\/\/ \u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d\nvoid showDisplay(String status, int seconds, int color) {\n  display.clearDisplay();\n  \n  \/\/ \u0e41\u0e2a\u0e14\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\n  display.setTextSize(2);\n  display.setTextColor(SSD1306_WHITE);\n  display.setCursor(35, 5);\n  display.println(status);\n  \n  \/\/ \u0e41\u0e2a\u0e14\u0e07\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e16\u0e2d\u0e22\u0e2b\u0e25\u0e31\u0e07\u0e02\u0e19\u0e32\u0e14\u0e43\u0e2b\u0e0d\u0e48\n  display.setTextSize(4);\n  display.setCursor(45, 30);\n  if(seconds &lt; 0) seconds = 0; \/\/ \u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e40\u0e25\u0e02\u0e15\u0e34\u0e14\u0e25\u0e1a\u0e15\u0e2d\u0e19\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30\n  display.println(seconds);\n  \n  display.display();\n}\n\nvoid updateLEDs(int r, int y, int g) {\n  digitalWrite(LED_R, r); digitalWrite(LED_Y, y); digitalWrite(LED_G, g);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udd0d \u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e48\u0e27\u0e19\u0e40\u0e2a\u0e23\u0e34\u0e21<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e40\u0e25\u0e02\u0e15\u0e34\u0e14\u0e25\u0e1a<\/strong><\/h3>\n\n\n\n<p>\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e43\u0e19\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 showDisplay \u0e08\u0e30\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e47\u0e04 if(seconds &lt; 0) seconds = 0; \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e43\u0e19\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e17\u0e35\u0e48\u0e40\u0e27\u0e25\u0e32\u0e04\u0e32\u0e1a\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30 \u0e04\u0e48\u0e32\u0e04\u0e33\u0e19\u0e27\u0e13\u0e2d\u0e32\u0e08\u0e15\u0e34\u0e14\u0e25\u0e1a\u0e44\u0e14\u0e49\u0e40\u0e25\u0e47\u0e01\u0e19\u0e49\u0e2d\u0e22 \u0e40\u0e0a\u0e48\u0e19 -0.001 \u0e01\u0e32\u0e23\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e44\u0e27\u0e49\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e1a\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d\u0e44\u0e21\u0e48\u0e01\u0e23\u0e30\u0e42\u0e14\u0e14\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e41\u0e1b\u0e25\u0e01\u0e46<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e27\u0e32\u0e07 Layout \u0e1a\u0e19 OLED<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>setTextSize(2)<\/strong> \u0e43\u0e0a\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e16\u0e32\u0e19\u0e30 GO WAIT STOP \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e2d\u0e48\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22<\/li>\n\n\n\n<li><strong>setTextSize(4)<\/strong> \u0e43\u0e0a\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e40\u0e14\u0e48\u0e19\u0e0a\u0e31\u0e14\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23\u0e08\u0e23\u0e34\u0e07<\/li>\n\n\n\n<li><strong>setCursor(x, y)<\/strong> \u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e1d\u0e36\u0e01\u0e01\u0e32\u0e23\u0e01\u0e30\u0e23\u0e30\u0e22\u0e30 (Coordinate) \u0e42\u0e14\u0e22\u0e17\u0e35\u0e48 x \u0e04\u0e37\u0e2d\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19 (0-127) \u0e41\u0e25\u0e30 y \u0e04\u0e37\u0e2d\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07 (0-63)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e02\u0e2d\u0e07\u0e42\u0e04\u0e49\u0e14<\/strong><\/h3>\n\n\n\n<p>\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e08\u0e32\u0e01\u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49 millis() \u0e42\u0e04\u0e49\u0e14\u0e08\u0e30\u0e27\u0e19 loop() \u0e40\u0e23\u0e47\u0e27\u0e21\u0e32\u0e01 \u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d OLED \u0e08\u0e30\u0e16\u0e39\u0e01\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32 \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e44\u0e1b\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e25\u0e37\u0e48\u0e19\u0e44\u0e2b\u0e25 (Real-time)<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83c\udfaf \u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e0a\u0e47\u0e04\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e32\u0e43\u0e08<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e27\u0e25\u0e32\u0e41\u0e2a\u0e14\u0e07\u0e44\u0e1f\u0e41\u0e15\u0e48\u0e25\u0e30\u0e2a\u0e35<\/li>\n\n\n\n<li>\u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e1a\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d OLED<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-luminous-vivid-orange-background-color has-background has-large-font-size\">Lab 5.3 <strong>\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e19\u0e15\u0e32\u0e1a\u0e2d\u0e14<\/strong> \u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49\u0e40\u0e17\u0e04\u0e19\u0e34\u0e04\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e23\u0e40\u0e2d\u0e32\u0e40\u0e28\u0e29 (Modulo)<\/h1>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-1024x559.png\" alt=\"\" class=\"wp-image-1574\" style=\"aspect-ratio:1.8318763601490171;width:800px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-1024x559.png 1024w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-300x164.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-768x419.png 768w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-1536x838.png 1536w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_ubfnhsubfnhsubfn-2048x1117.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udd0c \u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e27\u0e07\u0e08\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21 (Hardware)<\/h2>\n\n\n\n<p>\u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e25\u0e33\u0e42\u0e1e\u0e07\u0e41\u0e1a\u0e1a\u0e21\u0e35\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e43\u0e19\u0e15\u0e31\u0e27 (Active Buzzer) \u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19\u0e27\u0e07\u0e08\u0e23<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0e02\u0e32\u0e1a\u0e27\u0e01 (VCC\/Signal)<\/strong> \u0e15\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a <strong>GPIO 25<\/strong><\/li>\n\n\n\n<li><strong>\u0e02\u0e32\u0e25\u0e1a (GND)<\/strong> \u0e15\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a <strong>GND<\/strong> \u0e23\u0e48\u0e27\u0e21\u0e02\u0e2d\u0e07\u0e1a\u0e2d\u0e23\u0e4c\u0e14<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udcbb \u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e41\u0e25\u0e30\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e01\u0e49<\/h2>\n\n\n\n<p><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 1 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e02\u0e32 Buzzer \u0e44\u0e27\u0e49\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19\u0e2a\u0e38\u0e14\u0e02\u0e2d\u0e07\u0e42\u0e04\u0e49\u0e14<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const int LED_R = 12, LED_Y = 14, LED_G = 27, BTN_PIN = 26;\nconst int BUZZER_PIN = 25; \/\/ \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e32 Buzzer<\/code><\/pre>\n\n\n\n<p><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 2 \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 pinMode \u0e43\u0e19 <\/strong><code><strong>void setup()<\/strong><\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n  \/\/ ... (\u0e42\u0e04\u0e49\u0e14\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32) ...\n  pinMode(BUZZER_PIN, OUTPUT);\n  digitalWrite(BUZZER_PIN, LOW); \/\/ \u0e2a\u0e31\u0e48\u0e07\u0e1b\u0e34\u0e14\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19\u0e15\u0e2d\u0e19\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\n}<\/code><\/pre>\n\n\n\n<p><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 3 \u0e2d\u0e31\u0e1b\u0e40\u0e01\u0e23\u0e14\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e44\u0e1f\u0e41\u0e14\u0e07 <\/strong><code><strong>case RED<\/strong><\/code><strong> <\/strong><strong>\u0e43\u0e19 <\/strong><code><strong>void loop()<\/strong><\/code><\/p>\n\n\n\n<p>\u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e25\u0e1a\u0e42\u0e04\u0e49\u0e14\u0e43\u0e19 <code>case RED<\/code> \u0e40\u0e14\u0e34\u0e21\u0e2d\u0e2d\u0e01 \u0e41\u0e25\u0e49\u0e27\u0e40\u0e2d\u0e32\u0e0a\u0e38\u0e14\u0e19\u0e35\u0e49\u0e44\u0e1b\u0e27\u0e32\u0e07\u0e41\u0e17\u0e19<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>case RED:\n      updateLEDs(HIGH, LOW, LOW);\n      remainingTime = (intervalRed - (currentMillis - previousMillis)) \/ 1000;\n\n      \/\/ ---------------------------------------------------\n      \/\/ \ud83c\udf1f \u0e42\u0e04\u0e49\u0e14\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32: \u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e19\u0e02\u0e49\u0e32\u0e21\u0e16\u0e19\u0e19\n      \/\/ ---------------------------------------------------\n      if (remainingTime > 3) {\n        \/\/ \u0e0a\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e1b\u0e01\u0e15\u0e34 (\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 3 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35): \u0e14\u0e31\u0e07\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e0a\u0e49\u0e32\u0e46 \u0e17\u0e38\u0e01\u0e46 \u0e04\u0e23\u0e36\u0e48\u0e07\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\n        if ((currentMillis \/ 500) % 2 == 0) {\n          digitalWrite(BUZZER_PIN, HIGH);\n        } else {\n          digitalWrite(BUZZER_PIN, LOW);\n        }\n      } else {\n        \/\/ \u0e0a\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e40\u0e23\u0e48\u0e07\u0e14\u0e48\u0e27\u0e19 \u0e40\u0e2b\u0e25\u0e37\u0e2d 3 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22 \u0e14\u0e31\u0e07\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e40\u0e23\u0e47\u0e27\u0e46 \u0e17\u0e38\u0e01\u0e46 0.15 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\n        if ((currentMillis \/ 150) % 2 == 0) {\n          digitalWrite(BUZZER_PIN, HIGH);\n        } else {\n          digitalWrite(BUZZER_PIN, LOW);\n        }\n      }\n      \/\/ ---------------------------------------------------\n\n      \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32\u0e2b\u0e21\u0e14\u0e40\u0e27\u0e25\u0e32\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e31\u0e07?\n      if (currentMillis - previousMillis >= intervalRed) {\n        currentState = GREEN;\n        previousMillis = currentMillis;\n        digitalWrite(BUZZER_PIN, LOW); \/\/ \u0e1b\u0e34\u0e14\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35\u0e17\u0e35\u0e48\u0e44\u0e1f\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e35\u0e40\u0e02\u0e35\u0e22\u0e27\n      }\n      \n      showDisplay(\"STOP\", remainingTime, SSD1306_WHITE);\n      break;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83e\udde0 \u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e40\u0e2a\u0e35\u0e22\u0e07\u0e01\u0e30\u0e1e\u0e23\u0e34\u0e1a<\/h2>\n\n\n\n<p><code><strong>if ((currentMillis \/ 500) % 2 == 0)<\/strong><\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>currentMillis<\/code> \u0e04\u0e37\u0e2d \u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e27\u0e34\u0e48\u0e07\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e44\u0e21\u0e48\u0e21\u0e35\u0e27\u0e31\u0e19\u0e2b\u0e22\u0e38\u0e14 \u0e40\u0e0a\u0e48\u0e19 1000 1001 1002&#8230;<\/li>\n\n\n\n<li>\u0e1e\u0e2d\u0e40\u0e23\u0e32\u0e40\u0e2d\u0e32\u0e21\u0e32\u0e2b\u0e32\u0e23 <code>\/ 500<\/code> \u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e21\u0e31\u0e19\u0e08\u0e30\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e40\u0e15\u0e1b\u0e17\u0e38\u0e01\u0e46\u0e04\u0e23\u0e36\u0e48\u0e07\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35<\/li>\n\n\n\n<li>\u0e1e\u0e2d\u0e40\u0e23\u0e32\u0e40\u0e2d\u0e32\u0e21\u0e32 <strong>\u0e2b\u0e32\u0e23\u0e40\u0e2d\u0e32\u0e40\u0e28\u0e29 <\/strong><code><strong>% 2<\/strong><\/code> (Modulo 2) \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e30\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e41\u0e04\u0e48 <strong>0 \u0e01\u0e31\u0e1a 1 \u0e2a\u0e25\u0e31\u0e1a\u0e01\u0e31\u0e19\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46<\/strong> \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c\u0e41\u0e1a\u0e1a<\/li>\n<\/ul>\n\n\n\n<p>\u0e40\u0e23\u0e32\u0e40\u0e25\u0e22\u0e40\u0e2d\u0e32\u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02\u0e19\u0e35\u0e49\u0e21\u0e32\u0e2a\u0e31\u0e48\u0e07 <code>HIGH<\/code> (\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e2a\u0e35\u0e22\u0e07) \u0e41\u0e25\u0e30 <code>LOW<\/code> (\u0e1b\u0e34\u0e14\u0e40\u0e2a\u0e35\u0e22\u0e07) \u0e44\u0e14\u0e49\u0e40\u0e25\u0e22 \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e1e\u0e36\u0e48\u0e07\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 <code>delay()<\/code> \u0e41\u0e21\u0e49\u0e41\u0e15\u0e48\u0e19\u0e34\u0e14\u0e40\u0e14\u0e35\u0e22\u0e27<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-ast-global-color-7-background-color has-background has-large-font-size\">\u0e23\u0e39\u0e49\u0e08\u0e31\u0e01\u0e01\u0e31\u0e1a Modulo (%) \u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e41\u0e2b\u0e48\u0e07\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e23\u0e40\u0e2d\u0e32\u0e40\u0e28\u0e29<\/h1>\n\n\n\n<p><strong>Modulo (<code>%<\/code>) \u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 \u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e1b\u0e2d\u0e23\u0e4c\u0e40\u0e0b\u0e47\u0e19\u0e15\u0e4c<\/strong> \u0e41\u0e15\u0e48\u0e21\u0e31\u0e19\u0e04\u0e37\u0e2d\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e17\u0e35\u0e48\u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c <strong>\u0e2b\u0e32\u0e23\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e2d\u0e32\u0e40\u0e28\u0e29<\/strong> (\u0e2a\u0e19\u0e43\u0e08\u0e41\u0e04\u0e48\u0e27\u0e48\u0e32\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e40\u0e28\u0e29\u0e40\u0e17\u0e48\u0e32\u0e44\u0e2b\u0e23\u0e48)<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83c\udf55 <strong>\u0e08\u0e33\u0e07\u0e48\u0e32\u0e22\u0e46 \u0e14\u0e49\u0e27\u0e22\u0e17\u0e24\u0e29\u0e0e\u0e35\u0e1e\u0e34\u0e0b\u0e0b\u0e48\u0e32<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>10 % 3 = 1<\/code> \u0e1e\u0e34\u0e0b\u0e0b\u0e48\u0e32 10 \u0e0a\u0e34\u0e49\u0e19 \u0e41\u0e1a\u0e48\u0e07\u0e43\u0e2b\u0e49 3 \u0e04\u0e19&#8230; \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e40\u0e28\u0e29 <strong>1<\/strong> \u0e0a\u0e34\u0e49\u0e19<\/li>\n\n\n\n<li><code>10 % 2 = 0<\/code> \u0e1e\u0e34\u0e0b\u0e0b\u0e48\u0e32 10 \u0e0a\u0e34\u0e49\u0e19 \u0e41\u0e1a\u0e48\u0e07 2 \u0e04\u0e19 \u0e25\u0e07\u0e15\u0e31\u0e27\u0e1e\u0e2d\u0e14\u0e35\u0e40\u0e1b\u0e4a\u0e30&#8230; \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e40\u0e28\u0e29 <strong>0<\/strong> \u0e0a\u0e34\u0e49\u0e19<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83e\ude84 2 \u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e21\u0e2d\u0e23\u0e4c\u0e43\u0e0a\u0e49\u0e1a\u0e48\u0e2d\u0e22<\/h2>\n\n\n\n<p><strong>1. \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2a\u0e27\u0e34\u0e15\u0e0a\u0e4c\u0e40\u0e1b\u0e34\u0e14-\u0e1b\u0e34\u0e14\u0e2a\u0e25\u0e31\u0e1a\u0e01\u0e31\u0e19 (\u0e43\u0e0a\u0e49 <code>% 2<\/code>)<\/strong> \u0e08\u0e33\u0e01\u0e0e\u0e44\u0e27\u0e49\u0e27\u0e48\u0e32 <strong>\u0e2d\u0e30\u0e44\u0e23\u0e01\u0e47\u0e15\u0e32\u0e21\u0e17\u0e35\u0e48\u0e40\u0e2d\u0e32\u0e21\u0e32 <code>% 2<\/code> \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e08\u0e30\u0e21\u0e35\u0e41\u0e04\u0e48 0 \u0e01\u0e31\u0e1a 1 \u0e2a\u0e25\u0e31\u0e1a\u0e01\u0e31\u0e19<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0e40\u0e25\u0e02\u0e04\u0e39\u0e48 <code>% 2<\/code> = 0<\/li>\n\n\n\n<li>\u0e40\u0e25\u0e02\u0e04\u0e35\u0e48 <code>% 2<\/code> = 1<\/li>\n\n\n\n<li><strong>\u0e19\u0e33\u0e44\u0e1b\u0e43\u0e0a\u0e49\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23<\/strong> \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e2d\u0e32\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e27\u0e34\u0e48\u0e07\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46\u0e21\u0e32 <code>% 2<\/code> \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e08\u0e30\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e40\u0e1b\u0e47\u0e19 <code>0, 1, 0, 1, 0, 1...<\/code> \u0e2a\u0e25\u0e31\u0e1a\u0e01\u0e31\u0e19\u0e44\u0e1b\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e22\u0e46 \u0e19\u0e33\u0e44\u0e1b\u0e43\u0e0a\u0e49\u0e17\u0e33\u0e44\u0e1f\u0e01\u0e30\u0e1e\u0e23\u0e34\u0e1a\u0e2b\u0e23\u0e37\u0e2d\u0e25\u0e33\u0e42\u0e1e\u0e07\u0e14\u0e31\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e44\u0e14\u0e49<\/li>\n<\/ul>\n\n\n\n<p><strong>2. \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2d\u0e32\u0e13\u0e32\u0e40\u0e02\u0e15\u0e27\u0e19\u0e25\u0e39\u0e1b (\u0e43\u0e0a\u0e49 <code>% \u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23<\/code>)<\/strong> \u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e08\u0e33\u0e01\u0e31\u0e14\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e27\u0e34\u0e48\u0e07\u0e17\u0e30\u0e25\u0e38\u0e02\u0e2d\u0e1a\u0e40\u0e02\u0e15\u0e17\u0e35\u0e48\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49 \u0e1e\u0e2d\u0e16\u0e36\u0e07\u0e22\u0e2d\u0e14\u0e1b\u0e38\u0e4a\u0e1a\u0e08\u0e30\u0e42\u0e14\u0e19\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e43\u0e2b\u0e21\u0e48\u0e17\u0e31\u0e19\u0e17\u0e35<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0e2a\u0e21\u0e21\u0e15\u0e34\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e31\u0e1a\u0e04\u0e34\u0e27\u0e43\u0e0a\u0e49 <code>% 4<\/code> \u27a1\ufe0f \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e08\u0e30\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e40\u0e1b\u0e47\u0e19 <code>1, 2, 3, 0, 1, 2, 3, 0...<\/code><\/li>\n\n\n\n<li><strong>\u0e19\u0e33\u0e44\u0e1b\u0e43\u0e0a\u0e49\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23<\/strong> \u0e43\u0e0a\u0e49\u0e17\u0e33\u0e23\u0e30\u0e1a\u0e1a\u0e19\u0e31\u0e1a\u0e04\u0e34\u0e27 \u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e40\u0e21\u0e19\u0e39\u0e1a\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d OLED \u0e1e\u0e2d\u0e01\u0e14\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e1b\u0e08\u0e19\u0e2a\u0e38\u0e14\u0e40\u0e21\u0e19\u0e39\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22 \u0e01\u0e47\u0e43\u0e2b\u0e49\u0e40\u0e14\u0e49\u0e07\u0e27\u0e19\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e40\u0e21\u0e19\u0e39\u0e41\u0e23\u0e01\u0e2a\u0e38\u0e14\u0e42\u0e14\u0e22\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-vivid-green-cyan-background-color has-background has-large-font-size\">Project 3 Smart Traffic Light Control<\/h1>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>&nbsp;\u0e41\u0e19\u0e27\u0e04\u0e34\u0e14\u0e01\u0e32\u0e23\u0e1e\u0e31\u0e12\u0e19\u0e32 (The Logic Upgrade)<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"520\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-9.png\" alt=\"\" class=\"wp-image-1580\" style=\"width:677px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-9.png 897w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-9-300x174.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-9-768x445.png 768w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e08\u0e32\u0e01<strong> Constant \u0e40\u0e1b\u0e47\u0e19 Dynamic<\/strong> \u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e01\u0e32\u0e28\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e40\u0e27\u0e25\u0e32\u0e08\u0e32\u0e01 const long \u0e40\u0e1b\u0e47\u0e19 long \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e41\u0e01\u0e49\u0e44\u0e02\u0e04\u0e48\u0e32\u0e43\u0e19\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e02\u0e13\u0e30\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\n<ul class=\"wp-block-list\">\n<li>\u0e04\u0e33\u0e27\u0e48\u0e32 <code><strong>const<\/strong><\/code> \u0e22\u0e48\u0e2d\u0e21\u0e32\u0e08\u0e32\u0e01 <strong>Constant<\/strong> \u0e41\u0e1b\u0e25\u0e27\u0e48\u0e32 <strong>\u0e04\u0e48\u0e32\u0e04\u0e07\u0e17\u0e35\u0e48<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34<\/strong> \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e1b\u0e23\u0e30\u0e01\u0e32\u0e28 <code>const long interval = 10000;<\/code> \u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e19\u0e35\u0e49\u0e08\u0e30\u0e16\u0e39\u0e01\u0e08\u0e2d\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e44\u0e27\u0e49\u0e43\u0e19\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e41\u0e1a\u0e1a <strong>Read-only<\/strong> (\u0e2d\u0e48\u0e32\u0e19\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27)<\/li>\n\n\n\n<li><strong>\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19<\/strong> \u0e04\u0e2d\u0e21\u0e44\u0e1e\u0e40\u0e25\u0e2d\u0e23\u0e4c (Compiler) \u0e08\u0e30\u0e23\u0e39\u0e49\u0e27\u0e48\u0e32\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e21\u0e35\u0e27\u0e31\u0e19\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e15\u0e25\u0e2d\u0e14\u0e01\u0e32\u0e25\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e17\u0e33\u0e07\u0e32\u0e19<\/li>\n\n\n\n<li><strong>\u0e02\u0e49\u0e2d\u0e14\u0e35<\/strong> \u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22 \u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e01\u0e32\u0e23\u0e40\u0e1c\u0e25\u0e2d\u0e44\u0e1b\u0e40\u0e02\u0e35\u0e22\u0e19\u0e17\u0e31\u0e1a \u0e41\u0e25\u0e30\u0e1b\u0e23\u0e30\u0e2b\u0e22\u0e31\u0e14 RAM \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e1a\u0e32\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e04\u0e2d\u0e21\u0e44\u0e1e\u0e40\u0e25\u0e2d\u0e23\u0e4c\u0e08\u0e30\u0e40\u0e01\u0e47\u0e1a\u0e04\u0e48\u0e32\u0e19\u0e35\u0e49\u0e44\u0e27\u0e49\u0e43\u0e19 Flash Memory \u0e41\u0e17\u0e19<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e15\u0e31\u0e14\u0e04\u0e33\u0e27\u0e48\u0e32 <code>const<\/code> \u0e2d\u0e2d\u0e01 \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e40\u0e1e\u0e35\u0e22\u0e07 <code><strong>long interval = 10000;<\/strong><\/code>\n<ul class=\"wp-block-list\">\n<li><strong>\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34<\/strong> \u0e21\u0e31\u0e19\u0e08\u0e30\u0e01\u0e25\u0e32\u0e22\u0e40\u0e1b\u0e47\u0e19 <strong>Variable<\/strong> <strong>\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23<\/strong>\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e41\u0e17\u0e49\u0e08\u0e23\u0e34\u0e07<\/li>\n\n\n\n<li><strong>\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19<\/strong> \u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e19\u0e35\u0e49\u0e08\u0e30\u0e16\u0e39\u0e01\u0e40\u0e01\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e43\u0e19 <strong>SRAM (RAM)<\/strong> \u0e02\u0e2d\u0e07 ESP32 \u0e0b\u0e36\u0e48\u0e07\u0e21\u0e35\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 <strong>\u0e40\u0e02\u0e35\u0e22\u0e19\u0e17\u0e31\u0e1a (Overwrite)<\/strong> \u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e25\u0e07\u0e44\u0e1b\u0e44\u0e14\u0e49\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32\u0e02\u0e13\u0e30\u0e17\u0e35\u0e48\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e01\u0e33\u0e25\u0e31\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2d\u0e22\u0e39\u0e48<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>HTML Input Form<\/strong> \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e17\u0e35\u0e48\u0e21\u0e35\u0e0a\u0e48\u0e2d\u0e07\u0e01\u0e23\u0e2d\u0e01\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02 (Input Type=&#8221;number&#8221;) \u0e41\u0e25\u0e30\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 (Submit)<\/li>\n\n\n\n<li><strong>Data Parsing<\/strong> (\u0e14\u0e32\u0e15\u0e49\u0e32 \u0e1e\u0e32\u0e23\u0e4c\u0e0b\u0e34\u0e07) \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e21\u0e35\u0e01\u0e32\u0e23\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e1a\u0e19\u0e40\u0e27\u0e47\u0e1a Browser \u0e08\u0e30\u0e2a\u0e48\u0e07\u0e04\u0e48\u0e32\u0e1c\u0e48\u0e32\u0e19 URL \u0e41\u0e25\u0e49\u0e27 ESP32 \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e14\u0e36\u0e07\u0e04\u0e48\u0e32\u0e40\u0e2b\u0e25\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19\u0e21\u0e32\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e43\u0e19\u0e42\u0e04\u0e49\u0e14<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e42\u0e04\u0e49\u0e14\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 Lab 5 + OLED + Web Configuration<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;WiFi.h>\n#include &lt;WebServer.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_GFX.h>\n#include &lt;Adafruit_SSD1306.h>\n\n\/\/ --- Configuration ---\nconst char* ssid = \"YOUR_WIFI_NAME\";\nconst char* password = \"YOUR_WIFI_PASSWORD\";\n\nAdafruit_SSD1306 display(128, 64, &amp;Wire, -1);\nWebServer server(80);\n\n\/\/ \u0e02\u0e32\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\nconst int LED_R = 12, LED_Y = 14, LED_G = 27, BTN_PIN = 26;\n\n\/\/ \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19 Variable (\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48 const) \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e41\u0e01\u0e49\u0e44\u0e02\u0e44\u0e14\u0e49\nlong intervalGreen = 10000; \nlong intervalYellow = 3000;\nlong intervalRed = 10000;\n\nenum TrafficState { GREEN, YELLOW, RED };\nTrafficState currentState = GREEN;\nunsigned long previousMillis = 0;\n\n\/\/ --- Web Page Design ---\nvoid handleRoot() {\n  String html = \"&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta charset='UTF-8'>&lt;meta name='viewport' content='width=device-width, initial-scale=1'>\";\n  html += \"&lt;title>Traffic Control&lt;\/title>\";\n  html += \"&lt;style>\";\n  html += \"body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; text-align: center; padding: 20px; background-color: #f4f4f9; color: #333; }\";\n  html += \".card { background: white; padding: 30px; border-radius: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); max-width: 350px; margin: 0 auto; }\";\n  html += \"h1 { color: #2c3e50; font-size: 24px; margin-bottom: 20px; }\";\n  html += \"input&#91;type='number'] { width: 80px; padding: 8px; margin: 10px 5px; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; text-align: center; }\";\n  html += \"input&#91;type='submit'] { background: #4CAF50; color: white; border: none; padding: 12px 25px; border-radius: 8px; font-size: 16px; cursor: pointer; transition: background 0.3s; margin-top: 15px; width: 100%; font-weight: bold; }\";\n  html += \"input&#91;type='submit']:hover { background: #45a049; }\";\n  html += \".label { display: inline-block; width: 100px; text-align: right; font-weight: bold; }\";\n  html += \".g-color { color: #28a745; } .y-color { color: #ffc107; } .r-color { color: #dc3545; }\";\n  html += \"&lt;\/style>&lt;\/head>&lt;body>\";\n  \n  html += \"&lt;div class='card'>\";\n  html += \"&lt;h1>\ud83d\udea6 Traffic Panel&lt;\/h1>\";\n  html += \"&lt;form action='\/update' method='GET'>\";\n  \n  \/\/ \u0e08\u0e31\u0e14\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32 Form \u0e43\u0e2b\u0e49\u0e19\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e02\u0e36\u0e49\u0e19\n  html += \"&lt;div class='input-group'>&lt;span class='label g-color'>Green (sec): &lt;\/span>&lt;input type='number' name='g' min='1' max='99' value='\" + String(intervalGreen\/1000) + \"'>&lt;\/div>\";\n  html += \"&lt;div class='input-group'>&lt;span class='label y-color'>Yellow (sec): &lt;\/span>&lt;input type='number' name='y' min='1' max='99' value='\" + String(intervalYellow\/1000) + \"'>&lt;\/div>\";\n  html += \"&lt;div class='input-group'>&lt;span class='label r-color'>Red (sec): &lt;\/span>&lt;input type='number' name='r' min='1' max='99' value='\" + String(intervalRed\/1000) + \"'>&lt;\/div>\";\n  \n  html += \"&lt;input type='submit' value='Update Times'>\";\n  html += \"&lt;\/form>\";\n  html += \"&lt;\/div>\";\n  \n  html += \"&lt;\/body>&lt;\/html>\";\n  server.send(200, \"text\/html\", html);\n}\n\n\/\/ --- Logic Update Function ---\nvoid handleUpdate() {\n  if (server.hasArg(\"g\")) intervalGreen = server.arg(\"g\").toInt() * 1000;\n  if (server.hasArg(\"y\")) intervalYellow = server.arg(\"y\").toInt() * 1000;\n  if (server.hasArg(\"r\")) intervalRed = server.arg(\"r\").toInt() * 1000;\n  \n  \/\/ \u0e2a\u0e48\u0e07\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e01\u0e25\u0e31\u0e1a\u0e44\u0e1b\u0e2b\u0e19\u0e49\u0e32\u0e2b\u0e25\u0e31\u0e01\n  server.sendHeader(\"Location\", \"\/\");\n  server.send(303);\n  Serial.println(\"Intervals Updated!\");\n}\n\nvoid setup() {\n  Serial.begin(115200);\n  pinMode(LED_R, OUTPUT); pinMode(LED_Y, OUTPUT); pinMode(LED_G, OUTPUT);\n  pinMode(BTN_PIN, INPUT_PULLUP);\n  \n  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println(\"OLED failed\");\n\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(\".\"); }\n  \n  server.on(\"\/\", handleRoot);\n  server.on(\"\/update\", handleUpdate);\n  server.begin();\n  Serial.println(\"\\nIP \" + WiFi.localIP().toString());\n}\n\nvoid loop() {\n  server.handleClient();\n  unsigned long currentMillis = millis();\n  long remainingTime = 0;\n\n  \/\/ Manual Override\n  if (digitalRead(BTN_PIN) == LOW &amp;&amp; currentState == GREEN) {\n    currentState = YELLOW; previousMillis = currentMillis;\n  }\n\n  switch (currentState) {\n    case GREEN:\n      updateLEDs(0, 0, 1);\n      remainingTime = (intervalGreen - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalGreen) { currentState = YELLOW; previousMillis = currentMillis; }\n      showDisplay(\"GO\", remainingTime);\n      break;\n    case YELLOW:\n      updateLEDs(0, 1, 0);\n      remainingTime = (intervalYellow - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalYellow) { currentState = RED; previousMillis = currentMillis; }\n      showDisplay(\"WAIT\", remainingTime);\n      break;\n    case RED:\n      updateLEDs(1, 0, 0);\n      remainingTime = (intervalRed - (currentMillis - previousMillis)) \/ 1000;\n      if (currentMillis - previousMillis >= intervalRed) { currentState = GREEN; previousMillis = currentMillis; }\n      showDisplay(\"STOP\", remainingTime);\n      break;\n  }\n}\n\nvoid showDisplay(String status, int sec) {\n  display.clearDisplay();\n  display.setTextSize(2); display.setTextColor(1); display.setCursor(40, 0); display.println(status);\n  display.setTextSize(4); display.setCursor(45, 25); display.println(max(0, sec));\n  display.setTextSize(1); display.setCursor(0, 55); display.print(WiFi.localIP().toString());\n  display.display();\n}\n\nvoid updateLEDs(int r, int y, int g) {\n  digitalWrite(LED_R, r); digitalWrite(LED_Y, y); digitalWrite(LED_G, g);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udd0d <\/strong><strong>\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>HTTP GET Method &amp; Argument Parsing<\/strong><\/h3>\n\n\n\n<p>\u0e43\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a \u0e40\u0e23\u0e32\u0e43\u0e0a\u0e49\u0e1f\u0e2d\u0e23\u0e4c\u0e21 HTML \u0e17\u0e35\u0e48\u0e2a\u0e48\u0e07\u0e04\u0e48\u0e32\u0e41\u0e1a\u0e1a GET \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21 &#8220;Update&#8221; Browser \u0e08\u0e30\u0e2a\u0e23\u0e49\u0e32\u0e07 URL \u0e40\u0e0a\u0e48\u0e19 http\/\/192.168.1.50\/update?g=20&amp;y=5&amp;r=20<\/p>\n\n\n\n<p>\u0e43\u0e19\u0e42\u0e04\u0e49\u0e14 ESP32 \u0e2a\u0e48\u0e27\u0e19 handleUpdate() \u0e08\u0e30\u0e43\u0e0a\u0e49\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>server.hasArg(&#8220;g&#8221;) \u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32\u0e21\u0e35\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23 g \u0e2a\u0e48\u0e07\u0e21\u0e32\u0e44\u0e2b\u0e21<\/li>\n\n\n\n<li>server.arg(&#8220;g&#8221;).toInt() \u0e14\u0e36\u0e07\u0e04\u0e48\u0e32\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e41\u0e25\u0e49\u0e27\u0e41\u0e1b\u0e25\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02 (Integer)<\/li>\n\n\n\n<li>\u0e04\u0e39\u0e13 1000 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e1b\u0e25\u0e07\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e08\u0e32\u0e01\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 (\u0e17\u0e35\u0e48\u0e04\u0e19\u0e01\u0e23\u0e2d\u0e01) \u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 (\u0e17\u0e35\u0e48\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e43\u0e0a\u0e49)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07 Web Server Route<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>server.on(&#8220;\/&#8221;, handleRoot) \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 IP \u0e15\u0e23\u0e07\u0e46 \u0e08\u0e30\u0e42\u0e0a\u0e27\u0e4c\u0e2b\u0e19\u0e49\u0e32\u0e1f\u0e2d\u0e23\u0e4c\u0e21\u0e01\u0e23\u0e2d\u0e01\u0e40\u0e27\u0e25\u0e32 (\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01)<\/li>\n\n\n\n<li>server.on(&#8220;\/update&#8221;, handleUpdate) \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e14\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 \u0e08\u0e30\u0e27\u0e34\u0e48\u0e07\u0e21\u0e32\u0e17\u0e35\u0e48\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e19\u0e35\u0e49\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e33\u0e19\u0e27\u0e13\u0e41\u0e25\u0e30\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e04\u0e48\u0e32<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>UX Improvement on OLED<\/strong><\/h3>\n\n\n\n<p>\u0e43\u0e19\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 showDisplay \u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25 <strong>IP Address<\/strong> \u0e44\u0e27\u0e49\u0e17\u0e35\u0e48\u0e21\u0e38\u0e21\u0e25\u0e48\u0e32\u0e07\u0e02\u0e2d\u0e07\u0e08\u0e2d OLED \u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e23\u0e39\u0e49\u0e27\u0e48\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e40\u0e27\u0e47\u0e1a\u0e2d\u0e30\u0e44\u0e23\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14 Serial Monitor \u0e14\u0e39 (\u0e41\u0e15\u0e48\u0e43\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e08\u0e23\u0e34\u0e07 \u0e44\u0e21\u0e48\u0e04\u0e27\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e2a\u0e48\u0e27\u0e19\u0e19\u0e35\u0e49)<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83c\udfaf <\/strong><strong>\u0e1b\u0e23\u0e30\u0e40\u0e14\u0e47\u0e19\u0e17\u0e35\u0e48\u0e04\u0e27\u0e23\u0e40\u0e19\u0e49\u0e19\u0e22\u0e49\u0e33<\/strong><\/h2>\n\n\n\n<p><strong>&#8220;\u0e17\u0e33\u0e44\u0e21\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49\u0e16\u0e36\u0e07\u0e2b\u0e32\u0e22\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1b\u0e34\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07&#8221;<\/strong> \u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e08\u0e30\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e27\u0e48\u0e32\u0e16\u0e49\u0e32\u0e16\u0e2d\u0e14\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e41\u0e25\u0e49\u0e27\u0e40\u0e2a\u0e35\u0e22\u0e1a\u0e43\u0e2b\u0e21\u0e48 \u0e40\u0e27\u0e25\u0e32\u0e08\u0e30\u0e01\u0e25\u0e31\u0e1a\u0e44\u0e1b\u0e40\u0e1b\u0e47\u0e19 10 3 10 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21 \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e16\u0e39\u0e01\u0e40\u0e01\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e43\u0e19 <strong>RAM<\/strong> \u0e08\u0e32\u0e01\u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e40\u0e02\u0e35\u0e22\u0e19\u0e44\u0e27\u0e49 \u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e04\u0e48\u0e32\u0e2d\u0e22\u0e39\u0e48\u0e16\u0e32\u0e27\u0e23 \u0e15\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e23\u0e39\u0e49\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 <strong>EEPROM<\/strong> (\u0e2d\u0e35-\u0e2d\u0e35-\u0e1e\u0e23\u0e2d\u0e21) \u0e2b\u0e23\u0e37\u0e2d <strong>LittleFS<\/strong> (\u0e25\u0e34\u0e15\u0e40\u0e15\u0e34\u0e25-\u0e40\u0e2d\u0e1f\u0e40\u0e2d\u0e2a) \u0e43\u0e19\u0e01\u0e32\u0e23\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e04\u0e48\u0e32\u0e25\u0e07\u0e43\u0e19 Flash Memory<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\ud83d\udcbb  \u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e43\u0e2b\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e40\u0e27\u0e47\u0e1a\u0e2a\u0e27\u0e22\u0e02\u0e36\u0e49\u0e19 (Modern UI Version)<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1282\" height=\"853\" src=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-10.png\" alt=\"\" class=\"wp-image-1584\" style=\"width:832px;height:auto\" srcset=\"https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-10.png 1282w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-10-300x200.png 300w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-10-1024x681.png 1024w, https:\/\/kru-nu.com\/wp-content\/uploads\/2026\/04\/image-10-768x511.png 768w\" sizes=\"auto, (max-width: 1282px) 100vw, 1282px\" \/><\/figure>\n\n\n\n<p>\u0e19\u0e33\u0e44\u0e1b\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48 \u0e43\u0e19\u0e2a\u0e48\u0e27\u0e19\u00a0<strong>void handleRoot()<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void handleRoot() {\n  String html = \"&lt;!DOCTYPE html>&lt;html lang='th'>\";\n  html += \"&lt;head>&lt;meta charset='UTF-8'>&lt;meta name='viewport' content='width=device-width, initial-scale=1'>\";\n  html += \"&lt;title>\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23&lt;\/title>\";\n  \n  \/\/ \u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e1f\u0e2d\u0e19\u0e15\u0e4c '\u0e04\u0e13\u0e34\u0e15' (Kanit) \u0e08\u0e32\u0e01 Google Fonts\n  html += \"&lt;link href='https:\/\/fonts.googleapis.com\/css2?family=Kanit:wght@300;500&amp;display=swap' rel='stylesheet'>\";\n  \n  html += \"&lt;style>\";\n  \/\/ \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e41\u0e25\u0e30\u0e1f\u0e2d\u0e19\u0e15\u0e4c\n  html += \"body { font-family: 'Kanit', sans-serif; background: linear-gradient(135deg, #e0c3fc 0%, #8ec5fc 100%); display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; color: #333; }\";\n  \n  \/\/ \u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e2b\u0e25\u0e31\u0e01 (Card)\n  html += \".card { background: rgba(255, 255, 255, 0.95); padding: 40px 30px; border-radius: 24px; box-shadow: 0 20px 40px rgba(0,0,0,0.15); width: 90%; max-width: 400px; backdrop-filter: blur(10px); }\";\n  html += \"h1 { text-align: center; color: #2c3e50; font-size: 26px; margin-top: 0; margin-bottom: 30px; font-weight: 500; }\";\n  \n  \/\/ \u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e43\u0e2a\u0e48\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e41\u0e15\u0e48\u0e25\u0e30\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\n  html += \".input-group { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding: 15px 20px; background: #ffffff; border-radius: 16px; box-shadow: 0 4px 10px rgba(0,0,0,0.05); transition: 0.3s ease; border: 1px solid #f0f0f0; }\";\n  html += \".input-group:hover { transform: translateY(-3px); box-shadow: 0 8px 15px rgba(0,0,0,0.1); }\";\n  \n  \/\/ \u0e02\u0e35\u0e14\u0e2a\u0e35\u0e41\u0e1a\u0e48\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e44\u0e1f\u0e14\u0e49\u0e32\u0e19\u0e0b\u0e49\u0e32\u0e22\n  html += \".green-box { border-left: 6px solid #2ecc71; }\";\n  html += \".yellow-box { border-left: 6px solid #f1c40f; }\";\n  html += \".red-box { border-left: 6px solid #e74c3c; }\";\n  \n  html += \"label { font-size: 18px; font-weight: 500; }\";\n  \n  \/\/ \u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e0a\u0e48\u0e2d\u0e07\u0e01\u0e23\u0e2d\u0e01\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\n  html += \"input&#91;type='number'] { width: 70px; padding: 10px; border: 2px solid #e0e0e0; border-radius: 10px; text-align: center; font-size: 18px; font-family: 'Kanit', sans-serif; outline: none; transition: 0.3s; font-weight: bold; color: #2c3e50; }\";\n  html += \"input&#91;type='number']:focus { border-color: #3498db; box-shadow: 0 0 8px rgba(52, 152, 219, 0.3); }\";\n  \n  \/\/ \u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\n  html += \"button { width: 100%; padding: 16px; background: linear-gradient(to right, #3498db, #2980b9); color: white; border: none; border-radius: 16px; font-size: 20px; font-weight: 500; font-family: 'Kanit', sans-serif; cursor: pointer; transition: 0.3s; margin-top: 15px; box-shadow: 0 8px 15px rgba(52, 152, 219, 0.3); }\";\n  html += \"button:hover { transform: translateY(-2px); box-shadow: 0 12px 20px rgba(52, 152, 219, 0.4); }\";\n  html += \"button:active { transform: translateY(2px); box-shadow: none; }\";\n  \n  \/\/ \u0e40\u0e04\u0e23\u0e14\u0e34\u0e15\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\n  html += \".footer { text-align: center; margin-top: 25px; font-size: 14px; color: #7f8c8d; }\";\n  html += \"&lt;\/style>&lt;\/head>&lt;body>\";\n  \n  \/\/ \u0e40\u0e23\u0e34\u0e48\u0e21\u0e2a\u0e48\u0e27\u0e19\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\n  html += \"&lt;div class='card'>\";\n  html += \"&lt;h1>\ud83d\udea6 \u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23&lt;\/h1>\";\n  html += \"&lt;form action='\/update' method='GET'>\";\n  \n  \/\/ \u0e0a\u0e48\u0e2d\u0e07\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27\n  html += \"&lt;div class='input-group green-box'>\";\n  html += \"&lt;label>\ud83d\udfe2 \u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27 (\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)&lt;\/label>\";\n  html += \"&lt;input type='number' name='g' min='1' max='99' value='\" + String(intervalGreen\/1000) + \"'>\";\n  html += \"&lt;\/div>\";\n  \n  \/\/ \u0e0a\u0e48\u0e2d\u0e07\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\n  html += \"&lt;div class='input-group yellow-box'>\";\n  html += \"&lt;label>\ud83d\udfe1 \u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07 (\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)&lt;\/label>\";\n  html += \"&lt;input type='number' name='y' min='1' max='99' value='\" + String(intervalYellow\/1000) + \"'>\";\n  html += \"&lt;\/div>\";\n  \n  \/\/ \u0e0a\u0e48\u0e2d\u0e07\u0e44\u0e1f\u0e41\u0e14\u0e07\n  html += \"&lt;div class='input-group red-box'>\";\n  html += \"&lt;label>\ud83d\udd34 \u0e44\u0e1f\u0e41\u0e14\u0e07 (\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)&lt;\/label>\";\n  html += \"&lt;input type='number' name='r' min='1' max='99' value='\" + String(intervalRed\/1000) + \"'>\";\n  html += \"&lt;\/div>\";\n  \n  \/\/ \u0e1b\u0e38\u0e48\u0e21\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\n  html += \"&lt;button type='submit'>\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32&lt;\/button>\";\n  html += \"&lt;\/form>\";\n  \n  html += \"&lt;div class='footer'>\u0e23\u0e30\u0e1a\u0e1a\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e2d\u0e31\u0e08\u0e09\u0e23\u0e34\u0e22\u0e30\u0e42\u0e14\u0e22 ESP32&lt;\/div>\";\n  html += \"&lt;\/div>\";\n  \n  html += \"&lt;\/body>&lt;\/html>\";\n  server.send(200, \"text\/html\", html);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48\u0e2d\u0e31\u0e1b\u0e40\u0e01\u0e23\u0e14\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Background &amp; Box Shadow<\/strong> \u0e21\u0e35\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e40\u0e07\u0e32\u0e41\u0e1a\u0e1a\u0e1f\u0e38\u0e49\u0e07\u0e46 (Soft Shadow) \u0e41\u0e25\u0e30\u0e17\u0e33\u0e21\u0e38\u0e21\u0e42\u0e04\u0e49\u0e07 (Border-radius: 24px) \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e41\u0e2d\u0e1b\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19\u0e02\u0e2d\u0e07 Apple\/Google<\/li>\n\n\n\n<li><strong><code>&lt;html lang='th'><\/code><\/strong> \u0e43\u0e2a\u0e48\u0e42\u0e04\u0e49\u0e14\u0e1a\u0e2d\u0e01\u0e1a\u0e23\u0e32\u0e27\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e27\u0e48\u0e32\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e20\u0e32\u0e29\u0e32\u0e44\u0e17\u0e22 \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c\u0e02\u0e36\u0e49\u0e19<\/li>\n\n\n\n<li><strong>Gradient Button<\/strong> \u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e41\u0e04\u0e48\u0e2a\u0e35\u0e40\u0e14\u0e35\u0e22\u0e27 \u0e41\u0e15\u0e48\u0e43\u0e0a\u0e49\u0e40\u0e17\u0e04\u0e19\u0e34\u0e04 <code>linear-gradient<\/code> \u0e44\u0e25\u0e48\u0e2a\u0e35\u0e1f\u0e49\u0e32\u0e2a\u0e14\u0e43\u0e2a \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e19\u0e48\u0e32\u0e01\u0e14\u0e21\u0e32\u0e01\u0e22\u0e34\u0e48\u0e07\u0e02\u0e36\u0e49\u0e19<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-ast-global-color-7-background-color has-background has-large-font-size\">\u0e23\u0e31\u0e01\u0e29\u0e32\u0e42\u0e23\u0e04\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e40\u0e2a\u0e37\u0e48\u0e2d\u0e21\u0e43\u0e2b\u0e49 ESP32 (Data Persistence)<\/h1>\n\n\n\n<p><strong>\u0e2a\u0e16\u0e32\u0e19\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e1b\u0e31\u0e0d\u0e2b\u0e32<\/strong> \u0e08\u0e32\u0e01\u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e40\u0e02\u0e35\u0e22\u0e19\u0e44\u0e1b \u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27 \u0e23\u0e30\u0e1a\u0e1a\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e15\u0e32\u0e21\u0e1b\u0e01\u0e15\u0e34 \u0e41\u0e15\u0e48&#8230; <strong>&#8220;\u0e16\u0e49\u0e32\u0e40\u0e1c\u0e25\u0e2d\u0e17\u0e33\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2b\u0e25\u0e38\u0e14\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e1f\u0e14\u0e31\u0e1a \u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49\u0e08\u0e30\u0e2b\u0e32\u0e22\u0e27\u0e31\u0e1a\u0e44\u0e1b\u0e17\u0e31\u0e19\u0e17\u0e35&#8221;<\/strong> \u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e30\u0e01\u0e25\u0e31\u0e1a\u0e44\u0e1b\u0e43\u0e0a\u0e49\u0e04\u0e48\u0e32\u0e14\u0e31\u0e49\u0e07\u0e40\u0e14\u0e34\u0e21\u0e04\u0e37\u0e2d 10 3 10 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e15\u0e32\u0e21\u0e42\u0e04\u0e49\u0e14\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e40\u0e02\u0e35\u0e22\u0e19\u0e44\u0e27\u0e49\u0e40\u0e2a\u0e21\u0e2d<\/p>\n\n\n\n<p><strong>\u0e17\u0e33\u0e44\u0e21\u0e16\u0e36\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e41\u0e1a\u0e1a\u0e19\u0e31\u0e49\u0e19<\/strong> \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23 <code>long intervalGreen;<\/code> \u0e16\u0e39\u0e01\u0e40\u0e01\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e43\u0e19 <strong>RAM (\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e0a\u0e31\u0e48\u0e27\u0e04\u0e23\u0e32\u0e27)<\/strong> \u0e0b\u0e36\u0e48\u0e07\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49\u0e44\u0e1f\u0e1f\u0e49\u0e32\u0e40\u0e25\u0e35\u0e49\u0e22\u0e07\u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32 \u0e44\u0e1f\u0e14\u0e31\u0e1a\u0e1b\u0e38\u0e4a\u0e1a \u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2b\u0e32\u0e22\u0e1b\u0e31\u0e4a\u0e1a<\/p>\n\n\n\n<p><strong>\u0e27\u0e34\u0e18\u0e35\u0e23\u0e31\u0e01\u0e29\u0e32<\/strong> \u0e40\u0e23\u0e32\u0e08\u0e30\u0e2a\u0e2d\u0e19\u0e43\u0e2b\u0e49 ESP32 \u0e23\u0e39\u0e49\u0e08\u0e31\u0e01\u0e40\u0e0b\u0e1f\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e25\u0e07\u0e43\u0e19 <strong>Flash Memory (\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e16\u0e32\u0e27\u0e23)<\/strong> \u0e42\u0e14\u0e22\u0e40\u0e23\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e44\u0e25\u0e1a\u0e23\u0e32\u0e23\u0e35\u0e1b\u0e23\u0e30\u0e08\u0e33\u0e15\u0e31\u0e27\u0e02\u0e2d\u0e07 ESP32 \u0e17\u0e35\u0e48\u0e0a\u0e37\u0e48\u0e2d\u0e27\u0e48\u0e32 <strong><code>Preferences<\/code><\/strong> (\u0e1e\u0e23\u0e35-\u0e40\u0e1f\u0e2d-\u0e40\u0e23\u0e19-\u0e40\u0e0b\u0e2a) \u0e0b\u0e36\u0e48\u0e07\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22\u0e01\u0e27\u0e48\u0e32 EEPROM \u0e41\u0e1a\u0e1a\u0e40\u0e01\u0e48\u0e32\u0e21\u0e32\u0e01<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udee0\ufe0f 3 \u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e1c\u0e48\u0e32\u0e15\u0e31\u0e14\u0e42\u0e04\u0e49\u0e14\u0e23\u0e31\u0e01\u0e29\u0e32\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e40\u0e2a\u0e37\u0e48\u0e2d\u0e21<\/h2>\n\n\n\n<p>\u0e40\u0e1b\u0e34\u0e14\u0e42\u0e04\u0e49\u0e14\u0e40\u0e14\u0e34\u0e21\u0e02\u0e36\u0e49\u0e19\u0e21\u0e32 \u0e41\u0e25\u0e49\u0e27\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e04\u0e49\u0e14 3 \u0e08\u0e38\u0e14\u0e19\u0e35\u0e49\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 1 \u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e04\u0e38\u0e13\u0e2b\u0e21\u0e2d <code>Preferences<\/code><\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;WiFi.h>\n#include &lt;WebServer.h>\n\/\/ ... (\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e2d\u0e37\u0e48\u0e19\u0e46 \u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21) ...\n\n#include &lt;Preferences.h>      \/\/ \ud83c\udf1f 1. \u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e44\u0e25\u0e1a\u0e23\u0e32\u0e23\u0e35 Preferences\nPreferences preferences;      \/\/ \ud83c\udf1f 2. \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e01\u0e25\u0e48\u0e2d\u0e07\u0e0a\u0e37\u0e48\u0e2d preferences \u0e44\u0e27\u0e49\u0e40\u0e01\u0e47\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 2 \u0e42\u0e2b\u0e25\u0e14\u0e40\u0e0b\u0e1f\u0e15\u0e2d\u0e19\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07<\/strong> <\/h3>\n\n\n\n<p>\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 <code><strong>setup()<\/strong><\/code> \u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e42\u0e04\u0e49\u0e14\u0e0a\u0e38\u0e14\u0e19\u0e35\u0e49\u0e41\u0e17\u0e23\u0e01\u0e25\u0e07\u0e44\u0e1b\u0e01\u0e48\u0e2d\u0e19\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 <code><strong>WiFi.begin()<\/strong><\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n  Serial.begin(115200);\n  \/\/ ... (\u0e42\u0e04\u0e49\u0e14\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e02\u0e32\u0e44\u0e1f LED \u0e41\u0e25\u0e30 OLED \u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21) ...\n\n  \/\/ \ud83c\udf1f \u0e40\u0e23\u0e34\u0e48\u0e21\u0e01\u0e23\u0e30\u0e1a\u0e27\u0e19\u0e01\u0e32\u0e23\u0e14\u0e36\u0e07\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\n  preferences.begin(\"traffic\", false); \/\/ \u0e40\u0e1b\u0e34\u0e14\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e0a\u0e37\u0e48\u0e2d \"traffic\" (false = \u0e2d\u0e48\u0e32\u0e19\/\u0e40\u0e02\u0e35\u0e22\u0e19\u0e44\u0e14\u0e49)\n  \/\/ false \u0e04\u0e37\u0e2d \u0e01\u0e32\u0e23\u0e15\u0e2d\u0e1a\u0e1b\u0e0f\u0e34\u0e40\u0e2a\u0e18 \u0e42\u0e2b\u0e21\u0e14\u0e2d\u0e48\u0e32\u0e19\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 (readOnly) \u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e36\u0e07\u0e40\u0e1b\u0e34\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e25\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e31\u0e1a\u0e44\u0e14\u0e49\n  \n  \/\/ \u0e14\u0e36\u0e07\u0e04\u0e48\u0e32\u0e2d\u0e2d\u0e01\u0e21\u0e32 \u0e16\u0e49\u0e32\u0e2b\u0e32\u0e44\u0e21\u0e48\u0e40\u0e08\u0e2d\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19 (10000, 3000, 10000)\n  intervalGreen = preferences.getLong(\"green\", 10000);\n  intervalYellow = preferences.getLong(\"yellow\", 3000);\n  intervalRed = preferences.getLong(\"red\", 10000);\n  \n  Serial.println(\"\u0e42\u0e2b\u0e25\u0e14\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22!\");\n\n  \/\/ ... (\u0e42\u0e04\u0e49\u0e14\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d WiFi \u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21) ...\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-ast-global-color-6-background-color has-background has-medium-font-size\"><strong>\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48 3 \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e38\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e17\u0e35\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e01\u0e14 Update<\/strong> <\/h3>\n\n\n\n<p>\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19<strong> <code>handleUpdate()<\/code><\/strong> \u0e40\u0e23\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e14\u0e08\u0e33\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e17\u0e31\u0e19\u0e17\u0e35\u0e17\u0e35\u0e48\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e21\u0e32\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void handleUpdate() {\n  \/\/ \u0e23\u0e31\u0e1a\u0e04\u0e48\u0e32\u0e21\u0e32\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e41\u0e25\u0e49\u0e27\u0e04\u0e39\u0e13 1000 \u0e41\u0e1b\u0e25\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\n  if (server.hasArg(\"g\")) {\n    intervalGreen = server.arg(\"g\").toInt() * 1000;\n    preferences.putLong(\"green\", intervalGreen); \/\/ \ud83c\udf1f \u0e40\u0e0b\u0e1f\u0e04\u0e48\u0e32\u0e44\u0e1f\u0e40\u0e02\u0e35\u0e22\u0e27\u0e25\u0e07 Flash\n  }\n  if (server.hasArg(\"y\")) {\n    intervalYellow = server.arg(\"y\").toInt() * 1000;\n    preferences.putLong(\"yellow\", intervalYellow); \/\/ \ud83c\udf1f \u0e40\u0e0b\u0e1f\u0e04\u0e48\u0e32\u0e44\u0e1f\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e25\u0e07 Flash\n  }\n  if (server.hasArg(\"r\")) {\n    intervalRed = server.arg(\"r\").toInt() * 1000;\n    preferences.putLong(\"red\", intervalRed); \/\/ \ud83c\udf1f \u0e40\u0e0b\u0e1f\u0e04\u0e48\u0e32\u0e44\u0e1f\u0e41\u0e14\u0e07\u0e25\u0e07 Flash\n  }\n  \n  server.sendHeader(\"Location\", \"\/\");\n  server.send(303);\n  Serial.println(\"\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e41\u0e25\u0e30\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e25\u0e07\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e16\u0e32\u0e27\u0e23\u0e41\u0e25\u0e49\u0e27\");\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udd0d \u0e2a\u0e23\u0e38\u0e1b\u0e01\u0e25\u0e44\u0e01\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>preferences.begin(\"traffic\", false)<\/code><\/strong> \u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e2a\u0e21\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e41\u0e1f\u0e49\u0e21\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e17\u0e35\u0e48\u0e0a\u0e37\u0e48\u0e2d\u0e27\u0e48\u0e32 &#8220;traffic&#8221; \u0e02\u0e36\u0e49\u0e19\u0e21\u0e32 (false \u0e41\u0e1b\u0e25\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e40\u0e1b\u0e34\u0e14\u0e21\u0e32\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e17\u0e31\u0e49\u0e07\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e25\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19\u0e17\u0e31\u0e1a\u0e44\u0e14\u0e49)<\/li>\n\n\n\n<li><strong><code>putLong(\"\u0e0a\u0e37\u0e48\u0e2d\u0e04\u0e35\u0e22\u0e4c\", \u0e04\u0e48\u0e32\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02)<\/code><\/strong> \u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e2d\u0e32\u0e14\u0e34\u0e19\u0e2a\u0e2d\u0e08\u0e14\u0e04\u0e48\u0e32\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e25\u0e07\u0e44\u0e1b\u0e43\u0e19\u0e41\u0e1f\u0e49\u0e21 \u0e41\u0e25\u0e49\u0e27\u0e41\u0e1b\u0e30\u0e1b\u0e49\u0e32\u0e22\u0e0a\u0e37\u0e48\u0e2d\u0e44\u0e27\u0e49 \u0e40\u0e0a\u0e48\u0e19 \u0e41\u0e1b\u0e30\u0e1b\u0e49\u0e32\u0e22 &#8220;green&#8221; \u0e27\u0e48\u0e32\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e1a 20000<\/li>\n\n\n\n<li><strong><code>getLong(\"\u0e0a\u0e37\u0e48\u0e2d\u0e04\u0e35\u0e22\u0e4c\", \u0e04\u0e48\u0e32\u0e2a\u0e33\u0e23\u0e2d\u0e07)<\/code><\/strong> \u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e44\u0e1b\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e1b\u0e49\u0e32\u0e22\u0e0a\u0e37\u0e48\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e14\u0e44\u0e27\u0e49 \u0e16\u0e49\u0e32\u0e40\u0e08\u0e2d\u0e01\u0e47\u0e40\u0e2d\u0e32\u0e04\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19\u0e21\u0e32\u0e43\u0e0a\u0e49 \u0e41\u0e15\u0e48\u0e16\u0e49\u0e32\u0e40\u0e1e\u0e34\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e21\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e2d\u0e35\u0e48\u0e22\u0e21 \u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e40\u0e04\u0e22\u0e08\u0e14\u0e2d\u0e30\u0e44\u0e23\u0e40\u0e25\u0e22 \u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e08\u0e30\u0e40\u0e2d\u0e32\u0e04\u0e48\u0e32\u0e2a\u0e33\u0e23\u0e2d\u0e07\u0e21\u0e32\u0e43\u0e0a\u0e49\u0e41\u0e17\u0e19 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e1e\u0e31\u0e07<\/li>\n<\/ul>\n\n\n\n<p><strong>\u0e1a\u0e17\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08<\/strong> \u0e43\u0e2b\u0e49\u0e19\u0e31\u0e01\u0e28\u0e36\u0e01\u0e29\u0e32\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14\u0e42\u0e04\u0e49\u0e14 > \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e40\u0e27\u0e25\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e1c\u0e48\u0e32\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a > <strong>\u0e14\u0e36\u0e07\u0e2a\u0e32\u0e22 USB \u0e2d\u0e2d\u0e01\u0e43\u0e2b\u0e49\u0e44\u0e1f\u0e14\u0e31\u0e1a<\/strong> > \u0e40\u0e2a\u0e35\u0e22\u0e1a\u0e2a\u0e32\u0e22\u0e43\u0e2b\u0e21\u0e48 > \u0e23\u0e2d\u0e14\u0e39\u0e27\u0e48\u0e32\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e22\u0e31\u0e07\u0e08\u0e33\u0e40\u0e27\u0e25\u0e32\u0e17\u0e35\u0e48\u0e15\u0e31\u0e49\u0e07\u0e44\u0e27\u0e49\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e44\u0e14\u0e49\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has-ast-global-color-7-background-color has-background has-large-font-size\">\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2d\u0e32\u0e01\u0e32\u0e23\u0e08\u0e2d OLED \u0e01\u0e23\u0e30\u0e1e\u0e23\u0e34\u0e1a (Flicker) \u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e16\u0e32\u0e19\u0e30<\/h1>\n\n\n\n<p>\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 <code>loop()<\/code> \u0e17\u0e33\u0e07\u0e32\u0e19\u0e40\u0e23\u0e47\u0e27\u0e21\u0e32\u0e01 \u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e21\u0e37\u0e48\u0e19\u0e04\u0e23\u0e31\u0e49\u0e07\u0e15\u0e48\u0e2d\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e41\u0e1b\u0e25\u0e27\u0e48\u0e32\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e2a\u0e31\u0e48\u0e07 <code><strong>display.clearDisplay() <\/strong><\/code>\u0e25\u0e49\u0e32\u0e07\u0e08\u0e2d\u0e20\u0e32\u0e1e\u0e41\u0e25\u0e49\u0e27\u0e27\u0e32\u0e14\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e21\u0e37\u0e48\u0e19\u0e23\u0e2d\u0e1a\u0e15\u0e48\u0e2d\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e08\u0e2d OLED \u0e17\u0e33\u0e07\u0e32\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e2a\u0e32\u0e22 I2C \u0e0b\u0e36\u0e48\u0e07\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e21\u0e48\u0e17\u0e31\u0e19 \u0e2a\u0e48\u0e07\u0e1c\u0e25\u0e43\u0e2b\u0e49\u0e08\u0e2d\u0e21\u0e35\u0e2d\u0e32\u0e01\u0e32\u0e23\u0e27\u0e39\u0e1a\u0e27\u0e32\u0e1a\u0e41\u0e25\u0e30\u0e01\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e32\u0e01\u0e23\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e08\u0e33\u0e40\u0e1b\u0e47\u0e19<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\">\ud83d\udee0\ufe0f \u0e27\u0e34\u0e18\u0e35\u0e41\u0e01\u0e49\u0e44\u0e02 : \u0e41\u0e22\u0e01\u0e2a\u0e21\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d<\/h2>\n\n\n\n<p>\u0e27\u0e34\u0e18\u0e35\u0e41\u0e01\u0e49\u0e41\u0e1a\u0e1a\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e\u0e04\u0e37\u0e2d \u0e40\u0e23\u0e32\u0e08\u0e30\u0e41\u0e22\u0e01\u0e2a\u0e48\u0e27\u0e19\u0e04\u0e34\u0e14\u0e04\u0e33\u0e19\u0e27\u0e13 (Logic) \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25 (UI) \u0e41\u0e25\u0e30<strong>\u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e08\u0e2d\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e20\u0e32\u0e1e\u0e41\u0e04\u0e48 10 \u0e40\u0e1f\u0e23\u0e21\u0e15\u0e48\u0e2d\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e01\u0e47\u0e1e\u0e2d<\/strong><\/p>\n\n\n\n<p>\u0e41\u0e01\u0e49\u0e44\u0e02\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 <code><strong>void loop()<\/strong><\/code> \u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49 \u0e44\u0e1b\u0e27\u0e32\u0e07\u0e17\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e40\u0e14\u0e34\u0e21\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void loop() {\n  server.handleClient();\n  unsigned long currentMillis = millis();\n  long remainingTime = 0;\n  \n  \/\/ \ud83c\udf1f 1. \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e21\u0e32\u0e1e\u0e31\u0e01\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19 \u0e2d\u0e22\u0e48\u0e32\u0e40\u0e1e\u0e34\u0e48\u0e07\u0e2a\u0e48\u0e07\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e2d\u0e17\u0e31\u0e19\u0e17\u0e35\n  String displayStatus = \"\"; \n\n  \/\/ --- \u0e2a\u0e48\u0e27\u0e19\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e14 (Manual Override) ---\n  if (digitalRead(BTN_PIN) == LOW &amp;&amp; currentState == GREEN) {\n    currentState = YELLOW; previousMillis = currentMillis;\n  }\n\n  \/\/ --- \u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48 1: \u0e15\u0e23\u0e23\u0e01\u0e30\u0e44\u0e1f\u0e08\u0e23\u0e32\u0e08\u0e23 (Logic) ---\n  switch (currentState) {\n    case GREEN:\n      updateLEDs(0, 0, 1);\n      remainingTime = (intervalGreen - (currentMillis - previousMillis)) \/ 1000;\n      displayStatus = \"GO\";\n      \n      if (currentMillis - previousMillis &gt;= intervalGreen) { \n        currentState = YELLOW; \n        previousMillis = currentMillis; \n      }\n      break;\n      \n    case YELLOW:\n      updateLEDs(0, 1, 0);\n      remainingTime = (intervalYellow - (currentMillis - previousMillis)) \/ 1000;\n      displayStatus = \"WAIT\";\n      \n      if (currentMillis - previousMillis &gt;= intervalYellow) { \n        currentState = RED; \n        previousMillis = currentMillis; \n      }\n      break;\n      \n    case RED:\n      updateLEDs(1, 0, 0);\n      remainingTime = (intervalRed - (currentMillis - previousMillis)) \/ 1000;\n      displayStatus = \"STOP\";\n      \n      if (currentMillis - previousMillis &gt;= intervalRed) { \n        currentState = GREEN; \n        previousMillis = currentMillis; \n      }\n      break;\n  }\n\n  \/\/ --- \u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48 2: \u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d (UI Update) ---\n  \/\/ \ud83c\udf1f 2. \u0e2b\u0e19\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e08\u0e2d\u0e20\u0e32\u0e1e: \u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e08\u0e2d\u0e41\u0e04\u0e48\u0e17\u0e38\u0e01\u0e46 100 \u0e21\u0e34\u0e25\u0e25\u0e34\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 (10 \u0e04\u0e23\u0e31\u0e49\u0e07\/\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35)\n  static unsigned long lastOledUpdate = 0; \n  \n  if (currentMillis - lastOledUpdate &gt;= 100) {\n    showDisplay(displayStatus, remainingTime);\n    lastOledUpdate = currentMillis;\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-ast-global-color-4-background-color has-background has-medium-font-size\"><strong>\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19\u0e43\u0e19\u0e42\u0e04\u0e49\u0e14\u0e0a\u0e38\u0e14\u0e43\u0e2b\u0e21\u0e48\u0e19\u0e35\u0e49<\/strong><\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0e08\u0e2d OLED \u0e08\u0e30\u0e44\u0e21\u0e48\u0e42\u0e14\u0e19\u0e2a\u0e31\u0e48\u0e07\u0e25\u0e49\u0e32\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d\u0e41\u0e1a\u0e1a\u0e23\u0e31\u0e27\u0e46\u0e2d\u0e35\u0e01\u0e15\u0e48\u0e2d\u0e44\u0e1b \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e20\u0e32\u0e1e\u0e19\u0e34\u0e48\u0e07\u0e2a\u0e19\u0e34\u0e17 \u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e40\u0e14\u0e34\u0e19\u0e40\u0e19\u0e35\u0e22\u0e19\u0e15\u0e32<\/li>\n\n\n\n<li>\u0e04\u0e33\u0e27\u0e48\u0e32 <code>GO<\/code> <code>WAIT<\/code> <code>STOP<\/code> \u0e08\u0e30\u0e16\u0e39\u0e01\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25\u0e43\u0e19\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e30\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e1f\u0e23\u0e21\u0e1c\u0e35\u0e42\u0e1c\u0e25\u0e48\u0e21\u0e32\u0e41\u0e17\u0e23\u0e01\u0e15\u0e2d\u0e19\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e35\u0e44\u0e1f<\/li>\n\n\n\n<li>\u0e1a\u0e2d\u0e23\u0e4c\u0e14 ESP32 \u0e08\u0e30\u0e21\u0e35\u0e40\u0e27\u0e25\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e1b\u0e23\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e08\u0e32\u0e01 Web Server \u0e44\u0e14\u0e49\u0e44\u0e27\u0e02\u0e36\u0e49\u0e19\u0e14\u0e49\u0e27\u0e22 \u0e40\u0e1e\u0e23\u0e32\u0e30\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e31\u0e27\u0e41\u0e15\u0e48\u0e04\u0e38\u0e22\u0e01\u0e31\u0e1a\u0e08\u0e2d OLED \u0e15\u0e25\u0e2d\u0e14\u0e40\u0e27\u0e25\u0e32<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u0e2a\u0e2d\u0e19\u0e42\u0e14\u0e22<\/strong>\u00a0\u0e2d\u0e32\u0e08\u0e32\u0e23\u0e22\u0e4c\u0e19\u0e38\/\u0e04\u0e23\u0e39\u0e19\u0e38 (\u0e20\u0e32\u0e19\u0e38\u0e1e\u0e07\u0e28\u0e4c \u0e2a\u0e30\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e31\u0e14)<\/p>\n\n\n\n<p><strong>\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d<\/strong>\u00a0Line ID : salae44476<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e1e\u0e31\u0e12\u0e19\u0e32\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 IoT \u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e23\u0e30 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1511","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/pages\/1511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/comments?post=1511"}],"version-history":[{"count":41,"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/pages\/1511\/revisions"}],"predecessor-version":[{"id":1594,"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/pages\/1511\/revisions\/1594"}],"wp:attachment":[{"href":"https:\/\/kru-nu.com\/index.php\/wp-json\/wp\/v2\/media?parent=1511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}