From ffd5b181e6b1cc65bf8aed42f2ee8aaf3246d734 Mon Sep 17 00:00:00 2001 From: Xu Xin Date: Fri, 24 Nov 2023 15:10:22 +0800 Subject: [PATCH] update box3 component and doc --- README.md | 13 +- README_cn.md | 9 +- components/bsp/idf_component.yml | 2 +- components/bsp/include/bsp_board.h | 2 +- .../bsp/src/boards/esp32_bsp_no_sensor.c | 2 +- components/bsp/src/boards/esp32_bsp_sensor.c | 58 +- docs/_static/_get_started_static/23.1.png | Bin 26054 -> 12664 bytes docs/_static/_get_started_static/23.png | Bin 29047 -> 12776 bytes docs/_static/_get_started_static/24.png | Bin 37090 -> 16682 bytes docs/_static/_get_started_static/25.png | Bin 38355 -> 17017 bytes docs/_static/_get_started_static/26.png | Bin 0 -> 17294 bytes docs/_static/_get_started_static/27.png | Bin 34868 -> 16119 bytes docs/_static/_get_started_static/28.png | Bin 36456 -> 16574 bytes docs/_static/_get_started_static/29.png | Bin 35213 -> 16456 bytes docs/_static/_get_started_static/30.png | Bin 31115 -> 15637 bytes docs/_static/_get_started_static/31.png | Bin 45243 -> 13129 bytes .../great_projects_picture/esp-box-emu1.png | Bin 0 -> 456431 bytes .../great_projects_picture/esp-box-emu2.jpg | Bin 0 -> 311793 bytes .../great_projects_picture/joystick.png | Bin 0 -> 1342957 bytes .../great_projects_picture/willow1.png | Bin 0 -> 42747 bytes .../great_projects_picture/willow2.jpg | Bin 0 -> 256270 bytes docs/getting_started.md | 20 +- docs/getting_started_cn.md | 36 +- docs/great_projects.md | 63 + .../hardware_overview_for_box_3.md | 2 +- .../hardware_overview_for_box_3_cn.md | 2 +- .../chmorgan__esp-audio-player/README.md | 4 - examples/chatgpt_demo/main/app/app_audio.h | 3 +- .../chatgpt_demo/main/settings/settings.h | 3 +- .../espressif__aht20/CMakeLists.txt | 9 - .../components/espressif__aht20/README.md | 14 - .../components/espressif__aht20/aht20.c | 194 --- .../espressif__aht20/idf_component.yml | 6 - .../espressif__aht20/include/aht20.h | 92 -- .../components/espressif__aht20/license.txt | 202 --- .../espressif__aht20/priv_include/aht20_reg.h | 18 - .../espressif__aht20/test_apps/CMakeLists.txt | 8 - .../test_apps/main/CMakeLists.txt | 3 - .../test_apps/main/aht20_test.c | 105 -- .../espressif__at581x/CMakeLists.txt | 8 - .../components/espressif__at581x/README.md | 11 - .../components/espressif__at581x/at581x.c | 228 --- .../espressif__at581x/idf_component.yml | 6 - .../espressif__at581x/include/at581x.h | 199 --- .../espressif__at581x/include/at581x_reg.h | 74 - .../components/espressif__at581x/license.txt | 202 --- .../test_apps/CMakeLists.txt | 8 - .../test_apps/main/CMakeLists.txt | 3 - .../test_apps/main/at581x_test.c | 124 -- .../espressif__button/.component_hash | 1 - .../components/espressif__button/CHANGELOG.md | 33 - .../espressif__button/CMakeLists.txt | 15 - .../components/espressif__button/Kconfig | 55 - .../components/espressif__button/README.md | 29 - .../components/espressif__button/button_adc.c | 310 ---- .../espressif__button/button_gpio.c | 57 - .../components/espressif__button/component.mk | 8 - .../espressif__button/idf_component.yml | 11 - .../espressif__button/include/button_adc.h | 76 - .../espressif__button/include/button_gpio.h | 54 - .../espressif__button/include/iot_button.h | 190 --- .../components/espressif__button/iot_button.c | 396 ----- .../components/espressif__button/license.txt | 202 --- .../test_apps/CMakeLists.txt | 9 - .../test_apps/main/CMakeLists.txt | 9 - .../test_apps/main/button_test.c | 477 ------ .../test_apps/main/component.mk | 5 - .../test_apps/pytest_button.py | 20 - .../test_apps/sdkconfig.defaults | 9 - .../espressif__ir_learn/CMakeLists.txt | 11 - .../components/espressif__ir_learn/Kconfig | 18 - .../components/espressif__ir_learn/README.md | 29 - .../espressif__ir_learn/idf_component.yml | 15 - .../espressif__ir_learn/include/ir_encoder.h | 38 - .../espressif__ir_learn/include/ir_learn.h | 176 --- .../espressif__ir_learn/ir_encoder.c | 105 -- .../components/espressif__ir_learn/ir_learn.c | 561 ------- .../espressif__ir_learn/license.txt | 202 --- .../priv_include/ir_learn_err_check.h | 23 - .../test_apps/CMakeLists.txt | 9 - .../test_apps/main/CMakeLists.txt | 3 - .../test_apps/main/ir_learn_test.c | 314 ---- .../test_apps/partitions.csv | 7 - .../test_apps/sdkconfig.defaults | 10 - examples/factory_demo/main/app/app_sr.c | 41 +- examples/factory_demo/main/app/app_sr.h | 2 + .../factory_demo/main/app/app_sr_handler.c | 16 +- examples/factory_demo/main/app/file_manager.c | 18 +- examples/factory_demo/main/app/file_manager.h | 18 +- .../main/gui/font/font_cn_gb2_16.c | 1368 +++++++++++++++++ .../factory_demo/main/gui/ui_boot_animate.c | 1 + examples/factory_demo/main/gui/ui_player.c | 18 +- .../factory_demo/main/gui/ui_sensor_monitor.c | 404 ++--- .../factory_demo/main/gui/ui_sensor_monitor.h | 26 +- examples/factory_demo/main/idf_component.yml | 5 +- examples/factory_demo/main/main.h | 2 +- examples/lv_demos/main/lv_demos.c | 8 +- .../matter_switch/main/app/file_manager.c | 18 +- .../matter_switch/main/app/file_manager.h | 18 +- examples/matter_switch/main/app_driver.cpp | 872 +++++------ examples/matter_switch/main/app_main.cpp | 25 +- examples/matter_switch/main/app_priv.h | 10 +- .../main/zap-generated/empty_file.cpp | 9 +- examples/usb_headset/main/include/display.h | 6 +- .../usb_headset/main/include/fft_convert.h | 6 +- .../usb_headset/main/include/tusb_config.h | 5 +- .../main/include/usb_descriptors.h | 5 +- .../usb_headset/main/include/usb_headset.h | 11 +- examples/usb_headset/main/main.c | 5 +- examples/usb_headset/main/src/display.c | 8 +- examples/usb_headset/main/src/fft_convert.c | 8 +- .../usb_headset/main/src/usb_descriptors.c | 5 +- examples/usb_headset/main/src/usb_headset.c | 5 +- .../watering_demo/main/app/app_humidity.c | 8 +- .../watering_demo/main/app/app_humidity.h | 2 +- examples/watering_demo/main/app/app_nvs.c | 8 +- examples/watering_demo/main/app/app_pump.c | 8 +- .../watering_demo/main/app/app_sr_handler.c | 8 +- examples/watering_demo/main/app/app_wifi.c | 8 +- .../watering_demo/main/gui/ui_boot_animate.c | 21 +- .../watering_demo/main/gui/ui_boot_animate.h | 5 + examples/watering_demo/main/gui/ui_main.c | 8 +- examples/watering_demo/main/gui/ui_sr.c | 4 +- examples/watering_demo/main/gui/ui_sr.h | 21 +- examples/watering_demo/main/main.c | 8 +- tools/ci/check_copyright_config.yaml | 11 +- tools/ci/ignore_list_copyright.txt | 5 + 127 files changed, 2332 insertions(+), 5956 deletions(-) create mode 100644 docs/_static/_get_started_static/26.png create mode 100644 docs/_static/great_projects_picture/esp-box-emu1.png create mode 100644 docs/_static/great_projects_picture/esp-box-emu2.jpg create mode 100644 docs/_static/great_projects_picture/joystick.png create mode 100644 docs/_static/great_projects_picture/willow1.png create mode 100644 docs/_static/great_projects_picture/willow2.jpg create mode 100644 docs/great_projects.md delete mode 100644 examples/factory_demo/components/espressif__aht20/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__aht20/README.md delete mode 100644 examples/factory_demo/components/espressif__aht20/aht20.c delete mode 100644 examples/factory_demo/components/espressif__aht20/idf_component.yml delete mode 100644 examples/factory_demo/components/espressif__aht20/include/aht20.h delete mode 100644 examples/factory_demo/components/espressif__aht20/license.txt delete mode 100644 examples/factory_demo/components/espressif__aht20/priv_include/aht20_reg.h delete mode 100644 examples/factory_demo/components/espressif__aht20/test_apps/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__aht20/test_apps/main/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__aht20/test_apps/main/aht20_test.c delete mode 100644 examples/factory_demo/components/espressif__at581x/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__at581x/README.md delete mode 100644 examples/factory_demo/components/espressif__at581x/at581x.c delete mode 100644 examples/factory_demo/components/espressif__at581x/idf_component.yml delete mode 100644 examples/factory_demo/components/espressif__at581x/include/at581x.h delete mode 100644 examples/factory_demo/components/espressif__at581x/include/at581x_reg.h delete mode 100644 examples/factory_demo/components/espressif__at581x/license.txt delete mode 100644 examples/factory_demo/components/espressif__at581x/test_apps/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__at581x/test_apps/main/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__at581x/test_apps/main/at581x_test.c delete mode 100644 examples/factory_demo/components/espressif__button/.component_hash delete mode 100644 examples/factory_demo/components/espressif__button/CHANGELOG.md delete mode 100644 examples/factory_demo/components/espressif__button/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__button/Kconfig delete mode 100644 examples/factory_demo/components/espressif__button/README.md delete mode 100644 examples/factory_demo/components/espressif__button/button_adc.c delete mode 100644 examples/factory_demo/components/espressif__button/button_gpio.c delete mode 100644 examples/factory_demo/components/espressif__button/component.mk delete mode 100644 examples/factory_demo/components/espressif__button/idf_component.yml delete mode 100644 examples/factory_demo/components/espressif__button/include/button_adc.h delete mode 100644 examples/factory_demo/components/espressif__button/include/button_gpio.h delete mode 100644 examples/factory_demo/components/espressif__button/include/iot_button.h delete mode 100644 examples/factory_demo/components/espressif__button/iot_button.c delete mode 100644 examples/factory_demo/components/espressif__button/license.txt delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/main/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/main/button_test.c delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/main/component.mk delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/pytest_button.py delete mode 100644 examples/factory_demo/components/espressif__button/test_apps/sdkconfig.defaults delete mode 100644 examples/factory_demo/components/espressif__ir_learn/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__ir_learn/Kconfig delete mode 100644 examples/factory_demo/components/espressif__ir_learn/README.md delete mode 100644 examples/factory_demo/components/espressif__ir_learn/idf_component.yml delete mode 100644 examples/factory_demo/components/espressif__ir_learn/include/ir_encoder.h delete mode 100644 examples/factory_demo/components/espressif__ir_learn/include/ir_learn.h delete mode 100644 examples/factory_demo/components/espressif__ir_learn/ir_encoder.c delete mode 100644 examples/factory_demo/components/espressif__ir_learn/ir_learn.c delete mode 100644 examples/factory_demo/components/espressif__ir_learn/license.txt delete mode 100644 examples/factory_demo/components/espressif__ir_learn/priv_include/ir_learn_err_check.h delete mode 100644 examples/factory_demo/components/espressif__ir_learn/test_apps/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__ir_learn/test_apps/main/CMakeLists.txt delete mode 100644 examples/factory_demo/components/espressif__ir_learn/test_apps/main/ir_learn_test.c delete mode 100644 examples/factory_demo/components/espressif__ir_learn/test_apps/partitions.csv delete mode 100644 examples/factory_demo/components/espressif__ir_learn/test_apps/sdkconfig.defaults create mode 100644 examples/factory_demo/main/gui/font/font_cn_gb2_16.c diff --git a/README.md b/README.md index 03ff8d6..245fe93 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ **Important Note:** -> Upon receiving the ESP32-S3-BOX-3, we advise updating the built-in factory firmware to ensure you have the latest bugfixes via Espressif's online firmware flashing tool ESP Launchpad. Up till now, the latest version is **ESP-BOX-3_Demo_V1.2.3**. To verify the software version, please go to the 'About Us' Page. +> Upon receiving the ESP32-S3-BOX-3, we advise updating the built-in factory firmware to ensure you have the latest bugfixes via Espressif's online firmware flashing tool ESP Launchpad. Up till now, the latest version is **ESP-BOX-3_Demo_V1.2.4**. To verify the software version, please go to the 'About Us' Page. -The ESP-BOX is an advanced AIoT, Edge AI, and IIoT applications development platform released by Espressif Systems. The ESP32-S3-BOX, ESP32-S3-BOX-Lite, and ESP32-S3-BOX-3 are a series of development boards designed for this platform, they are built on Espressif’s powerful ESP32-S3 Wi-Fi + Bluetooth 5 (LE) SoC and feature compact and beautiful enclosures. Leveraging the multi-functional accessories and reliable examples from the repo’s, these development boards cater to both prototyping new projects and building complex IoT systems, providing a perfect balance of form and function. +The ESP-BOX is an advanced AIoT, Edge AI, and IIoT applications development platform released by Espressif Systems. The ESP32-S3-BOX, ESP32-S3-BOX-Lite, and ESP32-S3-BOX-3 are a series of development boards designed for this platform, they are built on Espressif’s powerful ESP32-S3 Wi-Fi + Bluetooth 5 (LE) SoC and feature compact and beautiful enclosures. Leveraging the multi-functional accessories and reliable examples from the repo’s, these development boards cater to both prototyping new projects and building complex IoT systems, providing a perfect balance of form and function. ESP-BOX provides a platform for developing applications in various domains, including Offline Voice Assistants, Online AI Chatbots (developed using OpenAI and other large language model platforms), Matter Device/Controller, Robot Controller, USB Device/Host, Wireless Sensor Application and a wide range of Human Machine Interaction (HMI) applications. Experience the possibilities—add one to your toolkit and explore the limitless potential! @@ -66,7 +66,7 @@ ESP-BOX provides a platform for developing applications in various domains, incl * [Built-in Firmware Source Code](./examples/factory_demo) * [Other Examples](./examples) -> Based on [Apache 2.0](https://github.com/espressif/esp-box/blob/master/LICENSE) open source license, you can modify, develop, or distribute the contents freely. +> Based on [Apache 2.0](https://github.com/espressif/esp-box/blob/master/LICENSE) open source license, you can modify, develop, or distribute the contents freely. ## Built-in Firmware User Guide @@ -83,7 +83,7 @@ ESP-BOX provides a platform for developing applications in various domains, incl ## Developer Guide -ESP-BOX integrates ESP-IDF components commonly used in AIoT development from [ESP Registry](https://components.espressif.com/components?q=lcd) that you can leverage to build your own applications. +ESP-BOX integrates ESP-IDF components commonly used in AIoT development from [ESP Registry](https://components.espressif.com/components?q=lcd) that you can leverage to build your own applications. ### Quick Start @@ -104,6 +104,9 @@ For developer, we offer [ESP RainMaker](https://rainmaker.espressif.com/) soluti ### NuttX The ESP32-S3-BOX-3 also supports integration with [NuttX](https://github.com/apache/nuttx/tree/master/boards/xtensa/esp32s3/esp32s3-box), offering further flexibility and functionality. Nuttx is a real-time operating system (RTOS) known for its compact size, efficiency, and real-time performance, making it an excellent choice for embedded systems. +### Great Projects from Developers +We actively collect [outstanding projects](./docs/great_projects.md) based on ESP-BOX to inspire more developers to innovate. We thank the enthusiasts promoting thriving community culture and welcome more developers to contribute to the vibrant ESP32 community. + ## Contact Us * If you have any technical issues, please submit issue tickets at [GitHub Issues](https://github.com/espressif/esp-box/issues) or forum [esp32.com](https://esp32.com/) for help. @@ -111,5 +114,5 @@ The ESP32-S3-BOX-3 also supports integration with [NuttX](https://github.com/apa ## Contributing Examples -We welcome any open-source software or hardware contribution. If you have any examples you want to share with us, please click the [Contributions Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/contribute/index.html) and commit to the [Pull Requests](https://github.com/espressif/esp-box/pulls) to contribute your code. +We welcome any open-source software or hardware contribution. If you have any examples you want to share with us, please click the [Contributions Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/contribute/index.html) and commit to the [Pull Requests](https://github.com/espressif/esp-box/pulls) to contribute your code. diff --git a/README_cn.md b/README_cn.md index b4eb5b7..66678f8 100644 --- a/README_cn.md +++ b/README_cn.md @@ -23,7 +23,7 @@ **重要提醒:** -> 在收到 ESP32-S3-BOX-3 后,我们建议您更新内置的出厂固件,以确保拥有最新的 bug 修复。您可以使用乐鑫在线固件烧录工具 ESP Launchpad 进行此操作。截止目前,最新版本为 **ESP-BOX-3_Demo_V1.2.3**。请前往“About Us”页面验证设备出厂固件版本。 +> 在收到 ESP32-S3-BOX-3 后,我们建议您更新内置的出厂固件,以确保拥有最新的 bug 修复。您可以使用乐鑫在线固件烧录工具 ESP Launchpad 进行此操作。截止目前,最新版本为 **ESP-BOX-3_Demo_V1.2.4**。请前往 “About Us” 页面验证设备出厂固件版本。 ESP-BOX 是乐鑫科技推出的面向 AIoT、边缘 AI 和 IIoT 应用的开发平台。ESP32-S3-BOX、ESP32-S3-BOX-Lite 和 ESP32-S3-BOX-3 是为该平台设计的系列开发板,它们基于乐鑫强大的 ESP32-S3 Wi-Fi + Bluetooth 5(LE) SoC 构建,并拥有紧凑美观的外壳结构。借助多功能配件和 ESP-BOX 项目内的可靠例程,这些开发板既适用于构建新项目原型,也适用于打造复杂的物联网系统,提供了形式上和功能上的完美平衡。 @@ -99,7 +99,7 @@ ESP-BOX 调用乐鑫 ESP-IDF 的包管理器 [ESP Registry](https://components.e ESP BOX APP 基于商业版 Nova Home 应用 APP 构建,拥有精美的用户界面和更好的用户体验,但由于 Nova Home App 有限开放,客户如需项目资源,可通过 sales@espressif.com 邮件与我们联系。 对于个人开发者,我们提供 [ESP RainMaker](https://rainmaker.espressif.com/zh-hans/) 解决方案,其中包括公开可用的开发文档和 API 指南。以下是开发资源访问路径: -- [ESP RainMaker 快速入门](https://rainmaker.espressif.com/docs/get-started.html) +- [ESP RainMaker 快速入门](https://rainmaker.espressif.com/docs/get-started.html) - [RainMaker App API 定义](https://swaggerapis.rainmaker.espressif.com) - [ESP RainMaker 编程指南](https://docs.espressif.com/projects/esp-rainmaker/en/latest/index.html#) @@ -107,11 +107,14 @@ ESP BOX APP 基于商业版 Nova Home 应用 APP 构建,拥有精美的用户 ### NuttX ESP32-S3-BOX-3 支持与 [NuttX](https://github.com/apache/nuttx/tree/master/boards/xtensa/esp32s3/esp32s3-box) 集成,提供了更多的灵活性和功能。Nuttx 是一款以其小巧、高效和实时性能而闻名的实时操作系统(RTOS),使其成为嵌入式系统的绝佳选择。 +### 优秀开源社区项目 +我们积极搜集基于 ESP-BOX 的[优秀项目](./docs/great_projects.md),以激发更多 makers 的创新思维。我们对推动社区文化繁荣的倡导者表示由衷的感谢,并欢迎更多的开发人员为充满活力的ESP32社区贡献力量。 + ## 联系我们 * 如果有任何开发和使用问题,您可添加 [GitHub Issues](https://github.com/espressif/esp-box/issues) 或到 [esp32.com](https://esp32.com/) 论坛寻求帮助; * 如果你对 ESP-BOX 项目感兴趣,欢迎到论坛 [ESP-BOX 版块](https://www.esp32.com/viewforum.php?f=43)交流想法。 -## 贡献示例 +## 贡献示例 我们欢迎任何软件或硬件相关的开源贡献,如果您有任何要与我们分享的示例,请参考[贡献指南](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/contribute/index.html)后提交 [Pull Requests](https://github.com/espressif/esp-box/pulls) 贡献代码。 diff --git a/components/bsp/idf_component.yml b/components/bsp/idf_component.yml index 77e35eb..3797f38 100644 --- a/components/bsp/idf_component.yml +++ b/components/bsp/idf_component.yml @@ -4,7 +4,7 @@ dependencies: espressif/esp-box: version: "3.*" require: "no" - + espressif/esp-box-lite: version: "2.*" require: "no" diff --git a/components/bsp/include/bsp_board.h b/components/bsp/include/bsp_board.h index f4d22ce..5d47605 100644 --- a/components/bsp/include/bsp_board.h +++ b/components/bsp/include/bsp_board.h @@ -133,7 +133,7 @@ typedef bottom_id_t (*bsp_sys_get_bottom_id)(); * - ESP_OK: read successfully * - ESP_FAIL: read failed */ -typedef esp_err_t (*bsp_bottom_get_humiture)(float *temperature, uint8_t *humidity); +typedef esp_err_t (*bsp_bottom_get_humiture)(float *temperature, float *humidity); /** * @brief Player set mute. diff --git a/components/bsp/src/boards/esp32_bsp_no_sensor.c b/components/bsp/src/boards/esp32_bsp_no_sensor.c index 369fdf0..abdbf9b 100644 --- a/components/bsp/src/boards/esp32_bsp_no_sensor.c +++ b/components/bsp/src/boards/esp32_bsp_no_sensor.c @@ -30,7 +30,7 @@ static void bsp_sensor_set_radar_enable(bool enable) return; } -static esp_err_t bsp_sensor_get_humiture(float *temperature, uint8_t *humidity) +static esp_err_t bsp_sensor_get_humiture(float *temperature, float *humidity) { return ESP_FAIL; } diff --git a/components/bsp/src/boards/esp32_bsp_sensor.c b/components/bsp/src/boards/esp32_bsp_sensor.c index 0167416..6c8196f 100644 --- a/components/bsp/src/boards/esp32_bsp_sensor.c +++ b/components/bsp/src/boards/esp32_bsp_sensor.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -21,8 +21,8 @@ static bool sys_sleep_entered = false; static bottom_id_t sys_bottom_id; -static float sys_temperature_value; -static uint8_t sys_humidity_value; +static float sys_temp_result; +static float sys_RH_result; static uint16_t power_off_delay; static aht20_dev_handle_t aht20 = NULL; @@ -66,11 +66,11 @@ static void bsp_sensor_set_radar_onoff(bool enable) } } -static esp_err_t bsp_sensor_get_humiture(float *temperature, uint8_t *humidity) +static esp_err_t bsp_sensor_get_humiture(float *temperature, float *humidity) { if (BOTTOM_ID_SENSOR == sys_bottom_id) { - *temperature = sys_temperature_value; - *humidity = sys_humidity_value; + *temperature = sys_temp_result; + *humidity = sys_RH_result; return ESP_OK; } else { return ESP_FAIL; @@ -80,7 +80,7 @@ static esp_err_t bsp_sensor_get_humiture(float *temperature, uint8_t *humidity) static void low_power_monitor_task(void *arg) { static uint8_t gpio_level_prev = 1; - uint32_t temperature_raw, humidity_raw; + uint32_t temp_raw, RH_raw; uint8_t gpio_level; gpio_config_t io_conf = {}; @@ -95,21 +95,15 @@ static void low_power_monitor_task(void *arg) vTaskDelay(pdMS_TO_TICKS(1000)); if (sys_bottom_id != BOTTOM_ID_UNKNOW) { - if (bsp_i2c_device_probe(BSP_I2C_EXPAND_NUM, AT581X_ADDRRES_0)) { - if (sys_bottom_id == BOTTOM_ID_LOST) { - ESP_LOGE(TAG, "Sensor bottom connected"); - sys_bottom_id = BOTTOM_ID_SENSOR; - } - } else { - if (sys_bottom_id == BOTTOM_ID_SENSOR) { - ESP_LOGE(TAG, "Sensor bottom lost"); - sys_bottom_id = BOTTOM_ID_LOST; - } - } + sys_bottom_id = (bsp_i2c_device_probe(BSP_I2C_EXPAND_NUM, AT581X_ADDRRES_0)) ? BOTTOM_ID_SENSOR : BOTTOM_ID_LOST; } if (BOTTOM_ID_SENSOR == sys_bottom_id) { gpio_level = gpio_get_level(BSP_RADAR_OUT_IO); + if ((RADAE_FUNC_STOP != power_off_delay) && power_off_delay) { + power_off_delay--; + } + aht20_read_temperature_humidity(aht20, &temp_raw, &sys_temp_result, &RH_raw, &sys_RH_result); } else { gpio_level = 1; } @@ -118,14 +112,14 @@ static void low_power_monitor_task(void *arg) gpio_level_prev = gpio_level; if (gpio_level && (RADAE_FUNC_STOP != power_off_delay)) { power_off_delay = RADAE_POWER_DELAY; - ESP_LOGI(TAG, "Radar: %s", "active"); + ESP_LOGD(TAG, "Radar: %s", "active"); } } if ((gpio_level) && (true == sys_sleep_entered)) { bsp_pm_exit_sleep(); - ESP_LOGI(TAG, "power on"); + ESP_LOGD(TAG, "power on"); bsp_display_exit_sleep(); lvgl_port_resume(); @@ -133,7 +127,7 @@ static void low_power_monitor_task(void *arg) bsp_codec_dev_resume(); sys_sleep_entered = false; } else if ((1 == power_off_delay) && (BOTTOM_ID_SENSOR == sys_bottom_id)) { - ESP_LOGI(TAG, "power off"); + ESP_LOGD(TAG, "power off"); sys_sleep_entered = true; bsp_display_enter_sleep(); @@ -142,17 +136,6 @@ static void low_power_monitor_task(void *arg) bsp_codec_dev_stop(); bsp_pm_enter_sleep(); } - - if ((RADAE_FUNC_STOP != power_off_delay) && power_off_delay \ - && (BOTTOM_ID_SENSOR == sys_bottom_id)) { - power_off_delay--; - } - - if (BOTTOM_ID_SENSOR == sys_bottom_id) { - aht20_read_temperature_humidity(aht20, \ - &temperature_raw, &sys_temperature_value, \ - &humidity_raw, &sys_humidity_value); - } } } @@ -166,7 +149,6 @@ static esp_err_t bsp_init_temp_humudity() }; ret |= aht20_new_sensor(&i2c_conf, &aht20); - ret |= aht20_init_sensor(aht20); if (ret == ESP_OK) { ESP_LOGI(TAG, "Temp & humidity init ok"); } @@ -176,17 +158,19 @@ static esp_err_t bsp_init_temp_humudity() static esp_err_t bsp_init_radar() { esp_err_t ret = ESP_OK; - at581x_dev_handle_t at581x; + at581x_dev_handle_t at581x = NULL; + + at581x_default_cfg_t def_cfg = ATH581X_INITIALIZATION_CONFIG(); at581x_i2c_config_t i2c_conf = { .i2c_port = BSP_I2C_EXPAND_NUM, .i2c_addr = AT581X_ADDRRES_0, + .def_conf = &def_cfg, }; ret |= at581x_new_sensor(&i2c_conf, &at581x); - ret |= at581x_init_sensor(at581x); if (ret == ESP_OK) { - ESP_LOGI(TAG, "Rader init ok"); + ESP_LOGI(TAG, "Radar init ok"); } return ret; } @@ -222,7 +206,7 @@ static esp_err_t bsp_pm_init() .light_sleep_enable = true #endif }; - ESP_ERROR_CHECK( esp_pm_configure(&pm_config)); + ESP_ERROR_CHECK(esp_pm_configure(&pm_config)); #endif if (g_pm_apb_lock == NULL) { diff --git a/docs/_static/_get_started_static/23.1.png b/docs/_static/_get_started_static/23.1.png index c024e90b28f3f701e32a8f6e31902b44b93571fd..3da900b2a271daf2a2fdcd9926aa5247c5ca0e86 100644 GIT binary patch literal 12664 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%0DjPfe4dIi7A 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±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 XS>}?asLhWkz(-M5Ri;wPEbu=78)Ay- diff --git a/docs/_static/_get_started_static/23.png b/docs/_static/_get_started_static/23.png index c6f08ae26fe87f906a7a8093b2af29190a05a7f2..5e18214f9fafd226e7ea6335c4f86b723e86314e 100644 GIT binary patch literal 12776 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