{"id":790,"date":"2025-08-11T15:56:48","date_gmt":"2025-08-11T07:56:48","guid":{"rendered":"\/?p=790"},"modified":"2026-03-22T00:33:41","modified_gmt":"2026-03-21T16:33:41","slug":"esp32","status":"publish","type":"post","link":"\/?p=790","title":{"rendered":"ESP32"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u76ee\u5f55\u7ed3\u6784<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-18.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"513\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-18.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-847\"  sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-17.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"947\" height=\"599\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-17.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-846\"  sizes=\"(max-width: 947px) 100vw, 947px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># \u58f0\u660e\u7ec4\u4ef6\u7684\u6784\u5efa\u4fe1\u606f\uff08ESP-IDF \u6838\u5fc3\u51fd\u6570\uff09\nidf_component_register(\n    # 1. \u6307\u5b9a\u5f53\u524d\u7ec4\u4ef6\u7684\u6e90\u6587\u4ef6\uff08.c\/.cpp\uff09\uff0c\u591a\u4e2a\u6587\u4ef6\u7528\u7a7a\u683c\u5206\u9694\n    SRCS \n        \"app_main.c\"       # \u4e3b\u5165\u53e3\u6587\u4ef6\n        \"wifi_init.c\"      # WiFi \u521d\u59cb\u5316\u6a21\u5757\n        \"data_process.c\"   # \u6570\u636e\u5904\u7406\u6a21\u5757\n\n    # 2. \u6307\u5b9a\u5934\u6587\u4ef6\u76ee\u5f55\uff08\u4f9b\u5f53\u524d\u7ec4\u4ef6\u548c\u4f9d\u8d56\u5b83\u7684\u7ec4\u4ef6\u5f15\u7528\uff09\n    #    \u9ed8\u8ba4\u4e3a\u5f53\u524d\u76ee\u5f55\uff0c\u5982\u9700\u5f15\u7528\u5b50\u76ee\u5f55\uff08\u5982 include\/\uff09\u9700\u663e\u5f0f\u6307\u5b9a\n    INCLUDE_DIRS \n        \".\"                 # \u5f53\u524d\u76ee\u5f55\n        \"include\"           # \u5b50\u76ee\u5f55 include\/\n\n    # 3. \u6307\u5b9a\u5f53\u524d\u7ec4\u4ef6\u4f9d\u8d56\u7684\u5176\u4ed6\u7ec4\u4ef6\uff08\u5fc5\u987b\u663e\u5f0f\u58f0\u660e\uff09\n    #    \u4f9d\u8d56\u7684\u7ec4\u4ef6\u4f1a\u88ab\u4f18\u5148\u7f16\u8bd1\uff0c\u4e14\u5176\u5934\u6587\u4ef6\u4f1a\u88ab\u81ea\u52a8\u6dfb\u52a0\u5230\u641c\u7d22\u8def\u5f84\n    REQUIRES \n        esp_wifi            # \u4f9d\u8d56 WiFi \u7ec4\u4ef6\n        nvs_flash           # \u4f9d\u8d56 NVS \u5b58\u50a8\u7ec4\u4ef6\n        esp_netif           # \u4f9d\u8d56\u7f51\u7edc\u63a5\u53e3\u7ec4\u4ef6\n        freertos            # \u4f9d\u8d56 FreeRTOS \u7ec4\u4ef6\n\n    # 4. \u53ef\u9009\uff1a\u6307\u5b9a\u5f53\u524d\u7ec4\u4ef6\u88ab\u5176\u4ed6\u7ec4\u4ef6\u4f9d\u8d56\u65f6\uff0c\u81ea\u52a8\u4f20\u9012\u7684\u4f9d\u8d56\uff08\u4f20\u9012\u6027\u4f9d\u8d56\uff09\n    #    \u4f8b\u5982\uff1a\u82e5 A \u4f9d\u8d56 B\uff0cB \u7684 PUBLIC_REQUIRES \u5305\u542b C\uff0c\u5219 A \u4f1a\u81ea\u52a8\u4f9d\u8d56 C\n    PUBLIC_REQUIRES \n        log                 # \u65e5\u5fd7\u7ec4\u4ef6\uff0c\u4f9d\u8d56\u5f53\u524d\u7ec4\u4ef6\u7684\u5176\u4ed6\u7ec4\u4ef6\u53ef\u76f4\u63a5\u4f7f\u7528\n\n    # 5. \u53ef\u9009\uff1a\u79c1\u6709\u4f9d\u8d56\uff08\u4ec5\u5f53\u524d\u7ec4\u4ef6\u4f7f\u7528\uff0c\u4e0d\u4f20\u9012\u7ed9\u4f9d\u8d56\u5b83\u7684\u7ec4\u4ef6\uff09\n    PRIVATE_REQUIRES \n        mbedtls             # \u52a0\u5bc6\u7ec4\u4ef6\uff0c\u4ec5\u5f53\u524d\u7ec4\u4ef6\u5185\u90e8\u4f7f\u7528\n)\n\n# \u53ef\u9009\uff1a\u6dfb\u52a0\u7f16\u8bd1\u9009\u9879\uff08\u5982\u8b66\u544a\u7b49\u7ea7\u3001\u5b8f\u5b9a\u4e49\uff09\ntarget_compile_options(${COMPONENT_LIB} PRIVATE\n    -Wall                  # \u5f00\u542f\u6240\u6709\u8b66\u544a\n    -Wextra                # \u989d\u5916\u8b66\u544a\n    -DDEBUG_MODE=1         # \u5b9a\u4e49\u5b8f DEBUG_MODE=1\n)\n\n# \u53ef\u9009\uff1a\u6dfb\u52a0\u94fe\u63a5\u9009\u9879\ntarget_link_options(${COMPONENT_LIB} PRIVATE\n    -Wl,--gc-sections      # \u79fb\u9664\u672a\u4f7f\u7528\u7684\u4ee3\u7801\u6bb5\uff08\u51cf\u5c0f\u4e8c\u8fdb\u5236\u4f53\u79ef\uff09\n)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Linux\u4e0bIDF\u547d\u4ee4 <\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>idf.py build                                      \u7f16\u8bd1\n\nidf.py set-target esp32                           \u8bbe\u7f6e\u82af\u7247\u578b\u53f7\n\nrm -rf build                                      \u6e05\u9664build\u6587\u4ef6\n\nidf.py menuconfig                                  \u914d\u7f6e\u8bbe\u7f6e\n\nidf.py clean                                       \u6e05\u9664\u7f16\u8bd1\u5185\u5bb9\n\nidf.py fullclean                                   \u6e05\u9664\u7f16\u8bd1\u6587\u4ef6\n\nidf.py -p PORT flash                               \u70e7\u5f55\n\nidf.py monitor                                  \u6253\u5f00\u4e32\u53e3\n\nidf.py create-component &lt;component name&gt;           \u521b\u5efa\u65b0\u7ec4\u4ef6\n\nidf.py create-project &lt;project name&gt;                \u521b\u5efa\u65b0\u5de5\u7a0b\n\nidf.py size                                        \u67e5\u770b\u5185\u5b58\u5927\u5c0f\n\nidf.py size-components                              \u67e5\u770b\u8be6\u7ec6\u5185\u5b58\u5927\u5c0f\n\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">monitor\u5feb\u6377\u952e<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-19.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"540\" height=\"763\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-19.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-859\"  sizes=\"(max-width: 540px) 100vw, 540px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u5916\u8bbe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5f15\u811a\u5b9a\u4e49<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\n    \n    #define GPIO_OUTPUT_IO_0    CONFIG_GPIO_OUTPUT_0\n    #define GPIO_OUTPUT_IO_1    CONFIG_GPIO_OUTPUT_1\n    #define GPIO_OUTPUT_PIN_SEL  ((1ULL&lt;&lt;GPIO_OUTPUT_IO_0) | (1ULL&lt;&lt;GPIO_OUTPUT_IO_1))\n\n    gpio_config_t io_conf = {};\/\/\u5b89\u5168\u521d\u59cb\u5316\n    io_conf.intr_type = GPIO_INTR_DISABLE;\n    io_conf.mode = GPIO_MODE_OUTPUT;\n    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;\n    io_conf.pull_down_en = 0;\n    io_conf.pull_up_en = 0;\n    gpio_config(&amp;io_conf);\n\n    gpio_set_level(GPIO_OUTPUT_IO_0, 1);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"693\" height=\"683\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-791\"  sizes=\"(max-width: 693px) 100vw, 693px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-10.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"623\" height=\"761\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-809\"  sizes=\"(max-width: 623px) 100vw, 623px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-11.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"698\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-810\"  sizes=\"(max-width: 532px) 100vw, 532px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-9.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"409\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-807\"  sizes=\"(max-width: 919px) 100vw, 919px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u5f15\u811a\u4e2d\u65ad\u914d\u7f6e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>    gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-1.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"293\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-794\"  sizes=\"(max-width: 924px) 100vw, 924px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-2.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"657\" height=\"783\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-795\"  sizes=\"(max-width: 657px) 100vw, 657px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e2d\u65ad\u51fd\u6570<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>tatic void IRAM_ATTR gpio_isr_handler(void* arg)\n{\n    uint32_t gpio_num = (uint32_t) arg;\n    xQueueSendFromISR(gpio_evt_queue, &amp;gpio_num, NULL);\n}\ngpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);\n\/\/\u9ed8\u8ba4\u4e2d\u65ad\u914d\u7f6e\uff0c\u7b49\u6548\u4e8e ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM_SAFE\uff08\u4e0d\u540c\u82af\u7247\u53ef\u80fd\u6709\u7ec6\u5fae\u5dee\u5f02\uff09\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u573a\u666f\u3002\n\/\/hook isr handler for specific gpio pin\ngpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);\n\/\/ void*\uff08\u901a\u7528\u6307\u9488\uff09\uff0c\u5176\u8bbe\u8ba1\u76ee\u7684\u662f\u5141\u8bb8\u7528\u6237\u5411\u4e2d\u65ad\u5904\u7406\u51fd\u6570\uff08isr_handler\uff09\u4f20\u9012\u4efb\u610f\u7c7b\u578b\u7684\u53c2\u6570\uff08\u53ef\u4ee5\u662f\u6574\u6570\u3001\u7ed3\u6784\u4f53\u6307\u9488\u3001\u6570\u7ec4\u6307\u9488\u7b49\uff09\n\/\/hook isr handler for specific gpio pin\ngpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void*) GPIO_INPUT_IO_1);\n\n\/\/remove isr handler for gpio number.\ngpio_isr_handler_remove(GPIO_INPUT_IO_0);\n\/\/hook isr handler for specific gpio pin again\ngpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-6.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"916\" height=\"460\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-802\"  sizes=\"(max-width: 916px) 100vw, 916px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-7.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"916\" height=\"512\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-803\"  sizes=\"(max-width: 916px) 100vw, 916px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u7cfb\u7edf<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">FreeRTOS<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>static QueueHandle_t gpio_evt_queue = NULL;\n\nstatic void gpio_task_example(void* arg)\n{\n    uint32_t io_num;\n    while(1) \n   {\n        if (xQueueReceive(gpio_evt_queue, &amp;io_num, portMAX_DELAY)) {\n            printf(\"GPIO&#91;%\"PRIu32\"] intr, val: %d\\n\", io_num, gpio_get_level(io_num));\n        }\n    }\n}\n\/\/create a queue to handle gpio event from isr\ngpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));\n\/\/start gpio task\nxTaskCreate(gpio_task_example, \"gpio_task_example\", 2048, NULL, 10, NULL);\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-3.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"903\" height=\"373\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-796\"  sizes=\"(max-width: 903px) 100vw, 903px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u4efb\u52a1\u521b\u5efa<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">xTaskCreate()<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-4.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"918\" height=\"549\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-799\"  sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u961f\u5217\u521b\u5efa<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">xQueueCreate()<\/h4>\n\n\n\n<p>\u521b\u5efa\u961f\u5217<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-5.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"873\" height=\"267\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-800\"  sizes=\"(max-width: 873px) 100vw, 873px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">xQueueReceive()<\/h4>\n\n\n\n<p>\u4ece\u961f\u5217\u4e2d\u63a5\u6536\u6570\u636e<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-8.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"918\" height=\"285\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-806\"  sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/div><\/figure>\n\n\n\n<p><strong>ticktype \u53ef\u4ee5\u5206\u4e3aportMAX_DELAY(\u4e00\u76f4\u7b49\u5f85)\u30010(\u4e0d\u7b49\u5f85)\u3001pdMS_TO_TICKS(100)(\u6700\u957f\u7b49\u5f85\u65f6\u95f4)\u00a0<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong><code>xQueueSend<\/code>\u00a0<\/strong><\/h4>\n\n\n\n<p>\u53d1\u9001\u6570\u636e\u5230\u961f\u5217<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8b\u4ef6\u7ec4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">xEventGroupWaitBits()<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-20.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"639\" height=\"666\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-20.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-868\"  sizes=\"(max-width: 639px) 100vw, 639px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>static EventGroupHandle_t s_wifi_event_group; \/\/\u521b\u5efa\u5b9e\u8df5\u7ec4\n#define WIFI_CONNECTED_BIT BIT0      \/\/ STA \u8fde\u63a5\u6210\u529f\u6807\u5fd7\n#define WIFI_FAIL_BIT      BIT1      \/\/ STA \u8fde\u63a5\u5931\u8d25\u6807\u5fd7\n\nxEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); \/\/\u7f6e\u4f4d\u4e8b\u4ef6\u7ec4\u6807\u5fd7\u4f4d\n\ns_wifi_event_group = xEventGroupCreate();\/\/\u521b\u5efa\u4e8b\u4ef6\u7ec4\n\nEventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,                 \/\/\u4e8b\u4ef6\u7ec4\n                                       WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, \/\/\u6807\u5fd7\u4f4d\n                                       pdFALSE,                            \/\/\u4e0d\u6e05\u9664\u6807\u5fd7\u4f4d\n                                       pdFALSE,           \/\/\u4e0d\u9700\u8981\u6240\u6709\u4f4d\u90fd\u6ee1\u8db3\uff0c\u4efb\u610f\u4e00\u4e2a\u5373\u53ef\n                                       portMAX_DELAY);                     \/\/ \u65e0\u9650\u7b49\u5f85\n\nif (bits &amp; WIFI_CONNECTED_BIT){\n    ESP_LOGI(TAG, \"STA \u8fde\u63a5\u6210\u529f! AP \u70ed\u70b9\u5df2\u5f00\u542f: SSID=%s\", AP_SSID);\n} \nelse{\n  ESP_LOGE(TAG, \"STA \u8fde\u63a5\u5931\u8d25\uff0c\u4f46 AP \u70ed\u70b9\u4ecd\u53ef\u7528\");\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">WIFI<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nvs_flash_init()                                  \u5f00\u542fnvs\uff08wifi\u914d\u7f6e\u9700\u8981\u8fd9\u4e2a\u51fd\u6570\uff09\n\nesp_netif_init()                                  \u521d\u59cb\u5316\u63a5\u53e3\n\nesp_event_loop_create_default()                   \u521b\u5efa\u9ed8\u8ba4\u4e8b\u4ef6\u5faa\u73af\n\nesp_netif_create_default_wifi_sta()                STA \u63a5\u53e3\n\n&nbsp;esp_netif_create_default_wifi_ap()               AP\u63a5\u53e3\n\nwifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT()     \u521d\u59cb\u5316\u914d\u7f6e\u6587\u4ef6\n\nesp_wifi_init(&amp;cfg),\u4e3a WiFi \u9a71\u52a8\u521d\u59cb\u5316 WiFi \u5206\u914d\u8d44\u6e90\uff0c\u5982 WiFi \u63a7\u5236\u7ed3\u6784\u3001RX\/TX \u7f13\u51b2\u533a\u3001WiFi NVS \u7ed3\u6784\u7b49\uff0c\u8fd9\u4e2a WiFi \u4e5f\u542f\u52a8 WiFi \u4efb\u52a1\u3002\u5fc5\u987b\u5148\u8c03\u7528\u6b64API\uff0c\u7136\u540e\u624d\u80fd\u8c03\u7528\u6240\u6709\u5176\u4ed6WiFi API\nesp_event_handler_instance_register()              \u56de\u8c03\u51fd\u6570\nesp_wifi_set_mode()                                \u8bbe\u7f6e\u6a21\u5f0f\nesp_wifi_set_config()                              \u8bbe\u7f6e\u914d\u7f6e\nesp_wifi_start()                                   \u5f00\u542fwifi\nesp_wifi_connect()                                 \u8fde\u63a5sta\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">WIFI_EVENT\uff08WiFi \u6a21\u5757\u4e8b\u4ef6\uff09<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>    \u6240\u5c5e\u6a21\u5757\uff1aWiFi \u9a71\u52a8\uff08esp_wifi \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6\u4e0e WiFi \u72b6\u6001\u76f8\u5173\u7684\u4e8b\u4ef6\uff08\u5982\u8fde\u63a5\u3001\u65ad\u5f00\u3001\u542f\u52a8\u3001\u505c\u6b62\u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        WIFI_EVENT_STA_START\uff1aSTA \u6a21\u5f0f\uff08\u5ba2\u6237\u7aef\uff09\u542f\u52a8\u6210\u529f\uff1b\n        WIFI_EVENT_STA_STOP\uff1aSTA \u6a21\u5f0f\u505c\u6b62\uff1b\n        WIFI_EVENT_STA_CONNECTED\uff1aSTA \u6210\u529f\u8fde\u63a5\u5230 AP\uff08\u8def\u7531\u5668\uff09\uff1b\n        WIFI_EVENT_STA_DISCONNECTED\uff1aSTA \u4e0e AP \u65ad\u5f00\u8fde\u63a5\uff1b\n        WIFI_EVENT_AP_START\uff1aAP \u6a21\u5f0f\uff08\u70ed\u70b9\uff09\u542f\u52a8\u6210\u529f\uff1b\n        WIFI_EVENT_AP_STOP\uff1aAP \u6a21\u5f0f\u505c\u6b62\uff1b\n        WIFI_EVENT_AP_STACONNECTED\uff1a\u6709\u8bbe\u5907\u8fde\u63a5\u5230 ESP32 \u7684 AP\uff1b\n        WIFI_EVENT_AP_STADISCONNECTED\uff1a\u8bbe\u5907\u4ece ESP32 \u7684 AP \u65ad\u5f00\u3002\n        ESP_EVENT_ANY_ID  \u5168\u90e8ID\u4e8b\u4ef6\n\n2. IP_EVENT\uff08IP \u534f\u8bae\u6808\u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1aTCP\/IP \u534f\u8bae\u6808\uff08lwip \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6\u4e0e IP \u5730\u5740\u5206\u914d\u3001\u91ca\u653e\u76f8\u5173\u7684\u4e8b\u4ef6\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        IP_EVENT_STA_GOT_IP\uff1aSTA \u6a21\u5f0f\u4e0b\u4ece\u8def\u7531\u5668\u83b7\u53d6\u5230 IP \u5730\u5740\uff1b\n        IP_EVENT_STA_LOST_IP\uff1aSTA \u6a21\u5f0f\u4e0b\u4e22\u5931 IP \u5730\u5740\uff1b\n        IP_EVENT_AP_STAIPASSIGNED\uff1aESP32 \u7684 AP \u6a21\u5f0f\u4e3a\u8fde\u63a5\u7684\u8bbe\u5907\u5206\u914d\u4e86 IP \u5730\u5740\uff1b\n        IP_EVENT_GOT_IP6\uff1a\u83b7\u53d6\u5230 IPv6 \u5730\u5740\u3002\n\n3. BT_EVENT\uff08\u7ecf\u5178\u84dd\u7259\u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1a\u7ecf\u5178\u84dd\u7259\uff08BR\/EDR\uff09\u9a71\u52a8\uff08bt \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6\u4e0e\u7ecf\u5178\u84dd\u7259\u76f8\u5173\u7684\u4e8b\u4ef6\uff08\u5982\u542f\u52a8\u3001\u8fde\u63a5\u3001\u6570\u636e\u4f20\u8f93\u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        BT_EVENT_ENABLED\uff1a\u7ecf\u5178\u84dd\u7259\u542f\u52a8\u6210\u529f\uff1b\n        BT_EVENT_DISABLED\uff1a\u7ecf\u5178\u84dd\u7259\u5173\u95ed\uff1b\n        BT_EVENT_SPP_CONNECTED\uff1aSPP\uff08\u4e32\u53e3\u534f\u8bae\uff09\u8fde\u63a5\u5efa\u7acb\uff1b\n        BT_EVENT_SPP_DISCONNECTED\uff1aSPP \u8fde\u63a5\u65ad\u5f00\u3002\n\n4. BLE_EVENT\uff08\u4f4e\u529f\u8017\u84dd\u7259 BLE \u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1aBLE \u9a71\u52a8\uff08bt \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6\u4e0e BLE \u76f8\u5173\u7684\u4e8b\u4ef6\uff08\u5982\u5e7f\u64ad\u3001\u8fde\u63a5\u3001GATT \u4ea4\u4e92\u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        BLE_EVENT_ENABLED\uff1aBLE \u542f\u52a8\u6210\u529f\uff1b\n        BLE_EVENT_DISABLED\uff1aBLE \u5173\u95ed\uff1b\n        BLE_EVENT_CONNECTED\uff1aBLE \u8fde\u63a5\u5efa\u7acb\uff1b\n        BLE_EVENT_DISCONNECTED\uff1aBLE \u8fde\u63a5\u65ad\u5f00\uff1b\n        BLE_EVENT_GATT_WRITE\uff1aGATT \u670d\u52a1\u6536\u5230\u5199\u5165\u8bf7\u6c42\u3002\n\n5. ETH_EVENT\uff08\u4ee5\u592a\u7f51\u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1a\u4ee5\u592a\u7f51\u9a71\u52a8\uff08ethernet \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6\u4e0e\u4ee5\u592a\u7f51\u76f8\u5173\u7684\u4e8b\u4ef6\uff08\u5982\u8fde\u63a5\u3001\u65ad\u5f00\u3001\u83b7\u53d6 IP \u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        ETH_EVENT_CONNECTED\uff1a\u4ee5\u592a\u7f51\u7269\u7406\u8fde\u63a5\u5efa\u7acb\uff1b\n        ETH_EVENT_DISCONNECTED\uff1a\u4ee5\u592a\u7f51\u7269\u7406\u8fde\u63a5\u65ad\u5f00\uff1b\n        ETH_EVENT_GOT_IP\uff1a\u4ee5\u592a\u7f51\u63a5\u53e3\u83b7\u53d6\u5230 IP \u5730\u5740\u3002\n\n6. HTTP_CLIENT_EVENTS\uff08HTTP \u5ba2\u6237\u7aef\u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1aHTTP \u5ba2\u6237\u7aef\uff08esp_http_client \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6 HTTP \u5ba2\u6237\u7aef\u8bf7\u6c42\u8fc7\u7a0b\u4e2d\u7684\u4e8b\u4ef6\uff08\u5982\u8fde\u63a5\u3001\u6570\u636e\u63a5\u6536\u3001\u8bf7\u6c42\u5b8c\u6210\u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        HTTP_EVENT_ON_CONNECTED\uff1a\u4e0e\u670d\u52a1\u5668\u5efa\u7acb\u8fde\u63a5\uff1b\n        HTTP_EVENT_ON_DATA\uff1a\u6536\u5230\u670d\u52a1\u5668\u8fd4\u56de\u7684\u6570\u636e\uff1b\n        HTTP_EVENT_ON_FINISH\uff1aHTTP \u8bf7\u6c42\u5b8c\u6210\uff1b\n        HTTP_EVENT_ON_DISCONNECTED\uff1a\u4e0e\u670d\u52a1\u5668\u65ad\u5f00\u8fde\u63a5\u3002\n\n7. HTTP_SERVER_EVENTS\uff08HTTP \u670d\u52a1\u5668\u4e8b\u4ef6\uff09\n\n    \u6240\u5c5e\u6a21\u5757\uff1aHTTP \u670d\u52a1\u5668\uff08esp_http_server \u7ec4\u4ef6\uff09\u3002\n    \u4f5c\u7528\uff1a\u6807\u8bc6 HTTP \u670d\u52a1\u5668\u8fd0\u884c\u4e2d\u7684\u4e8b\u4ef6\uff08\u5982\u5ba2\u6237\u7aef\u8fde\u63a5\u3001\u8bf7\u6c42\u5904\u7406\u7b49\uff09\u3002\n    \u5178\u578b\u4e8b\u4ef6 ID\uff1a\n        HTTP_SERVER_EVENT_START\uff1a\u670d\u52a1\u5668\u542f\u52a8\u6210\u529f\uff1b\n        HTTP_SERVER_EVENT_STOP\uff1a\u670d\u52a1\u5668\u505c\u6b62\uff1b\n        HTTP_SERVER_EVENT_CONNECTED\uff1a\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\n\n8. \u5176\u4ed6\u7ec4\u4ef6\u4e8b\u4ef6\n\u6839\u636e\u4f7f\u7528\u7684\u7ec4\u4ef6\u4e0d\u540c\uff0c\u8fd8\u53ef\u80fd\u6709\u5176\u4ed6\u4e8b\u4ef6\u57fa\u7840\uff0c\u4f8b\u5982\uff1a\n\n    NVS_EVENTS\uff1aNVS \u5b58\u50a8\u76f8\u5173\u4e8b\u4ef6\uff08\u5982\u64e6\u9664\u3001\u9519\u8bef\u7b49\uff09\uff1b\n    SPIFFS_EVENTS\uff1aSPIFFS \u6587\u4ef6\u7cfb\u7edf\u4e8b\u4ef6\uff1b\n    MQTT_EVENTS\uff1aMQTT \u5ba2\u6237\u7aef\u4e8b\u4ef6\uff08\u5982\u8fde\u63a5\u3001\u65ad\u5f00\u3001\u6d88\u606f\u63a5\u6536\u7b49\uff09<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n#include \"include\/wifis.h\"\n#include \"include\/Html_index.h\"\n#include \"MyMqtt.h\"\n#include &lt;stdio.h>\n#include \"esp_wifi.h\"\n#include \"esp_event.h\"\n#include \"esp_event_base.h\"\n#include \"esp_mac.h\"\n#include \"esp_log.h\"\n#include \"esp_netif.h\"\n#include \"esp_netif_sntp.h\"\n#include \"esp_http_server.h\"\n#include \"cJSON.h\"\n#include \"string.h\"\n#include \"nvs.h\"\n#include \"nvs_flash.h\"\n#include \"freertos\/FreeRTOS.h\"\n#include \"freertos\/task.h\"\n#include \"freertos\/event_groups.h\"\n#include \"driver\/rmt_encoder.h\"\n\/\/ #include \"UI_custom\/gui_guider.h\"\n\n#define MAX_RETRY    5               \/\/ STA \u8fde\u63a5\u6700\u5927\u91cd\u8bd5\u6b21\u6570\n\nstatic const char *TAG = \"AP+STA Demo\";\nstatic EventGroupHandle_t s_wifi_event_group;\n\n#define WIFI_CONNECTED_BIT BIT0      \/\/ STA \u8fde\u63a5\u6210\u529f\u6807\u5fd7\n#define WIFI_FAIL_BIT      BIT1      \/\/ STA \u8fde\u63a5\u5931\u8d25\u6807\u5fd7\n#define WIFI_AP_BIT      BIT2      \/\/ STA \u8fde\u63a5\u5931\u8d25\u6807\u5fd7\n\nstatic int s_retry_count = 0;\nint g_ap_connected_num = 0;   \/\/ \u8fde\u63a5\u5230 AP \u7684\u8bbe\u5907\u6570\u91cf\nstatic const char* OK_text = \"light\";\n\nstatic uint8_t state_JDQ = 0;\n\n\n\/*------------------ \u7528\u6237\u53d8\u91cf\u5168\u5c40\u53d8\u91cf\u5b9a\u4e49 ------------------*\/\nunsigned char* STA_SSID;\nunsigned char* STA_PASSWORD;\nunsigned char* AP_SSID;\nunsigned char* AP_PASSWORD;\nunsigned char STA_IP&#91;4]={0};\nWifi_States Wifi_State;\n\n\/*------------------ \u4e8b\u4ef6\u5904\u7406\u51fd\u6570 ------------------*\/\nstatic void wifi_event_handler(void* arg, esp_event_base_t event_base, \n                               int32_t event_id, void* event_data) {\n    \/\/ STA \u4e8b\u4ef6\u5904\u7406\n    if (event_base == WIFI_EVENT) {\n        switch (event_id) {\n            case WIFI_EVENT_STA_START:\n                espnow_init();\n                esp_wifi_connect(); \/\/ STA \u542f\u52a8\u540e\u81ea\u52a8\u8fde\u63a5\n                break;\n            case WIFI_EVENT_STA_DISCONNECTED:\n                if (s_retry_count &lt; MAX_RETRY) {\n                    esp_wifi_connect();\n                    s_retry_count++;\n                    ESP_LOGI(TAG, \"STA \u65ad\u5f00\uff0c\u6b63\u5728\u91cd\u8fde... (%d\/%d)\", s_retry_count, MAX_RETRY);\n                } else {\n                    xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);\n                }\n                break;\n            case WIFI_EVENT_AP_STACONNECTED: \/\/ AP \u6709\u8bbe\u5907\u8fde\u63a5\n                g_ap_connected_num++;\n                wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;\n                ESP_LOGI(TAG,\"station\" MACSTR \"leave\",MAC2STR(event->mac));\n                xEventGroupSetBits(s_wifi_event_group, WIFI_AP_BIT);\n                break;\n            case WIFI_EVENT_AP_STADISCONNECTED: \n                if (g_ap_connected_num > 0) {\n                    g_ap_connected_num--;\n                }\n                ESP_LOGI(TAG, \"\u8bbe\u5907\u65ad\u5f00AP\uff0c\u5f53\u524d\u603b\u6570\uff1a%d\", g_ap_connected_num);\n                \/\/ \u65ad\u5f00\u540e\u7684\u4e1a\u52a1\u903b\u8f91\uff08\u5982\u6e05\u7406\u8be5\u8bbe\u5907\u7684\u7f13\u5b58\uff09\n                break;\n        }\n    }\n    \/\/ IP \u4e8b\u4ef6\u5904\u7406\n    else if (event_base == IP_EVENT &amp;&amp; event_id == IP_EVENT_STA_GOT_IP) {\n        ip_event_got_ip_t* ip_event = (ip_event_got_ip_t*) event_data;\n        STA_IP&#91;0] = esp_ip4_addr1_16(&amp;ip_event->ip_info.ip);\n        STA_IP&#91;1] = esp_ip4_addr2_16(&amp;ip_event->ip_info.ip);\n        STA_IP&#91;2] = esp_ip4_addr3_16(&amp;ip_event->ip_info.ip);\n        STA_IP&#91;3] = esp_ip4_addr4_16(&amp;ip_event->ip_info.ip);\n        ESP_LOGI(TAG, \"STA \u83b7\u53d6 IP: \" IPSTR, IP2STR(&amp;ip_event->ip_info.ip));\n        s_retry_count = 0;\n        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);\n    }\n}\n\nstatic void Wificonfig_AP(void)\n{\n    ESP_ERROR_CHECK(esp_wifi_stop());\n    Wifi_State = WIFI_STATE_NULL;\n    \/\/ 5. \u914d\u7f6e AP \u53c2\u6570\n    wifi_config_t ap_config = {\n        .ap = {\n            .ssid = {0},\n            .password ={0},\n            .max_connection = 20,         \/\/ \u6700\u5927\u8fde\u63a5\u6570\n            .channel = 6,\n            .authmode = WIFI_AUTH_WPA2_PSK\n        }\n    };\n    strlcpy((char*)ap_config.ap.ssid, (const char*)AP_SSID, sizeof(ap_config.ap.ssid));\n    strlcpy((char*)ap_config.ap.password, (const char*)AP_PASSWORD, sizeof(ap_config.ap.password));\n\n    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &amp;ap_config));\n}\n\nstatic void Wificonifg_STA(void)\n{\n    ESP_ERROR_CHECK(esp_wifi_stop());\n    Wifi_State = WIFI_STATE_NULL;\n    \/\/ 6. \u914d\u7f6e STA \u53c2\u6570\n    wifi_config_t sta_config = {\n        .sta = {\n            .ssid = {0},\n            .password = {0}\n        }\n    };\n    strlcpy((char*)sta_config.sta.ssid, (const char*)STA_SSID, sizeof(sta_config.sta.ssid));\n    strlcpy((char*)sta_config.sta.password, (const char*)STA_PASSWORD, sizeof(sta_config.sta.password));\n\n    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &amp;sta_config));\n}\n\n\/*------------------ WiFi \u521d\u59cb\u5316\u51fd\u6570 ------------------*\/\nvoid wifi_init_apsta(void) {\n    \/\/ 1. \u521d\u59cb\u5316\u57fa\u7840\u7ec4\u4ef6\n    \/\/ ESP_ERROR_CHECK(nvs_flash_init());\n    ESP_ERROR_CHECK(esp_netif_init());\n\n\n    ESP_ERROR_CHECK(esp_event_loop_create_default());\n    \n    \/\/ 2. \u521b\u5efa\u9ed8\u8ba4\u7f51\u7edc\u63a5\u53e3\n    esp_netif_create_default_wifi_sta(); \/\/ STA \u63a5\u53e3\n    \/\/ AP \u63a5\u53e3\n    esp_netif_create_default_wifi_ap();\n    \/\/ 3. \u521d\u59cb\u5316 WiFi \u9a71\u52a8\n    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n    ESP_ERROR_CHECK(esp_wifi_init(&amp;cfg));\n\n    \/\/ 4. \u6ce8\u518c\u4e8b\u4ef6\u56de\u8c03\n    esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, wifi_event_handler, NULL, NULL);\n    esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_event_handler, NULL, NULL);\n\n    \/\/ 7. \u8bbe\u7f6e\u53cc\u6a21\u5f0f\u5e76\u542f\u52a8\n    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));\n\n\n    Wificonfig_AP();\n    Wificonifg_STA();\n\n    ESP_ERROR_CHECK(esp_wifi_start());\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">WebSocket<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efahttp\u670d\u52a1\u5b9e\u4f8b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>static httpd_handle_t start_webserver(void) {\n    \/\/ \u914d\u7f6eHTTP\u670d\u52a1\u5668\n    httpd_config_t config = HTTPD_DEFAULT_CONFIG();\n    httpd_handle_t server = NULL;\n\n    \/\/ \u542f\u52a8HTTP\u670d\u52a1\u5668\n    if (httpd_start(&amp;server, &amp;config) == ESP_OK) {\n        \/\/ \u6ce8\u518c\u6839\u8def\u5f84\uff08\/\uff09\u7684\u5904\u7406\u51fd\u6570\n        httpd_uri_t index_uri = {\n            .uri       = \"\/\",\n            .method    = HTTP_GET,\n            .handler   = index_handler,\n            .user_ctx  = NULL\n        };\n        httpd_register_uri_handler(server, &amp;index_uri);\n\n        \/\/ \u6ce8\u518c\u72b6\u6001\u66f4\u65b0\u8def\u5f84\uff08\/set\uff09\u7684\u5904\u7406\u51fd\u6570\n        httpd_uri_t set_uri = {\n            .uri       = \"\/set\",\n            .method    = HTTP_GET,\n            .handler   = set_handler,\n            .user_ctx  = NULL\n        };\n        httpd_register_uri_handler(server, &amp;set_uri);\n    }\n\n    return server;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u63a5\u6536\u5230\u8bf7\u6c42\u540e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>static esp_err_t index_handler(httpd_req_t *req) {\n    \/\/ \u53d1\u9001HTML\u5185\u5bb9\u7ed9\u5ba2\u6237\u7aef\n    httpd_resp_send(req, index_html, HTTPD_RESP_USE_STRLEN);\n    return ESP_OK;\n}\n\n\/\/ 2. \u5904\u7406\u72b6\u6001\u66f4\u65b0\u8bf7\u6c42\uff08\/set?state=xxx\uff09\nstatic esp_err_t set_handler(httpd_req_t *req) {\n    char buf&#91;1024] = {0};\n    \/\/ \u5c06\u6570\u636e\u5b58\u5165buf\n    ssize_t recv_size = httpd_req_recv(req, buf, sizeof(buf)-1);\n    ESP_LOGI(TAG, \"\u63a5\u6536\u5230\u7684\u6570\u636e: %s\", buf);\n    \/\/\u89e3\u6790\u5bf9\u8c61\n    cJSON *root = cJSON_Parse(buf);\n    \/\/\u83b7\u53d6\u8282\u70b9\u6570\u636e\n    cJSON *cod = cJSON_GetObjectItem(root, \"cod\");\n    cJSON *text = cJSON_GetObjectItem(root, \"text\");\n    \/\/\u6253\u5370\u8282\u70b9\u6570\u636e\n    ESP_LOGI(TAG, \"cod: %s, text: %s\", cod-&gt;valuestring, text-&gt;valuestring);\n    \/\/ 1. \u8bbe\u7f6e\u54cd\u5e94\u7c7b\u578b\u4e3a JSON\uff08\u5fc5\u987b\uff0c\u5426\u5219\u5ba2\u6237\u7aef\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u89e3\u6790\uff09\n    httpd_resp_set_type(req, \"application\/json\");\n    \/\/ 2. \u6784\u9020 JSON \u683c\u5f0f\u7684\u5b57\u7b26\u4e32\uff08\u793a\u4f8b\uff1a\u5305\u542b\u72b6\u6001\u548c\u6d88\u606f\u5b57\u6bb5\uff09\n    const char* json_resp = \"{\\\"status\\\": \\\"OK\\\", \\\"message\\\": \\\"\u64cd\u4f5c\u6210\u529f\\\", \\\"code\\\": 200}\";\n    \/\/ 3. \u53d1\u9001 JSON \u54cd\u5e94\uff08\u4f7f\u7528 HTTPD_RESP_USE_STRLEN \u81ea\u52a8\u8ba1\u7b97\u957f\u5ea6\uff09\n    httpd_resp_send(req, json_resp, HTTPD_RESP_USE_STRLEN);\n    return ESP_OK;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">I2C<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-22.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"530\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-22.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-922\"  sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">i2c_master_bus_config_t<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-25.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"776\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-25.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-926\"  sizes=\"(max-width: 938px) 100vw, 938px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">i2c_device_config_t<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-24.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"891\" height=\"443\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-24.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-925\"  sizes=\"(max-width: 891px) 100vw, 891px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f8b\u7a0b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>static void i2c_master_init(i2c_master_bus_handle_t *bus_handle, i2c_master_dev_handle_t *dev_handle)\n{\n    i2c_master_bus_config_t bus_config = {\n        .i2c_port = I2C_MASTER_NUM,\n        .sda_io_num = I2C_MASTER_SDA_IO,\n        .scl_io_num = I2C_MASTER_SCL_IO,\n        .clk_source = I2C_CLK_SRC_DEFAULT,\n        .glitch_ignore_cnt = 7,\n        .flags.enable_internal_pullup = true,\n    };\n    ESP_ERROR_CHECK(i2c_new_master_bus(&amp;bus_config, bus_handle));\n\n    i2c_device_config_t dev_config = {\n        .dev_addr_length = I2C_ADDR_BIT_LEN_7,\n        .device_address = CST816T_ADDR,\n        .scl_speed_hz = I2C_MASTER_FREQ_HZ,\n    };\n    \n    ESP_ERROR_CHECK(i2c_master_bus_add_device(*bus_handle, &amp;dev_config, dev_handle));\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e3b\u673a\u5199\u5165<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-26.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"602\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-26.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-927\"  sizes=\"(max-width: 937px) 100vw, 937px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>static esp_err_t CST816T_register_write_byte(i2c_master_dev_handle_t dev_handle, uint8_t reg_addr, uint8_t data)\n{\n    uint8_t write_buf&#91;2] = {reg_addr, data};\n    return i2c_master_transmit(dev_handle, write_buf, sizeof(write_buf), I2C_MASTER_TIMEOUT_MS \/ portTICK_PERIOD_MS);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e3b\u673a\u8bfb\u53d6<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-27.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"588\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-27.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-928\"  sizes=\"(max-width: 924px) 100vw, 924px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>static esp_err_t CST816T_register_read(i2c_master_dev_handle_t dev_handle, uint8_t reg_addr, uint8_t *data, size_t len)\n{\n    return i2c_master_transmit_receive(dev_handle, &amp;reg_addr, 1, data, len, I2C_MASTER_TIMEOUT_MS \/ portTICK_PERIOD_MS);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">I2S<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">LVGL<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>idf.py add-dependency \"lvgl\/lvgl^8.3.0\"<\/code><\/pre>\n\n\n\n<p>\u5148\u8bbe\u7f6e\u5c4f\u5e55\u7f13\u51b2\u533a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u6839\u636e\u4f60\u7684 ST7789V \u5c4f\u5e55\u4fee\u6539\uff0c\u5982 240x240 \u6216 240x320\uff09\n#define LCD_HOR_RES 240\n#define LCD_VER_RES 320\n\nTaskHandle_t led_task_Handler = NULL;\nstatic lv_disp_draw_buf_t draw_buf;\nstatic lv_color_t buf&#91;LCD_HOR_RES * LCD_VER_RES \/ 4];  \/\/ 240*240\/4 = 14400 \u50cf\u7d20 \u2192 28800 \u5b57\u8282<\/code><\/pre>\n\n\n\n<p>\u8bbe\u7f6eLVGL\u65f6\u949f\u7528\u6765\u68c0\u6d4b\u89e6\u6478\u548c\u52a8\u753b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static esp_timer_handle_t lvgl_tick_timer = NULL;\n \n\/\/ \u5b9a\u65f6\u56de\u8c03\u51fd\u6570\uff0c\u6bcf 1ms \u89e6\u53d1\nstatic void lv_tick_task(void *arg) {\n    lv_tick_inc(1);\n}\n \n\/\/ \u521d\u59cb\u5316 LVGL Tick \u5b9a\u65f6\u5668\nvoid lvgl_tick_timer_init(void) {\n    const esp_timer_create_args_t timer_args = {\n        .callback = &amp;lv_tick_task,\n        .arg = NULL,\n        .dispatch_method = ESP_TIMER_TASK,\n        .name = \"lv_tick_timer\"\n    };\n \n    esp_timer_create(&amp;timer_args, &amp;lvgl_tick_timer);\n    esp_timer_start_periodic(lvgl_tick_timer, 1000); \/\/ 1ms \u89e6\u53d1\n}<\/code><\/pre>\n\n\n\n<p>\u8bbe\u7f6e\u5c4f\u5e55\u521d\u59cb\u5316\u548c\u5c4f\u5e55\u56de\u8c03\u51fd\u6570<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * @brief LVGL \u5237\u65b0\u56de\u8c03\uff1a\u5c06\u6307\u5b9a\u533a\u57df\u7684\u50cf\u7d20\u6570\u636e\u53d1\u9001\u5230 ST7789V\n * @param disp: LVGL \u663e\u793a\u9a71\u52a8\u53e5\u67c4\n * @param area: \u9700\u8981\u5237\u65b0\u7684\u533a\u57df\uff08x1, y1 \u5230 x2, y2\uff09\n * @param color_p: \u8be5\u533a\u57df\u7684\u50cf\u7d20\u6570\u636e\uff08RGB565 \u683c\u5f0f\uff09\n *\/\nstatic void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {\n    uint16_t width = area-&gt;x2 - area-&gt;x1 ;\n    uint16_t height = area-&gt;y2 - area-&gt;y1 ;\n    Lp_x = area-&gt;x1;\n    Lp_y = area-&gt;y1;\n    \n    Lv_x =  area-&gt;x2;\n    Lv_y =  area-&gt;y2;\n\n    L_h = height;\n    L_w = width;\n    LCD_SetWindows(area-&gt;x1, area-&gt;y1, area-&gt;x2, area-&gt;y2);\n    LCD_ShowPicture_16b_s(area-&gt;x1, area-&gt;y1 ,width+1, height+1,(uint16_t *)&amp;color_p-&gt;full);\n    lv_disp_flush_ready(disp);\n}\n\/**\n * @brief \u521d\u59cb\u5316 LVGL \u53ca\u663e\u793a\u9a71\u52a8\n *\/\nstatic void lvgl_init(void) {\n    \/\/ 1. \u521d\u59cb\u5316 LVGL \u6838\u5fc3\u5e93\n    lv_init();\n    \/\/ 2. \u521d\u59cb\u5316\u663e\u793a\u7f13\u51b2\u533a\n    lv_disp_draw_buf_init(&amp;draw_buf, buf, NULL, LCD_HOR_RES * LCD_VER_RES \/ 4);\n    \/\/ 3. \u914d\u7f6e\u663e\u793a\u9a71\u52a8\u53c2\u6570\n    static lv_disp_drv_t disp_drv;\n    lv_disp_drv_init(&amp;disp_drv);  \/\/ \u521d\u59cb\u5316\u9a71\u52a8\u7ed3\u6784\u4f53\n        \/\/ \u8bbe\u7f6e\u5c4f\u5e55\u5206\u8fa8\u7387\n    disp_drv.hor_res = LCD_HOR_RES;\n    disp_drv.ver_res = LCD_VER_RES;\n    \/\/ \u7ed1\u5b9a\u7f13\u51b2\u533a\u548c\u5237\u65b0\u56de\u8c03\n    disp_drv.draw_buf = &amp;draw_buf;\n    disp_drv.flush_cb = my_disp_flush;  \/\/ \u5173\u952e\uff1a\u7ed1\u5b9a\u6211\u4eec\u5b9e\u73b0\u7684\u5237\u65b0\u51fd\u6570\n    lv_disp_drv_register(&amp;disp_drv);  \/\/ \u5173\u952e\uff1a\u4fdd\u5b58\u663e\u793a\u8bbe\u5907\u53e5\u67c4\n}<\/code><\/pre>\n\n\n\n<p>\u8bbe\u7f6e\u89e6\u6478\u5c4f\u521d\u59cb\u5316\u548c\u56de\u8c03\u51fd\u6570<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static int32_t last_x = 0;  \/\/ \u8bb0\u5f55\u4e0a\u6b21\u5750\u6807\uff08\u677e\u5f00\u65f6\u6cbf\u7528\uff09\nstatic int32_t last_y = 0;\n\/**\n * @brief LVGL \u5237\u65b0\u56de\u8c03\uff1a\u5c06\u6307\u5b9a\u89e6\u6478\u70b9\u7684\u6570\u636e\u4f20\u9012\u7ed9 LVGL\n * @param disp: LVGL \u663e\u793a\u9a71\u52a8\u53e5\u67c4\n * @param area: \u9700\u8981\u5237\u65b0\u7684\u533a\u57df\uff08x1, y1 \u5230 x2, y2\uff09\n * @param color_p: \u8be5\u533a\u57df\u7684\u50cf\u7d20\u6570\u636e\uff08RGB565 \u683c\u5f0f\uff09\n *\/\nstatic void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) {\n    int32_t raw_x, raw_y;\n    int32_t lcd_x, lcd_y;\n\n    \/\/ \u8bfb\u53d6\u539f\u59cb\u89e6\u6478\u6570\u636e\n    if (!IsTouchPressed()) {\n        \/\/ \u8f6c\u6362\u4e3aLCD\u5750\u6807\uff08\u6821\u51c6\uff09\n        data-&gt;state = LV_INDEV_STATE_PRESSED;  \/\/ \u6309\u4e0b\u72b6\u6001\n    } else {\n        data-&gt;state = LV_INDEV_STATE_RELEASED;  \/\/ \u677e\u5f00\u72b6\u6001\n    }\n\n    \/\/ \u586b\u5145\u5750\u6807\uff08\u677e\u5f00\u65f6\u4f7f\u7528\u4e0a\u6b21\u5750\u6807\uff09\n    data-&gt;point.x = touch.X;\n    data-&gt;point.y = touch.Y;\n    \/\/ printf(\"1\\r\\n\");\n\n    last_x = touch.X;\n    last_y = touch.Y;\n}\n\n\n\/**\n * @brief \u521d\u59cb\u5316 LVGL\u89e6\u6478\u9a71\u52a8\n *\/\nvoid lv_touch_init(void) {\n\n    static lv_indev_drv_t indev_drv;  \/\/ \u8f93\u5165\u8bbe\u5907\u9a71\u52a8\u7ed3\u6784\u4f53\n\n    \/\/ \u521d\u59cb\u5316\u9a71\u52a8\n    lv_indev_drv_init(&amp;indev_drv);\n    indev_drv.type = LV_INDEV_TYPE_POINTER;  \/\/ \u7c7b\u578b\uff1a\u6307\u9488\u8bbe\u5907\uff08\u89e6\u6478\u5c4f\uff09\n    indev_drv.read_cb = touchpad_read;       \/\/ \u7ed1\u5b9a\u8bfb\u53d6\u56de\u8c03\n\n    \/\/ \u6ce8\u518c\u8bbe\u5907\uff08\u8fd4\u56de\u8bbe\u5907\u53e5\u67c4\uff0c\u53ef\u7528\u4e8e\u540e\u7eed\u914d\u7f6e\uff09\n    touch_indev = lv_indev_drv_register(&amp;indev_drv);\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">lvgl\u9875\u9762\u8bbe\u7f6e<\/h2>\n\n\n\n<p>\u4f7f\u7528NXP\u7684GUI-Guider-1.10.0-GA\u8f6f\u4ef6\u7ed8\u5236\u9875\u9762<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-29-1024x469.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"469\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-29-1024x469.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-976\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-30-1024x780.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"780\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-30-1024x780.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-977\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-31.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"944\" height=\"882\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-31.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-978\"  sizes=\"(max-width: 944px) 100vw, 944px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">lvgl\u589e\u52a0\u5e27\u7387<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/b8b8516a3ed622c19ef8f94d583d34313494372752493102-1024x725.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"725\" data-original=\"\/wp-content\/uploads\/2025\/08\/b8b8516a3ed622c19ef8f94d583d34313494372752493102-1024x725.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-970\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>LV_USE_PERF_MONITOR \u8bbe\u7f6e\u4e3a1\u5f00\u542f\u5e27\u7387\u663e\u793a\nlv_obj_set_style_text_font(label, &amp;lv_font_montserrat_8, 0); \/\/ \u4f7f\u7528 8px \u5b57\u4f53\u5b57\u4f53\u8bbe\u7f6e\u53ef\u653e\u4e3b\u51fd\u6570\nLV_DISP_DEF_REFR_PERIOD \u8bbe\u7f6e\u5e27\u7387<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">lvgl\u8bbe\u7f6e\u5c4f\u5e55\u53cc\u7f13\u5b58<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-28.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"354\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-28.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-973\"  sizes=\"(max-width: 803px) 100vw, 803px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">MQTT<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-36.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"987\" height=\"272\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-36.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-989\"  sizes=\"(max-width: 987px) 100vw, 987px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>void mqtt_app_start(void)\n{\n    esp_mqtt_client_config_t mqtt_cfg = {\n        .broker.address.uri = CONFIG_BROKER_URL,\n    };\n    client = esp_mqtt_client_init(&amp;mqtt_cfg);\n\n    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);\n    esp_mqtt_client_start(client);\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">esp_mqtt_client_publish<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">esp_mqtt_client_subscribe<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">event_id<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">esp_mqtt_event_handle_t<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">esp_mqtt_client_handle_t<\/h3>\n\n\n\n<h2 class=\"wp-block-heading\">ESP_NOW<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-32.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"933\" height=\"245\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-32.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-983\"  sizes=\"(max-width: 933px) 100vw, 933px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/\/ 2. \u521d\u59cb\u5316ESP-NOW\n    ESP_ERROR_CHECK(esp_now_init());\n    \/\/ 3. \u6ce8\u518c\u53d1\u9001\/\u63a5\u6536\u56de\u8c03\n    ESP_ERROR_CHECK(esp_now_register_send_cb(espnow_send_cb));\n    ESP_ERROR_CHECK(esp_now_register_recv_cb(espnow_recv_cb));\n    \/\/ 4. \u8bbe\u7f6e\u4e3b\u5bc6\u94a5\uff08\u6240\u6709\u8bbe\u5907\u5fc5\u987b\u4e00\u81f4\uff09\n    \/\/ ESP_ERROR_CHECK(esp_now_set_pmk((uint8_t *)ESPNOW_PMK));\n    \/\/ 5. \u6dfb\u52a0\u5e7f\u64ad\u5bf9\u7b49\u4f53\uff08\u7528\u4e8e\u53d1\u9001\u53d1\u73b0\u5305\uff09\n\n    uint8_t broadcast_mac&#91;ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\n    add_peer_if_not_exists(broadcast_mac);\n    ESP_LOGI(TAG, \"ESP-NOW\u521d\u59cb\u5316\u5b8c\u6210\uff08\u4e3b\u8bbe\u5907\u6a21\u5f0f\uff09\");\n\n\n    xTaskCreate(master_task, \"master_task\", 4096, NULL, 5, NULL);\n    ESP_LOGI(TAG, \"\u4e3b\u8bbe\u5907\u542f\u52a8\u5b8c\u6210\uff0c\u7b49\u5f85\u4ece\u8bbe\u5907\u6ce8\u518c...\");<\/code><\/pre>\n\n\n\n<p>\u63a5\u6536\u56de\u8c03<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> * @brief ESP-NOW\u63a5\u6536\u56de\u8c03\uff08\u5904\u7406\u4ece\u8bbe\u5907\u7684\u6ce8\u518c\u5305\u3001\u5fc3\u8df3\u54cd\u5e94\uff09\n * @param recv_info \u63a5\u6536\u4fe1\u606f\uff08\u6e90MAC\u3001\u76ee\u6807MAC\uff09\n * @param data \u63a5\u6536\u7684\u6570\u636e\n * @param len \u6570\u636e\u957f\u5ea6\n *\/\nstatic void espnow_recv_cb(const esp_now_recv_info_t *recv_info, const uint8_t *data, int len) {\n    if (recv_info == NULL || data == NULL || len &lt; sizeof(espnow_packet_t)) {\n        ESP_LOGE(TAG, \"\u63a5\u6536\u56de\u8c03\u53c2\u6570\u65e0\u6548\uff08\u957f\u5ea6\uff1a%d\uff09\", len);\n        return;\n    }\n    espnow_packet_t *pkg = (espnow_packet_t *)data;\n    uint16_t crc_cal = 0;\n    uint16_t crc_pkg = pkg->crc;\n\n    \/\/ 1. CRC\u6821\u9a8c\uff08\u786e\u4fdd\u6570\u636e\u672a\u635f\u574f\uff09\n    pkg->crc = 0; \/\/ \u6e05\u7a7aCRC\u5b57\u6bb5\u540e\u91cd\u65b0\u8ba1\u7b97\n    crc_cal = espnow_crc16((uint8_t *)pkg, len);\n    if (crc_cal != crc_pkg) {\n        ESP_LOGE(TAG, \"CRC\u6821\u9a8c\u5931\u8d25\");\n        return;\n    }\n\n    \/\/ 2. \u6839\u636e\u6570\u636e\u5305\u7c7b\u578b\u5904\u7406\n    switch (pkg->type) {\n        case DATA_TYPE_REGISTER: {\n            \/\/ \u6536\u5230\u4ece\u8bbe\u5907\u6ce8\u518c\u5305 \u2192 \u6dfb\u52a0\u5230\u5217\u8868\n            ESP_LOGI(TAG, \"\u6536\u5230\u4ece\u8bbe\u5907\u6ce8\u518c\u8bf7\u6c42\uff1a\");\n            print_mac(pkg->src_mac);\n            slave_list_add(pkg->src_mac);\n            break;\n        }\n        case DATA_TYPE_HEARTBEAT: {\n            \/\/ \u6536\u5230\u4ece\u8bbe\u5907\u5fc3\u8df3\u54cd\u5e94 \u2192 \u66f4\u65b0\u6700\u540e\u54cd\u5e94\u65f6\u95f4\n            int idx = slave_list_find(pkg->src_mac)+1;\n            if (idx) {\n                s_slave_list&#91;idx-1].last_heartbeat = esp_timer_get_time() \/ 1000;\n                printf(\"\u6536\u5230\u5fc3\u8df3\u54cd\u5e94:\");\n                print_mac(pkg->src_mac);\n            }\n            break;\n        }\n        default:\n            ESP_LOGW(TAG, \"\u6536\u5230\u672a\u77e5\u7c7b\u578b\u6570\u636e\u5305\uff1a%d\", pkg->type);\n            break;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u82e5\u8981\u5e7f\u64ad\u5219\u9700\u8981\u5c06MAC\u5730\u5740\u8bbe\u7f6e\u4e3a{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-33-1024x587.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"587\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-33-1024x587.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-985\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u6838\u5fc3\u7ed3\u6784<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-34.png'><img class=\"lazyload lazyload-style-7\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"263\" data-original=\"\/wp-content\/uploads\/2025\/08\/\u56fe\u7247-34.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-986\"  sizes=\"(max-width: 629px) 100vw, 629px\" \/><\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u5f55\u7ed3\u6784 Linux\u4e0bIDF\u547d\u4ee4 monitor\u5feb\u6377\u952e \u5916\u8bbe \u5f15\u811a\u5b9a\u4e49 \u5f15\u811a\u4e2d\u65ad\u914d\u7f6e \u4e2d\u65ad\u51fd\u6570 \u7cfb\u7edf Free [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38],"tags":[],"class_list":["post-790","post","type-post","status-publish","format-standard","hentry","category-esp32"],"_links":{"self":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts\/790"}],"collection":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=790"}],"version-history":[{"count":47,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/790\/revisions"}],"predecessor-version":[{"id":1001,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/790\/revisions\/1001"}],"wp:attachment":[{"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=790"},{"taxonomy":"post_tag","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}