From 2465074dede3509c398e4cc624b2da2c85a1b7b2 Mon Sep 17 00:00:00 2001 From: tonyleo723 Date: Wed, 30 Apr 2025 10:04:51 +0800 Subject: [PATCH 1/2] Add openai_api_key demo --- examples/indicator_openai_api/.gitignore | 1 + examples/indicator_openai_api/CHANGELOG.md | 5 + examples/indicator_openai_api/CMakeLists.txt | 14 + examples/indicator_openai_api/README.md | 41 + .../indicator_openai_api/docs/ChatGPT-2.png | Bin 0 -> 64517 bytes .../indicator_openai_api/docs/ChatGPT.png | Bin 0 -> 22845 bytes .../docs/DALL \302\267 E-1.png" | Bin 0 -> 17321 bytes .../docs/DALL \302\267 E-2.png" | Bin 0 -> 472307 bytes examples/indicator_openai_api/docs/OpenAI.png | Bin 0 -> 34010 bytes .../indicator_openai_api/main/CMakeLists.txt | 19 + examples/indicator_openai_api/main/config.h | 34 + .../main/controller/indicator_controller.c | 307 + .../main/controller/indicator_controller.h | 21 + examples/indicator_openai_api/main/lv_port.c | 366 + examples/indicator_openai_api/main/lv_port.h | 34 + examples/indicator_openai_api/main/main.c | 73 + .../main/model/indicator_btn.c | 116 + .../main/model/indicator_btn.h | 19 + .../main/model/indicator_city.c | 809 ++ .../main/model/indicator_city.h | 17 + .../main/model/indicator_cmd.c | 311 + .../main/model/indicator_cmd.h | 16 + .../main/model/indicator_display.c | 321 + .../main/model/indicator_display.h | 26 + .../main/model/indicator_model.c | 20 + .../main/model/indicator_model.h | 16 + .../main/model/indicator_openai.c | 566 + .../main/model/indicator_openai.h | 30 + .../main/model/indicator_sensor.c | 1062 ++ .../main/model/indicator_sensor.h | 19 + .../main/model/indicator_storage.c | 53 + .../main/model/indicator_storage.h | 22 + .../main/model/indicator_time.c | 271 + .../main/model/indicator_time.h | 22 + .../main/model/indicator_wifi.c | 503 + .../main/model/indicator_wifi.h | 17 + .../main/timeapi_cert.pem | 59 + .../main/ui/images/ui_img_chatgpt_log_png.c | 58 + .../main/ui/images/ui_img_openai_log_png.c | 289 + .../main/ui/images/ui_img_sensecap_log_png.c | 58 + .../ui/images/ui_img_set_key_qr_code_png.c | 647 + .../main/ui/screens/ui_screen_chartgpt_1.c | 99 + .../main/ui/screens/ui_screen_chartgpt_2.c | 108 + .../main/ui/screens/ui_screen_openai.c | 132 + .../main/ui/screens/ui_screen_openai_key.c | 430 + examples/indicator_openai_api/main/ui/ui.c | 1694 +++ .../indicator_openai_api/main/ui/ui.c.bak | 1586 +++ examples/indicator_openai_api/main/ui/ui.h | 269 + .../indicator_openai_api/main/ui/ui.h.bak | 185 + .../main/ui/ui_font_font0.c | 2191 ++++ .../main/ui/ui_font_font1.c | 3098 +++++ .../main/ui/ui_font_font2.c | 3940 ++++++ .../main/ui/ui_font_font3.c | 10128 ++++++++++++++++ .../main/ui/ui_font_font4.c | 9720 +++++++++++++++ .../indicator_openai_api/main/ui/ui_helpers.c | 191 + .../indicator_openai_api/main/ui/ui_helpers.h | 94 + .../main/ui/ui_img_back_png.c | 28 + .../main/ui/ui_img_background_png.c | 3622 ++++++ .../main/ui/ui_img_co2_png.c | 36 + .../main/ui/ui_img_display_png.c | 58 + .../main/ui/ui_img_high_light_png.c | 29 + .../main/ui/ui_img_humidity_1_png.c | 32 + .../main/ui/ui_img_humidity_2_png.c | 36 + .../main/ui/ui_img_location2_png.c | 24 + .../main/ui/ui_img_location_png.c | 32 + .../main/ui/ui_img_lock_png.c | 27 + .../main/ui/ui_img_low_light_png.c | 27 + .../main/ui/ui_img_setting_png.c | 28 + .../main/ui/ui_img_temp_1_png.c | 32 + .../main/ui/ui_img_temp_2_png.c | 36 + .../main/ui/ui_img_time_png.c | 71 + .../main/ui/ui_img_tvoc_png.c | 36 + .../main/ui/ui_img_wifi_1_png.c | 29 + .../main/ui/ui_img_wifi_2_png.c | 29 + .../main/ui/ui_img_wifi_3_png.c | 30 + .../main/ui/ui_img_wifi_disconet_png.c | 31 + .../main/ui/ui_img_wifi_setting_png.c | 69 + .../indicator_openai_api/main/util/cobs.c | 220 + .../indicator_openai_api/main/util/cobs.h | 110 + .../main/util/indicator_util.c | 17 + .../main/util/indicator_util.h | 21 + .../main/view/indicator_view.c | 1444 +++ .../main/view/indicator_view.h | 17 + .../indicator_openai_api/main/view_data.h | 202 + .../indicator_openai_api/main/view_data.h.bak | 173 + examples/indicator_openai_api/partitions.csv | 5 + .../indicator_openai_api/sdkconfig.defaults | 78 + 87 files changed, 46756 insertions(+) create mode 100644 examples/indicator_openai_api/.gitignore create mode 100644 examples/indicator_openai_api/CHANGELOG.md create mode 100644 examples/indicator_openai_api/CMakeLists.txt create mode 100644 examples/indicator_openai_api/README.md create mode 100644 examples/indicator_openai_api/docs/ChatGPT-2.png create mode 100644 examples/indicator_openai_api/docs/ChatGPT.png create mode 100644 "examples/indicator_openai_api/docs/DALL \302\267 E-1.png" create mode 100644 "examples/indicator_openai_api/docs/DALL \302\267 E-2.png" create mode 100644 examples/indicator_openai_api/docs/OpenAI.png create mode 100644 examples/indicator_openai_api/main/CMakeLists.txt create mode 100644 examples/indicator_openai_api/main/config.h create mode 100644 examples/indicator_openai_api/main/controller/indicator_controller.c create mode 100644 examples/indicator_openai_api/main/controller/indicator_controller.h create mode 100644 examples/indicator_openai_api/main/lv_port.c create mode 100644 examples/indicator_openai_api/main/lv_port.h create mode 100644 examples/indicator_openai_api/main/main.c create mode 100644 examples/indicator_openai_api/main/model/indicator_btn.c create mode 100644 examples/indicator_openai_api/main/model/indicator_btn.h create mode 100644 examples/indicator_openai_api/main/model/indicator_city.c create mode 100644 examples/indicator_openai_api/main/model/indicator_city.h create mode 100644 examples/indicator_openai_api/main/model/indicator_cmd.c create mode 100644 examples/indicator_openai_api/main/model/indicator_cmd.h create mode 100644 examples/indicator_openai_api/main/model/indicator_display.c create mode 100644 examples/indicator_openai_api/main/model/indicator_display.h create mode 100644 examples/indicator_openai_api/main/model/indicator_model.c create mode 100644 examples/indicator_openai_api/main/model/indicator_model.h create mode 100644 examples/indicator_openai_api/main/model/indicator_openai.c create mode 100644 examples/indicator_openai_api/main/model/indicator_openai.h create mode 100644 examples/indicator_openai_api/main/model/indicator_sensor.c create mode 100644 examples/indicator_openai_api/main/model/indicator_sensor.h create mode 100644 examples/indicator_openai_api/main/model/indicator_storage.c create mode 100644 examples/indicator_openai_api/main/model/indicator_storage.h create mode 100644 examples/indicator_openai_api/main/model/indicator_time.c create mode 100644 examples/indicator_openai_api/main/model/indicator_time.h create mode 100644 examples/indicator_openai_api/main/model/indicator_wifi.c create mode 100644 examples/indicator_openai_api/main/model/indicator_wifi.h create mode 100644 examples/indicator_openai_api/main/timeapi_cert.pem create mode 100644 examples/indicator_openai_api/main/ui/images/ui_img_chatgpt_log_png.c create mode 100644 examples/indicator_openai_api/main/ui/images/ui_img_openai_log_png.c create mode 100644 examples/indicator_openai_api/main/ui/images/ui_img_sensecap_log_png.c create mode 100644 examples/indicator_openai_api/main/ui/images/ui_img_set_key_qr_code_png.c create mode 100644 examples/indicator_openai_api/main/ui/screens/ui_screen_chartgpt_1.c create mode 100644 examples/indicator_openai_api/main/ui/screens/ui_screen_chartgpt_2.c create mode 100644 examples/indicator_openai_api/main/ui/screens/ui_screen_openai.c create mode 100644 examples/indicator_openai_api/main/ui/screens/ui_screen_openai_key.c create mode 100644 examples/indicator_openai_api/main/ui/ui.c create mode 100644 examples/indicator_openai_api/main/ui/ui.c.bak create mode 100644 examples/indicator_openai_api/main/ui/ui.h create mode 100644 examples/indicator_openai_api/main/ui/ui.h.bak create mode 100644 examples/indicator_openai_api/main/ui/ui_font_font0.c create mode 100644 examples/indicator_openai_api/main/ui/ui_font_font1.c create mode 100644 examples/indicator_openai_api/main/ui/ui_font_font2.c create mode 100644 examples/indicator_openai_api/main/ui/ui_font_font3.c create mode 100644 examples/indicator_openai_api/main/ui/ui_font_font4.c create mode 100644 examples/indicator_openai_api/main/ui/ui_helpers.c create mode 100644 examples/indicator_openai_api/main/ui/ui_helpers.h create mode 100644 examples/indicator_openai_api/main/ui/ui_img_back_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_background_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_co2_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_display_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_high_light_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_humidity_1_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_humidity_2_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_location2_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_location_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_lock_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_low_light_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_setting_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_temp_1_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_temp_2_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_time_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_tvoc_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_wifi_1_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_wifi_2_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_wifi_3_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_wifi_disconet_png.c create mode 100644 examples/indicator_openai_api/main/ui/ui_img_wifi_setting_png.c create mode 100644 examples/indicator_openai_api/main/util/cobs.c create mode 100644 examples/indicator_openai_api/main/util/cobs.h create mode 100644 examples/indicator_openai_api/main/util/indicator_util.c create mode 100644 examples/indicator_openai_api/main/util/indicator_util.h create mode 100644 examples/indicator_openai_api/main/view/indicator_view.c create mode 100644 examples/indicator_openai_api/main/view/indicator_view.h create mode 100644 examples/indicator_openai_api/main/view_data.h create mode 100644 examples/indicator_openai_api/main/view_data.h.bak create mode 100644 examples/indicator_openai_api/partitions.csv create mode 100644 examples/indicator_openai_api/sdkconfig.defaults diff --git a/examples/indicator_openai_api/.gitignore b/examples/indicator_openai_api/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/examples/indicator_openai_api/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/examples/indicator_openai_api/CHANGELOG.md b/examples/indicator_openai_api/CHANGELOG.md new file mode 100644 index 0000000..b4d5888 --- /dev/null +++ b/examples/indicator_openai_api/CHANGELOG.md @@ -0,0 +1,5 @@ +## changelog + +### v1.0.0 ### + +* Initial version. \ No newline at end of file diff --git a/examples/indicator_openai_api/CMakeLists.txt b/examples/indicator_openai_api/CMakeLists.txt new file mode 100644 index 0000000..0eab5a0 --- /dev/null +++ b/examples/indicator_openai_api/CMakeLists.txt @@ -0,0 +1,14 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +set(EXTRA_COMPONENT_DIRS ../../components) + +add_compile_options(-fdiagnostics-color=always -w) + +project(indicator_openai) + +# 添加esp_http_client和esp_crt_bundle组件 +set(COMPONENT_REQUIRES esp_http_client esp_crt_bundle) \ No newline at end of file diff --git a/examples/indicator_openai_api/README.md b/examples/indicator_openai_api/README.md new file mode 100644 index 0000000..6153eac --- /dev/null +++ b/examples/indicator_openai_api/README.md @@ -0,0 +1,41 @@ +# Indicator OpenAI Demo + +This demo is mainly based on the indicator_basis demo with added chartGPT and DALL•E functions. + +
+ + + + + +
+ +## Function +- [x] Time display. +- [x] CO2, tVOC, Temperature and Humidity data real-time display. +- [x] CO2, tVOC, Temperature and Humidity history data display. +- [x] Wifi config. +- [x] Display config. +- [x] time config. +- [x] chatGPT +- [x] DALL E2 + +## How to use example + +Please first read the [User Guide](https://wiki.seeedstudio.com/SenseCAP_Indicator_Get_Started) of the SenseCAP Indicator Board to learn about its software and hardware information. + +When using openai-related functions, you must first set the openai api key through the esp32 serial port. + +``` +openai_api -k +``` + + +### Build and Flash + +1. The project configure PSRAM with Octal 120M by default. please see [here](../../tools/patch/README.md#idf-patch) to enable `PSRAM Octal 120M` feature. +2. Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. diff --git a/examples/indicator_openai_api/docs/ChatGPT-2.png b/examples/indicator_openai_api/docs/ChatGPT-2.png new file mode 100644 index 0000000000000000000000000000000000000000..773f482dc58462705fb00c290592cc1a03aeec75 GIT binary patch literal 64517 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 E86uAYJO@^1at+5}U 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