{"id":335,"date":"2026-07-13T22:31:41","date_gmt":"2026-07-13T15:31:41","guid":{"rendered":"https:\/\/navy007.com\/WP\/?p=335"},"modified":"2026-07-24T11:49:41","modified_gmt":"2026-07-24T04:49:41","slug":"esp32-ep-2-esp32-%e0%b8%81%e0%b8%b1%e0%b8%9a-web-dashboard","status":"publish","type":"post","link":"https:\/\/navy007.com\/WP\/archives\/335","title":{"rendered":"ESP32 (EP.2) ESP32 \u0e01\u0e31\u0e1a web dashboard"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49 ESP32&nbsp;&nbsp;EP.2 \u0e27\u0e31\u0e19\u0e19\u0e35\u0e49\u0e08\u0e30\u0e02\u0e2d\u0e40\u0e2a\u0e19\u0e2d\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 ESP32 \u0e01\u0e31\u0e1a&nbsp;<em><strong>web dashboard<\/strong><\/em>&nbsp;\u0e04\u0e23\u0e31\u0e1a &#8230;. \u0e14\u0e49\u0e27\u0e22\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e22\u0e38\u0e04\u0e02\u0e2d\u0e07 IoT \u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19\u0e07\u0e32\u0e19 IoT \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19\u0e01\u0e31\u0e1a web dashboard \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07 ESP32 + web dashboard \u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e44\u0e14\u0e49 2 \u0e41\u0e1a\u0e1a\u0e04\u0e23\u0e31\u0e1a\u0e04\u0e37\u0e2d\u0e41\u0e1a\u0e1a local \u0e01\u0e31\u0e1a\u0e41\u0e1a\u0e1a\u0e2d\u0e22\u0e39\u0e48\u0e1a\u0e19\u0e2d\u0e34\u0e19\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e47\u0e15\u0e43\u0e19 server \u0e08\u0e23\u0e34\u0e07<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e02\u0e2d\u0e07 dashboard<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/715\/091\/000\/mriwahlm2uk3T1mdAg8hb5-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/716\/091\/000\/mriwwmuboAnSi0BX8cX-o.png\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e43\u0e19\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e19\u0e35\u0e49\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2b\u0e49 ESP32 \u0e17\u0e33\u0e01\u0e32\u0e23 host dashboard \u0e40\u0e2d\u0e32\u0e44\u0e27\u0e49\u0e17\u0e31\u0e49\u0e07\u0e14\u0e38\u0e49\u0e19\u0e41\u0e25\u0e30\u0e43\u0e2b\u0e49 PC \u0e2b\u0e23\u0e37\u0e2d\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07 dashboard \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 sensor \u0e2b\u0e23\u0e37\u0e2d\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21 GPIO \u0e02\u0e2d\u0e07 ESP32 \u0e04\u0e23\u0e31\u0e1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07 ESP32 \u0e01\u0e31\u0e1a PC\/Notebook \u0e41\u0e25\u0e30\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e33\u0e44\u0e14\u0e49\u0e2b\u0e25\u0e32\u0e22\u0e41\u0e1a\u0e1a&nbsp;&nbsp;\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e17\u0e35\u0e48\u0e14\u0e35\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e2b\u0e32\u0e01\u0e17\u0e35\u0e48\u0e1a\u0e49\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e17\u0e48\u0e32\u0e19\u0e21\u0e35 Wi-Fi router \u0e01\u0e47\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e41\u0e1a\u0e1a\u0e43\u0e19\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e04\u0e23\u0e31\u0e1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/715\/091\/000\/mriwc5gis7qX8SIv6oJTI-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e41\u0e15\u0e48\u0e2b\u0e32\u0e01\u0e17\u0e35\u0e48\u0e1a\u0e49\u0e32\u0e19\u0e44\u0e21\u0e48\u0e21\u0e35 Wi-Fi router \u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e2d\u0e01\u0e19\u0e2d\u0e01\u0e1a\u0e49\u0e32\u0e19\/\u0e44\u0e1b\u0e17\u0e14\u0e25\u0e2d\u0e07\u0e17\u0e35\u0e48\u0e2d\u0e37\u0e48\u0e19 \u0e01\u0e47\u0e43\u0e0a\u0e49\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e41\u0e04\u0e48\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e01\u0e31\u0e1a ESP32 \u0e41\u0e04\u0e48 2 \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19 \u0e41\u0e25\u0e30\u0e43\u0e0a\u0e49\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e1b\u0e25\u0e48\u0e2d\u0e22 Wi-Fi hotspot \u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e15\u0e32\u0e21\u0e20\u0e32\u0e1e\u0e25\u0e48\u0e32\u0e07<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/715\/091\/000\/mriwcgdpoRL2994Rv4O-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e01\u0e32\u0e23\u0e2a\u0e37\u0e48\u0e2d\u0e2a\u0e32\u0e23\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07 ESP32 \u0e01\u0e31\u0e1a web dashboard \u0e19\u0e31\u0e49\u0e19\u0e1c\u0e21\u0e02\u0e2d\u0e01\u0e25\u0e48\u0e32\u0e27\u0e16\u0e36\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19 &#8220;Protocol&#8221; \u0e01\u0e48\u0e2d\u0e19&nbsp;&nbsp;\u0e04\u0e33\u0e27\u0e48\u0e32 protocol \u0e2b\u0e21\u0e32\u0e22\u0e16\u0e36\u0e07 &#8220;\u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23&#8221; \u0e17\u0e35\u0e48 dashboard \u0e2a\u0e37\u0e48\u0e2d\u0e2a\u0e32\u0e23\u0e01\u0e31\u0e1a ESP32&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e43\u0e19\u0e42\u0e25\u0e01\u0e2d\u0e34\u0e19\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e15\u0e43\u0e19\u0e40\u0e27\u0e1a\u0e15\u0e48\u0e32\u0e07 \u0e46 \u0e19\u0e31\u0e49\u0e19\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23 HTTP GET\/POST \u0e0b\u0e36\u0e48\u0e07\u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\/\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07 \u0e40\u0e0a\u0e48\u0e19\u0e2a\u0e48\u0e07\/\u0e23\u0e31\u0e1a\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 , \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e25\u0e30 1 \u0e04\u0e23\u0e31\u0e49\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2b\u0e25\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19 1 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e16\u0e49\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e04\u0e27\u0e32\u0e21\u0e23\u0e27\u0e14\u0e40\u0e23\u0e47\u0e27\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e19\u0e35\u0e49\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e21\u0e35\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e44\u0e14\u0e49\u0e40\u0e1e\u0e23\u0e32\u0e30 HTTP GET\/POST \u0e08\u0e30\u0e21\u0e35 header \u0e40\u0e22\u0e2d\u0e30 (\u0e2d\u0e32\u0e08\u0e21\u0e32\u0e01\u0e16\u0e36\u0e07 2 &#8211; 3 KB) \u0e0b\u0e36\u0e48\u0e07\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e35\u0e22\u0e07 10 &#8211; 20 bytes \u0e40\u0e17\u0e35\u0e22\u0e1a\u0e01\u0e31\u0e1a\u0e02\u0e19\u0e32\u0e14 header 2,000 &#8211; 3,000 bytes &#8230;. \u0e19\u0e35\u0e48\u0e41\u0e2b\u0e25\u0e30\u0e17\u0e35\u0e48\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e27\u0e34\u0e18\u0e35 HTTP GET\/POST \u0e40\u0e01\u0e34\u0e14\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e2b\u0e32\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2b\u0e25\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19 1 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19&nbsp;&nbsp;\u0e17\u0e32\u0e07\u0e2d\u0e2d\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 ESP32 + dashboard \u0e17\u0e35\u0e48\u0e15\u0e2d\u0e1a\u0e2a\u0e19\u0e2d\u0e07\u0e23\u0e27\u0e14\u0e40\u0e23\u0e47\u0e27\u0e04\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49&nbsp;<em><strong>Asynchronous web server + websocket<\/strong><\/em>&nbsp;\u0e04\u0e23\u0e31\u0e1a&nbsp;&nbsp;\u0e40\u0e1e\u0e23\u0e32\u0e30 websocket \u0e08\u0e30\u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e40\u0e2a\u0e21\u0e37\u0e2d\u0e19 &#8220;\u0e17\u0e32\u0e07\u0e14\u0e48\u0e27\u0e19&#8221; \u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e34\u0e14\u0e0a\u0e48\u0e2d\u0e07\u0e23\u0e31\u0e1a\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07 ESP32 \u0e01\u0e31\u0e1a web dsahboard \u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e14\u0e49\u0e27\u0e22 protocol \u0e41\u0e1a\u0e1a\u0e19\u0e35\u0e49\u0e08\u0e30\u0e21\u0e35 header \u0e19\u0e49\u0e2d\u0e22\u0e21\u0e32\u0e01\u0e40\u0e1e\u0e35\u0e22\u0e07 4 &#8211; 8 byte \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e23\u0e31\u0e1a\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e14\u0e49\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27\u0e2a\u0e39\u0e07\u0e44\u0e14\u0e49\u0e14\u0e35\u0e04\u0e23\u0e31\u0e1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/715\/091\/000\/mriwe8s7oeonY5iFP5m-o.png\" alt=\"\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e2a\u0e48\u0e27\u0e19&nbsp;<em><strong>Asynchronous web server<\/strong><\/em>&nbsp;&#8230;.<br>\u0e02\u0e2d\u0e01\u0e25\u0e48\u0e32\u0e27\u0e22\u0e49\u0e2d\u0e19\u0e44\u0e1b\u0e16\u0e36\u0e07\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07 web server \u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b\u0e01\u0e48\u0e2d\u0e19 \u0e01\u0e47\u0e04\u0e37\u0e2d web server \u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b\u0e41\u0e1a\u0e1a synchronous \u0e01\u0e47\u0e04\u0e37\u0e2d\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e07\u0e32\u0e19\u0e40\u0e14\u0e35\u0e22\u0e27\u0e43\u0e19\u0e41\u0e15\u0e48\u0e25\u0e30\u0e04\u0e23\u0e31\u0e49\u0e07 \u0e2a\u0e48\u0e27\u0e19\u0e07\u0e32\u0e19\u0e2d\u0e37\u0e48\u0e19 \u0e46 \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07 &#8220;\u0e23\u0e2d&#8221;\u0e01\u0e48\u0e2d\u0e19&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07\u0e08\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e01\u0e34\u0e14\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e2a\u0e33\u0e04\u0e31\u0e0d\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e43\u0e19 web dashboard \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e15\u0e48\u0e32\u0e07 \u0e46 \u0e40\u0e1b\u0e47\u0e19 real time&nbsp;&nbsp;\u0e41\u0e25\u0e30\u0e16\u0e49\u0e32\u0e40\u0e23\u0e32\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e43\u0e14\u0e43\u0e19 dashboard \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21 GPIO \u0e2d\u0e32\u0e08\u0e08\u0e30\u0e40\u0e01\u0e34\u0e14\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e01\u0e32\u0e23\u0e2a\u0e30\u0e14\u0e38\u0e14\u0e2b\u0e23\u0e37\u0e2d\u0e25\u0e48\u0e32\u0e0a\u0e49\u0e32\u0e43\u0e19\u0e01\u0e32\u0e23\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e44\u0e14\u0e49<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19\u0e43\u0e19\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e19\u0e35\u0e49\u0e21\u0e32\u0e15\u0e23\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23 Code \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a ESP32 \u0e08\u0e30\u0e43\u0e0a\u0e49 Asynchronous Web Server +websocket \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19 \u0e0b\u0e36\u0e48\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e41\u0e01\u0e49\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e01\u0e32\u0e23 &#8220;\u0e23\u0e2d&#8221; \u0e44\u0e14\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e40\u0e1e\u0e23\u0e32\u0e30\u0e21\u0e31\u0e19\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e02\u0e2d\u0e07 dual core CPU \u0e02\u0e2d\u0e07 ESP32 \u0e17\u0e33 2 \u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e01\u0e31\u0e19 \u0e19\u0e31\u0e48\u0e19\u0e01\u0e47\u0e2b\u0e21\u0e32\u0e22\u0e04\u0e27\u0e32\u0e21\u0e27\u0e48\u0e32\u0e41\u0e21\u0e49 dashboard \u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e08\u0e30\u0e21\u0e35\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2b\u0e23\u0e37\u0e2d\u0e01\u0e14\u0e1b\u0e38\u0e48\u0e21\u0e2a\u0e31\u0e48\u0e07\u0e07\u0e32\u0e19 GPIO \u0e17\u0e35\u0e48\u0e22\u0e38\u0e48\u0e07\u0e22\u0e32\u0e01\u0e0b\u0e31\u0e1a\u0e0b\u0e49\u0e2d\u0e19\u0e41\u0e25\u0e30\u0e23\u0e27\u0e14\u0e40\u0e23\u0e47\u0e27\u0e41\u0e04\u0e48\u0e44\u0e2b\u0e19 \u0e17\u0e38\u0e01\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e17\u0e33\u0e01\u0e47\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e34\u0e2a\u0e23\u0e30\u0e41\u0e01\u0e48\u0e01\u0e31\u0e19\u0e2b\u0e21\u0e14\u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e23\u0e2d\u0e2d\u0e35\u0e01\u0e15\u0e48\u0e2d\u0e44\u0e1b<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a project \u0e19\u0e35\u0e49\u0e17\u0e35\u0e48\u0e08\u0e30\u0e2a\u0e32\u0e18\u0e34\u0e15\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e01\u0e47\u0e40\u0e0a\u0e48\u0e19\u0e40\u0e04\u0e22\u0e41\u0e1a\u0e1a\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27\u0e04\u0e23\u0e31\u0e1a \u0e01\u0e47\u0e04\u0e37\u0e2d\u0e08\u0e30\u0e43\u0e0a\u0e49 AI \u0e40\u0e02\u0e35\u0e22\u0e19 code \u0e43\u0e2b\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e41\u0e04\u0e48\u0e40\u0e23\u0e32\u0e40\u0e02\u0e35\u0e22\u0e19 prompt \u0e43\u0e2b\u0e49\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e1a\u0e2d\u0e01 AI \u0e43\u0e2b\u0e49\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e27\u0e48\u0e32\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e27\u0e34\u0e18\u0e35 asynchronous web server + websocket \u0e43\u0e19\u0e01\u0e32\u0e23 code &#8230;. AI \u0e01\u0e47\u0e08\u0e30\u0e40\u0e02\u0e35\u0e22\u0e19 code \u0e14\u0e49\u0e27\u0e22\u0e27\u0e34\u0e18\u0e35\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32&nbsp;&nbsp;\u0e43\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e01\u0e31\u0e1a\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49 library \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a asynchronous web server websocket \u0e14\u0e49\u0e27\u0e22<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e43\u0e19\u0e04\u0e25\u0e34\u0e1b\u0e19\u0e35\u0e49\u0e2a\u0e31\u0e07\u0e40\u0e01\u0e15\u0e17\u0e35\u0e48\u0e2b\u0e19\u0e49\u0e32 dashboard \u0e08\u0e30\u0e21\u0e35\u0e1b\u0e38\u0e48\u0e21\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21 LED \u0e2d\u0e22\u0e39\u0e48 5 \u0e1b\u0e38\u0e48\u0e21\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e1b\u0e34\u0e14\/\u0e40\u0e1b\u0e34\u0e14 LED 4 \u0e14\u0e27\u0e07\u0e41\u0e25\u0e30\u0e1b\u0e38\u0e48\u0e21\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22\u0e04\u0e37\u0e2d\u0e17\u0e33\u0e43\u0e2b\u0e49 LED \u0e17\u0e31\u0e49\u0e07 4 \u0e14\u0e27\u0e07\u0e27\u0e34\u0e48\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e27\u0e34\u0e48\u0e07\u0e04\u0e23\u0e31\u0e1a\u00a0\u00a0\u0e43\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48 2 \u0e08\u0e30\u0e21\u0e35 slider \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e16\u0e35\u0e48\u0e02\u0e2d\u0e07\u0e44\u0e1f\u0e27\u0e34\u0e48\u0e07 \u0e41\u0e25\u0e30\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48 3 \u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e27\u0e48\u0e32\u0e07\u0e0b\u0e36\u0e48\u0e07\u0e1c\u0e21\u0e43\u0e0a\u0e49 LDR \u0e01\u0e31\u0e1a\u0e15\u0e31\u0e27\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e21\u0e32\u0e17\u0e33\u0e40\u0e1b\u0e47\u0e19 voltage divider \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e44\u0e14\u0e49\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e44\u0e1f\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e1b\u0e49\u0e2d\u0e19\u0e40\u0e02\u0e49\u0e32 GPIO 1\u00a0\u00a0\u0e0b\u0e36\u0e48\u0e07\u0e15\u0e31\u0e27 LDR \u0e1c\u0e21\u0e01\u0e47\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e08\u0e23\u0e34\u0e07\u0e02\u0e2d\u0e07\u0e21\u0e31\u0e19\u0e15\u0e32\u0e21\u0e2a\u0e20\u0e32\u0e1e\u0e41\u0e2a\u0e07\u0e43\u0e19\u0e2b\u0e49\u0e2d\u0e07 \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e08\u0e30\u0e44\u0e14\u0e49\u0e04\u0e33\u0e19\u0e27\u0e13\u0e43\u0e2b\u0e49\u0e44\u0e14\u0e49\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e41\u0e25\u0e30\u0e43\u0e19 code \u0e01\u0e47\u0e2a\u0e31\u0e48\u0e07\u0e43\u0e2b\u0e49 map \u0e04\u0e48\u0e32\u0e41\u0e23\u0e07\u0e14\u0e31\u0e19\u0e0a\u0e48\u0e27\u0e07 1.9 \u0e16\u0e36\u0e07 3 \u0e42\u0e27\u0e25\u0e15\u0e4c\u0e17\u0e35\u0e48 GPIO 1 \u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e27\u0e48\u0e32\u0e07 0 \u0e16\u0e36\u0e07 100% \u0e04\u0e23\u0e31\u0e1a<br><a href=\"https:\/\/www.youtube.com\/watch?v=giLj2BWyvkU\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"ESP32 + web dashboard\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/giLj2BWyvkU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Code \u0e02\u0e2d\u0e07 project \u0e19\u0e35\u0e49<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;WiFi.h>\n#include &lt;ESPAsyncWebServer.h>\n#include &lt;AsyncTCP.h>\n\n\/\/ WiFi Credentials\nconst char* ssid = \"NT91124G\";\nconst char* password = \"911928TOT\";\n\n\/\/ Pin Configurations\nconst int ledPins&#91;4] = {5, 7, 8, 10};\nconst int ldrPin = 1;\n\n\/\/ State Variables\nbool ledStates&#91;4] = {false, false, false, false};\nbool runningMode = false;\nint runningFreq = 5; \/\/ Default 5 Hz\nunsigned long lastLdrReadTime = 0;\nunsigned long lastLedStepTime = 0;\nint currentRunningStep = 0;\n\n\/\/ Web Server and WebSocket instances on port 80\nAsyncWebServer server(80);\nAsyncWebSocket ws(\"\/ws\");\n\n\/\/ HTML\/JS Dashboard Source\nconst char index_html&#91;] PROGMEM = R\"rawliteral(\n&lt;!DOCTYPE html>\n&lt;html>\n&lt;head>\n    &lt;title>ESP32-S3 GPIO Dashboard&lt;\/title>\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    &lt;style>\n        body { font-family: Arial, sans-serif; text-align: center; margin:0; padding: 20px; background: #f4f6f9; color: #333; }\n        h1 { color: #2c3e50; margin-bottom: 25px; }\n        .container { max-width: 500px; margin: 0 auto; background: white; padding: 20px; border-radius: 12px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); }\n        h2 { font-size: 1.2rem; border-bottom: 2px solid #eee; padding-bottom: 8px; margin-top: 25px; text-align: left; color: #34495e; }\n        .grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin-bottom: 15px; }\n        button { padding: 14px; font-size: 1rem; font-weight: bold; border: none; border-radius: 8px; cursor: pointer; transition: 0.2s; background: #e0e0e0; color: #555; }\n        button.active { background: #2ecc71; color: white; }\n        button#btn-run { grid-column: span 2; background: #3498db; color: white; }\n        button#btn-run.active { background: #e74c3c; }\n        .slider-wrapper { margin: 20px 0; text-align: left; }\n        .slider-label { display: flex; justify-content: space-between; font-weight: bold; margin-bottom: 5px; }\n        input&#91;type=range] { width: 100%; height: 8px; border-radius: 5px; background: #ddd; outline: none; -webkit-appearance: none; }\n        input&#91;type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: 50%; background: #3498db; cursor: pointer; }\n        .bar-container { background: #eee; border-radius: 8px; height: 25px; width: 100%; overflow: hidden; position: relative; margin-top: 10px; }\n        .bar { background: #f1c40f; height: 100%; width: 0%; transition: width 0.1s ease; }\n        .bar-text { position: absolute; width: 100%; text-align: center; top: 3px; font-weight: bold; font-size: 0.9rem; color: #222; }\n    &lt;\/style>\n&lt;\/head>\n&lt;body>\n    &lt;div class=\"container\">\n        &lt;h1>ESP32-S3 Dashboard&lt;\/h1>\n        \n        &lt;h2>Part 1: LED Controls&lt;\/h2>\n        &lt;div class=\"grid\">\n            &lt;button id=\"btn-0\" onclick=\"toggleLed(0)\">LED 1&lt;\/button>\n            &lt;button id=\"btn-1\" onclick=\"toggleLed(1)\">LED 2&lt;\/button>\n            &lt;button id=\"btn-2\" onclick=\"toggleLed(2)\">LED 3&lt;\/button>\n            &lt;button id=\"btn-3\" onclick=\"toggleLed(3)\">LED 4&lt;\/button>\n            &lt;button id=\"btn-run\" onclick=\"toggleRunning()\">LED running&lt;\/button>\n        &lt;\/div>\n\n        &lt;h2>Part 2: Configuration &amp; Sensors&lt;\/h2>\n        &lt;div class=\"slider-wrapper\">\n            &lt;div class=\"slider-label\">\n                &lt;span>Running Frequency&lt;\/span>\n                &lt;span id=\"freq-val\">5 Hz&lt;\/span>\n            &lt;\/div>\n            &lt;input type=\"range\" id=\"freq-slider\" min=\"1\" max=\"20\" step=\"1\" value=\"5\" oninput=\"updateFreq(this.value)\">\n        &lt;\/div>\n\n        &lt;div style=\"text-align: left; font-weight: bold; margin-top: 15px;\">Light Level&lt;\/div>\n        &lt;div class=\"bar-container\">\n            &lt;div id=\"ldr-bar\" class=\"bar\">&lt;\/div>\n            &lt;div id=\"ldr-text\" class=\"bar-text\">0%&lt;\/div>\n        &lt;\/div>\n    &lt;\/div>\n\n    &lt;script>\n        let gateway = `ws:\/\/${window.location.hostname}\/ws`;\n        let websocket;\n        \n        window.addEventListener('load', initWebSocket);\n\n        function initWebSocket() {\n            console.log('Connecting to WebSocket...');\n            websocket = new WebSocket(gateway);\n            websocket.onmessage = onMessage;\n            websocket.onclose = () => setTimeout(initWebSocket, 2000);\n        }\n\n        function onMessage(event) {\n            let data = JSON.parse(event.data);\n            \n            \/\/ Sync LED States\n            for(let i=0; i&lt;4; i++) {\n                let btn = document.getElementById(`btn-${i}`);\n                if(data.leds&#91;i]) {\n                    btn.classList.add('active');\n                } else {\n                    btn.classList.remove('active');\n                }\n            }\n            \n            \/\/ Sync Running Button\n            let runBtn = document.getElementById('btn-run');\n            if(data.running) {\n                runBtn.classList.add('active');\n                runBtn.innerText = \"Running: ON\";\n            } else {\n                runBtn.classList.remove('active');\n                runBtn.innerText = \"LED running\";\n            }\n\n            \/\/ Sync Slider Frequency\n            document.getElementById('freq-slider').value = data.freq;\n            document.getElementById('freq-val').innerText = data.freq + \" Hz\";\n\n            \/\/ Sync LDR Horizontal Bar\n            document.getElementById('ldr-bar').style.width = data.ldr + \"%\";\n            document.getElementById('ldr-text').innerText = data.ldr + \"%\";\n        }\n\n        function toggleLed(index) {\n            websocket.send(JSON.stringify({action: \"toggle_led\", value: index}));\n        }\n\n        function toggleRunning() {\n            websocket.send(JSON.stringify({action: \"toggle_running\"}));\n        }\n\n        function updateFreq(val) {\n            document.getElementById('freq-val').innerText = val + \" Hz\";\n            websocket.send(JSON.stringify({action: \"set_freq\", value: parseInt(val)}));\n        }\n    &lt;\/script>\n&lt;\/body>\n&lt;\/html>\n)rawliteral\";\n\n\/\/ Send unified system status package via JSON string\nvoid broadcastStatus() {\n    \/\/ Map GPIO 1 Voltage reading (1V to 3V target map to 0-100%)\n    \/\/ ADC on ESP32 S3 yields 0-4095 over ~3.3V attenuation configuration default\n    uint32_t analogRaw = analogRead(ldrPin);\n    float voltage = (analogRaw \/ 4095.0) * 3.38;\n    \n    int lightPercent = map(constrain(voltage * 100, 100, 300), 100, 300, 0, 100);\n\n    String json = \"{\";\n    json += \"\\\"leds\\\":&#91;\" + String(ledStates&#91;0]) + \",\" + String(ledStates&#91;1]) + \",\" + String(ledStates&#91;2]) + \",\" + String(ledStates&#91;3]) + \"],\";\n    json += \"\\\"running\\\":\" + String(runningMode ? \"true\" : \"false\") + \",\";\n    json += \"\\\"freq\\\":\" + String(runningFreq) + \",\";\n    json += \"\\\"ldr\\\":\" + String(lightPercent);\n    json += \"}\";\n    \n    ws.textAll(json);\n}\n\n\/\/ WebSocket Event Handler\nvoid onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {\n    if (type == WS_EVT_DATA) {\n        data&#91;len] = '\\0';\n        String msg = (char*)data;\n        \n        \/\/ Very lightweight parsing to prevent JSON library dependency crashes\n        if (msg.indexOf(\"toggle_led\") > 0) {\n            int idxIdx = msg.indexOf(\"\\\"value\\\":\") + 8;\n            int ledIdx = msg.substring(idxIdx, idxIdx + 1).toInt();\n            if(!runningMode &amp;&amp; ledIdx >= 0 &amp;&amp; ledIdx &lt; 4) {\n                ledStates&#91;ledIdx] = !ledStates&#91;ledIdx];\n                digitalWrite(ledPins&#91;ledIdx], ledStates&#91;ledIdx]);\n            }\n        } \n        else if (msg.indexOf(\"toggle_running\") > 0) {\n            runningMode = !runningMode;\n            if(!runningMode) {\n                \/\/ Revert control straight back to explicit button states\n                for(int i=0; i&lt;4; i++) {\n                    digitalWrite(ledPins&#91;i], ledStates&#91;i]);\n                }\n            }\n        } \n        else if (msg.indexOf(\"set_freq\") > 0) {\n            int valIdx = msg.indexOf(\"\\\"value\\\":\") + 8;\n            runningFreq = msg.substring(valIdx, msg.indexOf(\"}\")).toInt();\n            runningFreq = constrain(runningFreq, 1, 20);\n        }\n        broadcastStatus();\n    }\n}\n\nvoid setup() {\n    Serial.begin(115200);\n\n    \/\/ Setup Pins\n    for(int i=0; i&lt;4; i++) {\n        pinMode(ledPins&#91;i], OUTPUT);\n        digitalWrite(ledPins&#91;i], LOW);\n    }\n    pinMode(ldrPin, INPUT);\n    analogSetAttenuation(ADC_11db); \/\/ Ensures parsing capabilities up to ~3.1-3.3V range\n\n    \/\/ Connect to WiFi\n    WiFi.begin(ssid, password);\n    Serial.print(\"Connecting to WiFi\");\n    while (WiFi.status() != WL_CONNECTED) {\n        delay(500);\n        Serial.print(\".\");\n    }\n    Serial.println(\"\");\n    Serial.print(\"Connected! IP Address: \");\n    Serial.println(WiFi.localIP());\n\n    \/\/ WebSocket Configuration\n    ws.onEvent(onWsEvent);\n    server.addHandler(&amp;ws);\n\n    \/\/ Base Dashboard Rule Route\n    server.on(\"\/\", HTTP_GET, &#91;](AsyncWebServerRequest *request){\n        request->send_P(200, \"text\/html\", index_html);\n    });\n\n    server.begin();\n}\n\nvoid loop() {\n    ws.cleanupClients();\n    unsigned long currentMillis = millis();\n\n    \/\/ 1. Periodic 300 ms LDR sampling and status sync\n    if (currentMillis - lastLdrReadTime >= 300) {\n        lastLdrReadTime = currentMillis;\n        broadcastStatus();\n    }\n\n    \/\/ 2. LED Running Sequencer Logic\n    if (runningMode) {\n        unsigned long stepInterval = 1000 \/ runningFreq;\n        if (currentMillis - lastLedStepTime >= stepInterval) {\n            lastLedStepTime = currentMillis;\n\n            \/\/ Turn off all pins for step cycle sequence preparation\n            for (int i = 0; i &lt; 4; i++) {\n                digitalWrite(ledPins&#91;i], LOW);\n            }\n            \/\/ Sequentially trigger single target active frame\n            digitalWrite(ledPins&#91;currentRunningStep], HIGH);\n\n            currentRunningStep = (currentRunningStep + 1) % 4;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><br>\u0e43\u0e0a\u0e49\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/f.ptcdn.info\/715\/091\/000\/mriwltw21q7bHP571aBkd8-o.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e19\u0e35\u0e49\u0e02\u0e2d\u0e08\u0e1a\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e35\u0e49\u0e01\u0e48\u0e2d\u0e19 \u0e2a\u0e48\u0e27\u0e19\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e2b\u0e19\u0e49\u0e32 EP.3 \u0e08\u0e30\u0e27\u0e48\u0e32\u0e14\u0e49\u0e27\u0e22\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e02\u0e2d\u0e07 Sensor \u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19 + \u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e01\u0e31\u0e1a ESP32 \u0e04\u0e23\u0e31\u0e1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07 ESP32 \u0e01\u0e31\u0e1a dashboard \u0e41\u0e1a\u0e1a local&nbsp;&nbsp;\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e20\u0e32\u0e22\u0e43\u0e19\u0e27\u0e07 Wi-Fi \u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19\u0e43\u0e19\u0e1a\u0e49\u0e32\u0e19 &#8230;. \u0e43\u0e19\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e15\u0e48\u0e2d\u0e44\u0e1b (EP.4) \u0e08\u0e30\u0e2a\u0e32\u0e18\u0e34\u0e15\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 dashboard \u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e1a\u0e19\u0e2d\u0e34\u0e19\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e47\u0e15\u0e08\u0e23\u0e34\u0e07 \u0e46 \u0e04\u0e23\u0e31\u0e1a (Apache web server)&nbsp;&nbsp;\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e40\u0e1b\u0e47\u0e19\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07 dashboard \u0e43\u0e19\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e15\u0e48\u0e32\u0e07 \u0e46 \u0e43\u0e19\u0e1a\u0e49\u0e32\u0e19\u0e41\u0e25\u0e30\u0e01\u0e14\u0e2a\u0e31\u0e48\u0e07\u0e07\u0e32\u0e19\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e44\u0e1f\u0e1f\u0e49\u0e32\u0e17\u0e35\u0e48\u0e1a\u0e49\u0e32\u0e19\u0e1c\u0e48\u0e32\u0e19\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e44\u0e14\u0e49\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e40\u0e23\u0e32\u0e08\u0e30\u0e2d\u0e22\u0e39\u0e48\u0e17\u0e35\u0e48\u0e44\u0e2b\u0e19\u0e1a\u0e19\u0e42\u0e25\u0e01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49 ESP32&nbsp;&nbsp;EP.2 \u0e27\u0e31\u0e19\u0e19\u0e35\u0e49\u0e08\u0e30\u0e02\u0e2d\u0e40\u0e2a\u0e19\u0e2d\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 ESP32 \u0e01\u0e31\u0e1a&nbsp;web dashboard&nbsp;\u0e04\u0e23\u0e31\u0e1a &#8230;. \u0e14\u0e49\u0e27\u0e22\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e22\u0e38\u0e04\u0e02\u0e2d\u0e07 IoT \u0e14\u0e31\u0e07\u0e19\u0e31\u0e49\u0e19\u0e07\u0e32\u0e19 IoT \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19\u0e01\u0e31\u0e1a web dashboard \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19&nbsp;&nbsp;\u0e0b\u0e36\u0e48\u0e07 ESP32 + web dashboard \u0e01\u0e47\u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1b\u0e44\u0e14\u0e49 2 \u0e41\u0e1a\u0e1a\u0e04\u0e23\u0e31\u0e1a\u0e04\u0e37\u0e2d\u0e41\u0e1a\u0e1a local \u0e01\u0e31\u0e1a\u0e41\u0e1a\u0e1a\u0e2d\u0e22\u0e39\u0e48\u0e1a\u0e19\u0e2d\u0e34\u0e19\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e19\u0e47\u0e15\u0e43\u0e19 server \u0e08\u0e23\u0e34\u0e07 \u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e32\u0e02\u0e2d\u0e07 dashboard \u0e43\u0e19\u0e01\u0e23\u0e30\u0e17\u0e39\u0e49\u0e19\u0e35\u0e49\u0e08\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e2b\u0e49 ESP32 \u0e17\u0e33\u0e01\u0e32\u0e23 host dashboard \u0e40\u0e2d\u0e32\u0e44\u0e27\u0e49\u0e17\u0e31\u0e49\u0e07\u0e14\u0e38\u0e49\u0e19\u0e41\u0e25\u0e30\u0e43\u0e2b\u0e49 PC \u0e2b\u0e23\u0e37\u0e2d\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07 dashboard \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 sensor \u0e2b\u0e23\u0e37\u0e2d\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21 GPIO \u0e02\u0e2d\u0e07 ESP32 \u0e04\u0e23\u0e31\u0e1a \u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07 ESP32 \u0e01\u0e31\u0e1a PC\/Notebook \u0e41\u0e25\u0e30\u0e21\u0e37\u0e2d\u0e16\u0e37\u0e2d\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e33\u0e44\u0e14\u0e49\u0e2b\u0e25\u0e32\u0e22\u0e41\u0e1a\u0e1a&nbsp;&nbsp;\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e17\u0e35\u0e48\u0e14\u0e35\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14\u0e01\u0e47\u0e04\u0e37\u0e2d\u0e2b\u0e32\u0e01\u0e17\u0e35\u0e48\u0e1a\u0e49\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e17\u0e48\u0e32\u0e19\u0e21\u0e35 Wi-Fi router \u0e01\u0e47\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e41\u0e1a\u0e1a\u0e43\u0e19\u0e20\u0e32\u0e1e\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e04\u0e23\u0e31\u0e1a \u0e41\u0e15\u0e48\u0e2b\u0e32\u0e01\u0e17\u0e35\u0e48\u0e1a\u0e49\u0e32\u0e19\u0e44\u0e21\u0e48\u0e21\u0e35 Wi-Fi router &hellip; <a href=\"https:\/\/navy007.com\/WP\/archives\/335\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;ESP32 (EP.2) ESP32 \u0e01\u0e31\u0e1a web dashboard&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[260,3],"tags":[258,254,257,259],"class_list":["post-335","post","type-post","status-publish","format-standard","hentry","category-arduino-esp32","category-3","tag-asynchronous-web-server","tag-esp32","tag-web-dashboard","tag-websocket"],"_links":{"self":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/comments?post=335"}],"version-history":[{"count":3,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":340,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/posts\/335\/revisions\/340"}],"wp:attachment":[{"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/media?parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/categories?post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/navy007.com\/WP\/wp-json\/wp\/v2\/tags?post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}