This commit is contained in:
tang1219
2026-06-12 17:03:10 +08:00
parent e488cd3216
commit 9eaffcc9ff
31 changed files with 6829 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the convention is to give header files names that end with `.h'.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
+65
View File
@@ -0,0 +1,65 @@
#ifndef HW_CONFIG_H
#define HW_CONFIG_H
/* ============================================================
* ESP32 DASS2 引脚宏定义
* 来源: pin.txt
* ============================================================ */
/* ---------- 电源 / 电池 ---------- */
#define BAT_VOLTAGE_GPIO GPIO_NUM_6 /* ADC1_CH5 读取电池电压 */
#define ADC_CTL_GPIO GPIO_NUM_7 /* 开关读取电压的MOS管 */
#define POW_CTL_GPIO GPIO_NUM_15 /* 开关各种外围芯片电源 */
#define USB_PLUGIN_DETECT_GPIO GPIO_NUM_18 /* 检测USB是否插入(高=插入) */
/* ---------- 按钮 ---------- */
#define BUTTON0_GPIO GPIO_NUM_19
#define BUTTON1_GPIO GPIO_NUM_20
/* 两个按钮状态编码:
* 00 = 无按键 ; 10 = 左键 ; 01 = 右键 ; 11 = 中键
*/
/* ---------- LED ---------- */
#define LED_CTL_GPIO GPIO_NUM_42 /* 状态指示灯 */
/* ---------- I2C ---------- */
#define I2C_SDA_GPIO GPIO_NUM_8
#define I2C_SCL_GPIO GPIO_NUM_9
#define I2C_PORT I2C_NUM_0
/* ---------- SPI (TFT 专用总线) ---------- */
#define SPI_MOSI_GPIO GPIO_NUM_11
#define SPI_MISO_GPIO GPIO_NUM_12
#define SPI_SCLK_GPIO GPIO_NUM_21
#define SPI_HOST SPI2_HOST
/* TFT 片选 / 数据命令 / 复位 / 背光 */
#define TFT_CS_GPIO GPIO_NUM_13
#define TFT_DC_GPIO GPIO_NUM_14
#define TFT_RST_GPIO GPIO_NUM_47
#define TFT_PWM_GPIO GPIO_NUM_10
/* ---------- SDMMC (4-bit 模式, 独立于 SPI) ---------- */
#define SDMMC_CLK_GPIO GPIO_NUM_5
#define SDMMC_CMD_GPIO GPIO_NUM_4
#define SDMMC_D0_GPIO GPIO_NUM_41
#define SDMMC_D1_GPIO GPIO_NUM_40
#define SDMMC_D2_GPIO GPIO_NUM_39
#define SDMMC_D3_GPIO GPIO_NUM_38
#define SDMMC_CD_GPIO GPIO_NUM_48 /* 卡检测, 有卡=低电平 */
/* ---------- SHT30 温湿度传感器 (I2C) ---------- */
#define SHT30_I2C_ADDR 0x44 /* ADDR 引脚接地 */
/* ---------- UART2 (Arduino Serial2, 用于温湿度数据输出) ---------- */
#define UART2_TX_GPIO 16
#define UART2_RX_GPIO 17
#define UART2_BAUD_RATE 115200
/* ---------- 显示参数 ---------- */
/* 按实际 TFT 型号修改 下面以 ST7789 240×240 为例 */
#define TFT_WIDTH 240
#define TFT_HEIGHT 240
#define TFT_MADCTL_ROTATION 0x00 /* MADCTL 无旋转(竖屏) */
#endif /* HW_CONFIG_H */
+44
View File
@@ -0,0 +1,44 @@
#ifndef HW_INIT_H
#define HW_INIT_H
#include <stdint.h>
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ---------- 基本 GPIO ---------- */
esp_err_t hw_gpio_init(void);
/* ---------- 电源控制 ---------- */
esp_err_t hw_power_init(void); /* 开启外围电源 (POW_CTL) */
esp_err_t hw_battery_adc_init(void); /* 初始化电池电压 ADC */
uint32_t hw_battery_read_mv(void); /* 读取电池电压 (mV),内部自动开关MOS */
/* ---------- 按钮 ---------- */
esp_err_t hw_button_init(void);
uint8_t hw_button_read(void); /* 返回编码: 0=none, 1=left, 2=right, 3=mid */
/* ---------- LED ---------- */
esp_err_t hw_led_init(void);
void hw_led_set(bool on);
/* ---------- I2C ---------- */
esp_err_t hw_i2c_init(void);
/* ---------- SPI ---------- */
esp_err_t hw_spi_init(void);
/* ---------- TFT 背光 PWM ---------- */
esp_err_t hw_tft_backlight_init(void);
void hw_tft_backlight_set(uint8_t duty); /* 0100 */
/* ---------- 一键初始化所有外设 ---------- */
esp_err_t hw_all_init(void);
#ifdef __cplusplus
}
#endif
#endif /* HW_INIT_H */
+784
View File
@@ -0,0 +1,784 @@
/**
* @file lv_conf.h
* Configuration file for v8.4.0
*/
/*
* Copy this file as `lv_conf.h`
* 1. simply next to the `lvgl` folder
* 2. or any other places and
* - define `LV_CONF_INCLUDE_SIMPLE`
* - add the path as include path
*/
/* clang-format off */
#if 1 /*Set it to "1" to enable content*/
#ifndef LV_CONF_H
#define LV_CONF_H
#include <stdint.h>
/*====================
COLOR SETTINGS
*====================*/
/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
#define LV_COLOR_DEPTH 16
/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
#define LV_COLOR_16_SWAP 1
/*Enable features to draw on transparent background.
*It's required if opa, and transform_* style properties are used.
*Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
#define LV_COLOR_SCREEN_TRANSP 0
/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
#define LV_COLOR_MIX_ROUND_OFS 0
/*Images pixels with this color will not be drawn if they are chroma keyed)*/
#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/
/*=========================
MEMORY SETTINGS
*=========================*/
/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (64U * 1024U) /*[bytes]*/
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
#define LV_MEM_ADR 0 /*0: unused*/
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
#if LV_MEM_ADR == 0
#undef LV_MEM_POOL_INCLUDE
#undef LV_MEM_POOL_ALLOC
#endif
#else /*LV_MEM_CUSTOM*/
#define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
#define LV_MEM_CUSTOM_ALLOC malloc
#define LV_MEM_CUSTOM_FREE free
#define LV_MEM_CUSTOM_REALLOC realloc
#endif /*LV_MEM_CUSTOM*/
/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
*You will see an error log message if there wasn't enough buffers. */
#define LV_MEM_BUF_MAX_NUM 16
/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/
#define LV_MEMCPY_MEMSET_STD 0
/*====================
HAL SETTINGS
*====================*/
/*Default display refresh period. LVG will redraw changed areas with this period time*/
#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/
/*Input device read period in milliseconds*/
#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/
/*Use a custom tick source that tells the elapsed time in milliseconds.
*It removes the need to manually update the tick with `lv_tick_inc()`)*/
#define LV_TICK_CUSTOM 1
#if LV_TICK_CUSTOM
// #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
// #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
/*If using lvgl as ESP32 component*/
#define LV_TICK_CUSTOM_INCLUDE "esp_timer.h"
#define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))
#endif /*LV_TICK_CUSTOM*/
/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
*(Not so important, you can adjust it to modify default sizes and spaces)*/
#define LV_DPI_DEF 130 /*[px/inch]*/
/*=======================
* FEATURE CONFIGURATION
*=======================*/
/*-------------
* Drawing
*-----------*/
/*Enable complex draw engine.
*Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/
#define LV_DRAW_COMPLEX 1
#if LV_DRAW_COMPLEX != 0
/*Allow buffering some shadow calculation.
*LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
*Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
#define LV_SHADOW_CACHE_SIZE 0
/* Set number of maximally cached circle data.
* The circumference of 1/4 circle are saved for anti-aliasing
* radius * 4 bytes are used per circle (the most often used radiuses are saved)
* 0: to disable caching */
#define LV_CIRCLE_CACHE_SIZE 4
#endif /*LV_DRAW_COMPLEX*/
/**
* "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
* and blend it as an image with the given opacity.
* Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
* The widget can be buffered in smaller chunks to avoid using large buffers.
*
* - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
* - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
*
* Both buffer sizes are in bytes.
* "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
* and can't be drawn in chunks. So these settings affects only widgets with opacity.
*/
#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
/*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
*However the opened images might consume additional RAM.
*0: to disable caching*/
#define LV_IMG_CACHE_DEF_SIZE 0
/*Number of stops allowed per gradient. Increase this to allow more stops.
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
#define LV_GRADIENT_MAX_STOPS 2
/*Default gradient buffer size.
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
*If the cache is too small the map will be allocated only while it's required for the drawing.
*0 mean no caching.*/
#define LV_GRAD_CACHE_DEF_SIZE 0
/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
#define LV_DITHER_GRADIENT 0
#if LV_DITHER_GRADIENT
/*Add support for error diffusion dithering.
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
*The increase in memory consumption is (24 bits * object's width)*/
#define LV_DITHER_ERROR_DIFFUSION 0
#endif
/*Maximum buffer size to allocate for rotation.
*Only used if software rotation is enabled in the display driver.*/
#define LV_DISP_ROT_MAX_BUF (10*1024)
/*-------------
* GPU
*-----------*/
/*Use Arm's 2D acceleration library Arm-2D */
#define LV_USE_GPU_ARM2D 0
/*Use STM32's DMA2D (aka Chrom Art) GPU*/
#define LV_USE_GPU_STM32_DMA2D 0
#if LV_USE_GPU_STM32_DMA2D
/*Must be defined to include path of CMSIS header of target processor
e.g. "stm32f7xx.h" or "stm32f4xx.h"*/
#define LV_GPU_DMA2D_CMSIS_INCLUDE
#endif
/*Enable RA6M3 G2D GPU*/
#define LV_USE_GPU_RA6M3_G2D 0
#if LV_USE_GPU_RA6M3_G2D
/*include path of target processor
e.g. "hal_data.h"*/
#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"
#endif
/*Use SWM341's DMA2D GPU*/
#define LV_USE_GPU_SWM341_DMA2D 0
#if LV_USE_GPU_SWM341_DMA2D
#define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
#endif
/*Use NXP's PXP GPU iMX RTxxx platforms*/
#define LV_USE_GPU_NXP_PXP 0
#if LV_USE_GPU_NXP_PXP
/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
* and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
* has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
*0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
*/
#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
#endif
/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/
#define LV_USE_GPU_NXP_VG_LITE 0
/*Use SDL renderer API*/
#define LV_USE_GPU_SDL 0
#if LV_USE_GPU_SDL
#define LV_GPU_SDL_INCLUDE_PATH <SDL2/SDL.h>
/*Texture cache size, 8MB by default*/
#define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8)
/*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/
#define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
#endif
/*-------------
* Logging
*-----------*/
/*Enable the log module*/
#define LV_USE_LOG 0
#if LV_USE_LOG
/*How important log should be added:
*LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
*LV_LOG_LEVEL_INFO Log important events
*LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
*LV_LOG_LEVEL_USER Only logs added by the user
*LV_LOG_LEVEL_NONE Do not log anything*/
#define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
/*1: Print the log with 'printf';
*0: User need to register a callback with `lv_log_register_print_cb()`*/
#define LV_LOG_PRINTF 0
/*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
#define LV_LOG_TRACE_MEM 1
#define LV_LOG_TRACE_TIMER 1
#define LV_LOG_TRACE_INDEV 1
#define LV_LOG_TRACE_DISP_REFR 1
#define LV_LOG_TRACE_EVENT 1
#define LV_LOG_TRACE_OBJ_CREATE 1
#define LV_LOG_TRACE_LAYOUT 1
#define LV_LOG_TRACE_ANIM 1
#endif /*LV_USE_LOG*/
/*-------------
* Asserts
*-----------*/
/*Enable asserts if an operation is failed or an invalid data is found.
*If LV_USE_LOG is enabled an error message will be printed on failure*/
#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/
#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/
#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/
#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/
#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
/*Add a custom handler when assert happens e.g. to restart the MCU*/
#define LV_ASSERT_HANDLER_INCLUDE <stdint.h>
#define LV_ASSERT_HANDLER while(1); /*Halt by default*/
/*-------------
* Others
*-----------*/
/*1: Show CPU usage and FPS count*/
#define LV_USE_PERF_MONITOR 0
#if LV_USE_PERF_MONITOR
#define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
#endif
/*1: Show the used memory and the memory fragmentation
* Requires LV_MEM_CUSTOM = 0*/
#define LV_USE_MEM_MONITOR 0
#if LV_USE_MEM_MONITOR
#define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
#endif
/*1: Draw random colored rectangles over the redrawn areas*/
#define LV_USE_REFR_DEBUG 0
/*Change the built in (v)snprintf functions*/
#define LV_SPRINTF_CUSTOM 0
#if LV_SPRINTF_CUSTOM
#define LV_SPRINTF_INCLUDE <stdio.h>
#define lv_snprintf snprintf
#define lv_vsnprintf vsnprintf
#else /*LV_SPRINTF_CUSTOM*/
#define LV_SPRINTF_USE_FLOAT 0
#endif /*LV_SPRINTF_CUSTOM*/
#define LV_USE_USER_DATA 1
/*Garbage Collector settings
*Used if lvgl is bound to higher level language and the memory is managed by that language*/
#define LV_ENABLE_GC 0
#if LV_ENABLE_GC != 0
#define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/
#endif /*LV_ENABLE_GC*/
/*=====================
* COMPILER SETTINGS
*====================*/
/*For big endian systems set to 1*/
#define LV_BIG_ENDIAN_SYSTEM 0
/*Define a custom attribute to `lv_tick_inc` function*/
#define LV_ATTRIBUTE_TICK_INC
/*Define a custom attribute to `lv_timer_handler` function*/
#define LV_ATTRIBUTE_TIMER_HANDLER
/*Define a custom attribute to `lv_disp_flush_ready` function*/
#define LV_ATTRIBUTE_FLUSH_READY
/*Required alignment size for buffers*/
#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1
/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
* E.g. __attribute__((aligned(4)))*/
#define LV_ATTRIBUTE_MEM_ALIGN
/*Attribute to mark large constant arrays for example font's bitmaps*/
#define LV_ATTRIBUTE_LARGE_CONST
/*Compiler prefix for a big array declaration in RAM*/
#define LV_ATTRIBUTE_LARGE_RAM_ARRAY
/*Place performance critical functions into a faster memory (e.g RAM)*/
#define LV_ATTRIBUTE_FAST_MEM
/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/
#define LV_ATTRIBUTE_DMA
/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
*should also appear on LVGL binding API such as Micropython.*/
#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/
/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/
#define LV_USE_LARGE_COORD 0
/*==================
* FONT USAGE
*===================*/
/*Montserrat fonts with ASCII range and some symbols using bpp = 4
*https://fonts.google.com/specimen/Montserrat*/
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 1
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
#define LV_FONT_MONTSERRAT_24 1
#define LV_FONT_MONTSERRAT_26 0
#define LV_FONT_MONTSERRAT_28 0
#define LV_FONT_MONTSERRAT_30 0
#define LV_FONT_MONTSERRAT_32 0
#define LV_FONT_MONTSERRAT_34 0
#define LV_FONT_MONTSERRAT_36 0
#define LV_FONT_MONTSERRAT_38 0
#define LV_FONT_MONTSERRAT_40 0
#define LV_FONT_MONTSERRAT_42 0
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0
/*Demonstrate special features*/
#define LV_FONT_MONTSERRAT_12_SUBPX 0
#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/
#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/
/*Pixel perfect monospace fonts*/
#define LV_FONT_UNSCII_8 0
#define LV_FONT_UNSCII_16 0
/*Optionally declare custom fonts here.
*You can use these fonts as default font too and they will be available globally.
*E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/
#define LV_FONT_CUSTOM_DECLARE
/*Always set a default font*/
#define LV_FONT_DEFAULT &lv_font_montserrat_16
/*Enable handling large font and/or fonts with a lot of characters.
*The limit depends on the font size, font face and bpp.
*Compiler error will be triggered if a font needs it.*/
#define LV_FONT_FMT_TXT_LARGE 0
/*Enables/disables support for compressed fonts.*/
#define LV_USE_FONT_COMPRESSED 0
/*Enable subpixel rendering*/
#define LV_USE_FONT_SUBPX 0
#if LV_USE_FONT_SUBPX
/*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/
#define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/
#endif
/*Enable drawing placeholders when glyph dsc is not found*/
#define LV_USE_FONT_PLACEHOLDER 1
/*=================
* TEXT SETTINGS
*=================*/
/**
* Select a character encoding for strings.
* Your IDE or editor should have the same character encoding
* - LV_TXT_ENC_UTF8
* - LV_TXT_ENC_ASCII
*/
#define LV_TXT_ENC LV_TXT_ENC_UTF8
/*Can break (wrap) texts on these chars*/
#define LV_TXT_BREAK_CHARS " ,.;:-_"
/*If a word is at least this long, will break wherever "prettiest"
*To disable, set to a value <= 0*/
#define LV_TXT_LINE_BREAK_LONG_LEN 0
/*Minimum number of characters in a long word to put on a line before a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
/*Minimum number of characters in a long word to put on a line after a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
/*The control character to use for signalling text recoloring.*/
#define LV_TXT_COLOR_CMD "#"
/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
*The direction will be processed according to the Unicode Bidirectional Algorithm:
*https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/
#define LV_USE_BIDI 0
#if LV_USE_BIDI
/*Set the default direction. Supported values:
*`LV_BASE_DIR_LTR` Left-to-Right
*`LV_BASE_DIR_RTL` Right-to-Left
*`LV_BASE_DIR_AUTO` detect texts base direction*/
#define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
#endif
/*Enable Arabic/Persian processing
*In these languages characters should be replaced with an other form based on their position in the text*/
#define LV_USE_ARABIC_PERSIAN_CHARS 0
/*==================
* WIDGET USAGE
*================*/
/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/
#define LV_USE_ARC 1
#define LV_USE_BAR 1
#define LV_USE_BTN 1
#define LV_USE_BTNMATRIX 1
#define LV_USE_CANVAS 1
#define LV_USE_CHECKBOX 1
#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/
#define LV_USE_IMG 1 /*Requires: lv_label*/
#define LV_USE_LABEL 1
#if LV_USE_LABEL
#define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/
#define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/
#endif
#define LV_USE_LINE 1
#define LV_USE_ROLLER 1 /*Requires: lv_label*/
#if LV_USE_ROLLER
#define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/
#endif
#define LV_USE_SLIDER 1 /*Requires: lv_bar*/
#define LV_USE_SWITCH 1
#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/
#if LV_USE_TEXTAREA != 0
#define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/
#endif
#define LV_USE_TABLE 1
/*==================
* EXTRA COMPONENTS
*==================*/
/*-----------
* Widgets
*----------*/
#define LV_USE_ANIMIMG 1
#define LV_USE_CALENDAR 1
#if LV_USE_CALENDAR
#define LV_CALENDAR_WEEK_STARTS_MONDAY 0
#if LV_CALENDAR_WEEK_STARTS_MONDAY
#define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
#else
#define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}
#endif
#define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
#define LV_USE_CALENDAR_HEADER_ARROW 1
#define LV_USE_CALENDAR_HEADER_DROPDOWN 1
#endif /*LV_USE_CALENDAR*/
#define LV_USE_CHART 1
#define LV_USE_COLORWHEEL 1
#define LV_USE_IMGBTN 1
#define LV_USE_KEYBOARD 1
#define LV_USE_LED 1
#define LV_USE_LIST 1
#define LV_USE_MENU 1
#define LV_USE_METER 1
#define LV_USE_MSGBOX 1
#define LV_USE_SPAN 1
#if LV_USE_SPAN
/*A line text can contain maximum num of span descriptor */
#define LV_SPAN_SNIPPET_STACK_SIZE 64
#endif
#define LV_USE_SPINBOX 1
#define LV_USE_SPINNER 1
#define LV_USE_TABVIEW 1
#define LV_USE_TILEVIEW 1
#define LV_USE_WIN 1
/*-----------
* Themes
*----------*/
/*A simple, impressive and very complete theme*/
#define LV_USE_THEME_DEFAULT 1
#if LV_USE_THEME_DEFAULT
/*0: Light mode; 1: Dark mode*/
#define LV_THEME_DEFAULT_DARK 0
/*1: Enable grow on press*/
#define LV_THEME_DEFAULT_GROW 1
/*Default transition time in [ms]*/
#define LV_THEME_DEFAULT_TRANSITION_TIME 80
#endif /*LV_USE_THEME_DEFAULT*/
/*A very simple theme that is a good starting point for a custom theme*/
#define LV_USE_THEME_BASIC 1
/*A theme designed for monochrome displays*/
#define LV_USE_THEME_MONO 1
/*-----------
* Layouts
*----------*/
/*A layout similar to Flexbox in CSS.*/
#define LV_USE_FLEX 1
/*A layout similar to Grid in CSS.*/
#define LV_USE_GRID 1
/*---------------------
* 3rd party libraries
*--------------------*/
/*File system interfaces for common APIs */
/*API for fopen, fread, etc*/
#define LV_USE_FS_STDIO 0
#if LV_USE_FS_STDIO
#define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for open, read, etc*/
#define LV_USE_FS_POSIX 0
#if LV_USE_FS_POSIX
#define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for CreateFile, ReadFile, etc*/
#define LV_USE_FS_WIN32 0
#if LV_USE_FS_WIN32
#define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
#define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
#define LV_USE_FS_FATFS 0
#if LV_USE_FS_FATFS
#define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/
#define LV_USE_FS_LITTLEFS 0
#if LV_USE_FS_LITTLEFS
#define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
/*PNG decoder library*/
#define LV_USE_PNG 0
/*BMP decoder library*/
#define LV_USE_BMP 0
/* JPG + split JPG decoder library.
* Split JPG is a custom format optimized for embedded systems. */
#define LV_USE_SJPG 0
/*GIF decoder library*/
#define LV_USE_GIF 0
/*QR code library*/
#define LV_USE_QRCODE 0
/*FreeType library*/
#define LV_USE_FREETYPE 0
#if LV_USE_FREETYPE
/*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/
#define LV_FREETYPE_CACHE_SIZE (16 * 1024)
#if LV_FREETYPE_CACHE_SIZE >= 0
/* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */
/* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */
/* if font size >= 256, must be configured as image cache */
#define LV_FREETYPE_SBIT_CACHE 0
/* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
/* (0:use system defaults) */
#define LV_FREETYPE_CACHE_FT_FACES 0
#define LV_FREETYPE_CACHE_FT_SIZES 0
#endif
#endif
/*Tiny TTF library*/
#define LV_USE_TINY_TTF 0
#if LV_USE_TINY_TTF
/*Load TTF data from files*/
#define LV_TINY_TTF_FILE_SUPPORT 0
#endif
/*Rlottie library*/
#define LV_USE_RLOTTIE 0
/*FFmpeg library for image decoding and playing videos
*Supports all major image formats so do not enable other image decoder with it*/
#define LV_USE_FFMPEG 0
#if LV_USE_FFMPEG
/*Dump input information to stderr*/
#define LV_FFMPEG_DUMP_FORMAT 0
#endif
/*-----------
* Others
*----------*/
/*1: Enable API to take snapshot for object*/
#define LV_USE_SNAPSHOT 0
/*1: Enable Monkey test*/
#define LV_USE_MONKEY 0
/*1: Enable grid navigation*/
#define LV_USE_GRIDNAV 0
/*1: Enable lv_obj fragment*/
#define LV_USE_FRAGMENT 0
/*1: Support using images as font in label or span widgets */
#define LV_USE_IMGFONT 0
/*1: Enable a published subscriber based messaging system */
#define LV_USE_MSG 0
/*1: Enable Pinyin input method*/
/*Requires: lv_keyboard*/
#define LV_USE_IME_PINYIN 0
#if LV_USE_IME_PINYIN
/*1: Use default thesaurus*/
/*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
#define LV_IME_PINYIN_USE_DEFAULT_DICT 1
/*Set the maximum number of candidate panels that can be displayed*/
/*This needs to be adjusted according to the size of the screen*/
#define LV_IME_PINYIN_CAND_TEXT_NUM 6
/*Use 9 key input(k9)*/
#define LV_IME_PINYIN_USE_K9_MODE 1
#if LV_IME_PINYIN_USE_K9_MODE == 1
#define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
#endif // LV_IME_PINYIN_USE_K9_MODE
#endif
/*==================
* EXAMPLES
*==================*/
/*Enable the examples to be built with the library*/
#define LV_BUILD_EXAMPLES 1
/*===================
* DEMO USAGE
====================*/
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
#define LV_USE_DEMO_WIDGETS 0
#if LV_USE_DEMO_WIDGETS
#define LV_DEMO_WIDGETS_SLIDESHOW 0
#endif
/*Demonstrate the usage of encoder and keyboard*/
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
/*Benchmark your system*/
#define LV_USE_DEMO_BENCHMARK 0
#if LV_USE_DEMO_BENCHMARK
/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
#define LV_DEMO_BENCHMARK_RGB565A8 0
#endif
/*Stress test for LVGL*/
#define LV_USE_DEMO_STRESS 0
/*Music player demo*/
#define LV_USE_DEMO_MUSIC 0
#if LV_USE_DEMO_MUSIC
#define LV_DEMO_MUSIC_SQUARE 0
#define LV_DEMO_MUSIC_LANDSCAPE 0
#define LV_DEMO_MUSIC_ROUND 0
#define LV_DEMO_MUSIC_LARGE 0
#define LV_DEMO_MUSIC_AUTO_PLAY 0
#endif
/*--END OF LV_CONF_H--*/
#endif /*LV_CONF_H*/
#endif /*End of "Content enable"*/
+26
View File
@@ -0,0 +1,26 @@
#ifndef LVGL_DEMO_H
#define LVGL_DEMO_H
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief 初始化 LVGL + TFT 显示驱动,并启动 Demo UI
*
* 内部步骤:
* 1. lv_init()
* 2. 添加 SPI TFT 设备 (ST7789 / ST7735)
* 3. 注册 LVGL flush 回调
* 4. 创建 Demo UI 对象
* 5. 启动周期性 LVGL 刷新 Task
*/
esp_err_t lvgl_demo_start(void);
#ifdef __cplusplus
}
#endif
#endif /* LVGL_DEMO_H */
+209
View File
@@ -0,0 +1,209 @@
/**
* @file ota_manager.h
* @brief 固件 OTAOver-The-Air)底层管理器
*
* 提供与传输层无关的固件更新基础设施。
* 上层(USB / 串口 / 蓝牙 / SD 卡 / HTTP)只需:
* 1. 调用 ota_begin(total_size) 开始更新
* 2. 循环调用 ota_write(chunk, len) 写入固件数据
* 3. 调用 ota_end() 完成更新(验证 + 切换启动分区)
* 4. 异常时调用 ota_abort() 放弃更新
*
* 回调机制:
* 注册回调后,在 OTA 各阶段自动触发,用于 UI 更新 / 日志 / 错误处理。
*
* 框架: ESP-IDF 5.1.x
* 依赖: hw_led_set()(状态 LED 反馈)
*/
#ifndef OTA_MANAGER_H
#define OTA_MANAGER_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "esp_err.h"
#include "esp_partition.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ================================================================
* 类型定义
* ================================================================ */
/** OTA 状态机 */
typedef enum {
OTA_STATE_IDLE, /**< 空闲,等待开始 */
OTA_STATE_IN_PROGRESS, /**< 固件写入中 */
OTA_STATE_VERIFYING, /**< 固件校验中(end 阶段) */
OTA_STATE_COMPLETE, /**< 更新成功,准备重启 */
OTA_STATE_ERROR, /**< 发生错误,需 abort 或重试 */
} ota_state_t;
/** OTA 错误码(扩展 esp_err_t,负值为 ESP-IDF 错误,正值为自定义错误) */
typedef enum {
OTA_ERR_NONE = 0, /**< 无错误 */
OTA_ERR_NOT_INITIALIZED = 1, /**< 未调用 begin */
OTA_ERR_ALREADY_IN_PROGRESS = 2, /**< 已有进行中的 OTA */
OTA_ERR_BEGIN_FAILED = 3, /**< begin 阶段失败 */
OTA_ERR_WRITE_FAILED = 4, /**< 写入 flash 失败 */
OTA_ERR_END_FAILED = 5, /**< end 阶段失败 */
OTA_ERR_ABORT_FAILED = 6, /**< abort 失败 */
OTA_ERR_SIZE_MISMATCH = 7, /**< 写入长度与声明的 total 不符 */
OTA_ERR_NO_OTA_PARTITION = 8, /**< 无可用 OTA 分区 */
OTA_ERR_STATE_ERROR = 9, /**< 当前状态不允许该操作 */
OTA_ERR_VERIFY_FAILED = 10, /**< 固件校验失败 */
} ota_error_t;
/* ================================================================
* 回调函数类型
* ================================================================ */
/**
* @brief 进度回调
* @param percent 完成百分比 (0100)
* @param bytes_written 已写入字节数
* @param total_size 固件总字节数
*
* 调用频率: 每完成一个 ota_write() 调用后触发一次(约 1–4KB 一次)。
* 上层可在此回调中更新进度条或打印日志。
*/
typedef void (*ota_progress_cb_t)(int percent, size_t bytes_written, size_t total_size);
/**
* @brief 完成回调
* @param success true=更新成功, false=更新失败
* @param error_code 失败时的错误码(success 为 true 时无效)
*
* 调用时机: ota_end() 处理完毕后触发。
* 若 success=true,设备应在适当时机重启以加载新固件。
*/
typedef void (*ota_complete_cb_t)(bool success, ota_error_t error_code);
/**
* @brief 状态变化回调
* @param old_state 变化前的状态
* @param new_state 变化后的状态
*
* 每次 OTA 状态机发生转换时触发。
* 上层可在 OTA_STATE_COMPLETE 时自动重启,或在 OTA_STATE_ERROR 时告警。
*/
typedef void (*ota_state_cb_t)(ota_state_t old_state, ota_state_t new_state);
/**
* @brief 错误回调(颗粒度更细)
* @param error_code 错误码
* @param message 可读错误描述
*
* 在 ota_write 失败、end 失败等场景触发,先于状态变化回调。
* 可用于日志记录、错误提示等。
*/
typedef void (*ota_error_cb_t)(ota_error_t error_code, const char *message);
/* ================================================================
* 回调注册
* ================================================================ */
/** 注册进度回调(最多一个,后注册的覆盖前面的) */
void ota_set_progress_callback(ota_progress_cb_t cb);
/** 注册完成回调 */
void ota_set_complete_callback(ota_complete_cb_t cb);
/** 注册状态变化回调 */
void ota_set_state_callback(ota_state_cb_t cb);
/** 注册错误回调 */
void ota_set_error_callback(ota_error_cb_t cb);
/** 一次性注销所有回调 */
void ota_clear_callbacks(void);
/* ================================================================
* 底层 OTA API
*
* 调用顺序:
* 正常流程: ota_begin() → ota_write()×N → ota_end() → 重启设备
* 错误处理: ota_begin() → ota_write()×N → ota_abort()
* ================================================================ */
/**
* @brief 开始 OTA 更新
*
* 内部自动选择下一个可用的 OTA 分区,擦除分区空间。
*
* @param firmware_size 固件总大小(字节)。
* 传入 0 表示大小未知:跳过长度校验,progress 百分比始终为 0。
* @return
* - ESP_OK: 开始成功,可调用 ota_write
* - OTA_ERR_ALREADY_IN_PROGRESS: 上次 OTA 未结束
* - OTA_ERR_NO_OTA_PARTITION: 分区表无可用 OTA 分区
* - OTA_ERR_BEGIN_FAILED: ESP-IDF OTA begin 失败
*/
esp_err_t ota_begin(size_t firmware_size);
/**
* @brief 写入固件数据块
*
* 阻塞调用,写入 flash 前先进行必要的擦除。
* 建议每次写入 1024–4096 字节以获得最佳吞吐量。
*
* @param data 数据指针
* @param len 数据长度(字节)
* @return
* - ESP_OK: 写入成功
* - OTA_ERR_NOT_INITIALIZED: 未调用 ota_begin
* - OTA_ERR_STATE_ERROR: 当前状态不允许写入
* - OTA_ERR_WRITE_FAILED: 写入 flash 失败
*/
esp_err_t ota_write(const uint8_t *data, size_t len);
/**
* @brief 完成 OTA 更新
*
* 校验已写入数据的完整性,验证固件镜像,切换启动分区。
* 成功返回后,设备应在适当时机调用 esp_restart() 重启。
*
* @return
* - ESP_OK: 更新完成,可重启
* - OTA_ERR_END_FAILED: 校验或切换失败
* - OTA_ERR_SIZE_MISMATCH: 实写大小与声明不符
*/
esp_err_t ota_end(void);
/**
* @brief 中止 OTA 更新
*
* 放弃当前写入的固件,恢复状态机到 IDLE。
* 调用后目标 OTA 分区数据不可靠,下次 begin 会重新擦除。
*
* @return ESP_OK 或错误码
*/
esp_err_t ota_abort(void);
/* ================================================================
* 状态查询
* ================================================================ */
/** 获取当前 OTA 状态 */
ota_state_t ota_get_state(void);
/** 获取当前运行的固件分区(const 指针,不可修改) */
const esp_partition_t *ota_get_running_partition(void);
/** 获取正在更新的目标分区(仅在 IN_PROGRESS 或 VERIFYING 时有效) */
const esp_partition_t *ota_get_update_partition(void);
/** 获取已写入字节数 */
size_t ota_get_bytes_written(void);
/** 获取声明的固件总大小 */
size_t ota_get_firmware_size(void);
#ifdef __cplusplus
}
#endif
#endif /* OTA_MANAGER_H */
+102
View File
@@ -0,0 +1,102 @@
/**
* @file sd_card.h
* @brief SD 卡驱动 (SDMMC 4-bit 模式 + FATFS)
*
* 硬件接口: SDMMC1, 4-bit 模式
* 引脚定义: 见 hw_config.h (SDMMC_CLK/CMD/D0-D3/CD_GPIO)
* 框架: ESP-IDF 5.1.x
*/
#ifndef SD_CARD_H
#define SD_CARD_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ================================================================
* 类型定义
* ================================================================ */
/** SD 卡文件系统类型 */
typedef enum {
SD_FS_NONE = 0, /* 未挂载 / 无卡 */
SD_FS_FAT32, /* FAT32 格式 */
SD_FS_OTHER, /* 其他文件系统(需要格式化) */
} sd_fs_type_t;
/** SD 卡文件信息 */
typedef struct {
char name[64];
size_t size;
bool is_dir;
} sd_file_info_t;
/* ================================================================
* 挂载 / 卸载 / 格式化
* ================================================================ */
/** 初始化 SDMMC 主机并尝试挂载 FAT 文件系统到 /sdcard */
esp_err_t sd_card_init(void);
/** 卸载文件系统并释放 SDMMC 资源 */
esp_err_t sd_card_deinit(void);
/** 获取当前 SD 卡的文件系统类型 */
sd_fs_type_t sd_card_get_fs_type(void);
/** 检测 SD 卡是否物理插入 (读取 CD 引脚) */
bool sd_card_is_inserted(void);
/** 将 SD 卡格式化为 FAT32 并重新挂载 */
esp_err_t sd_card_format(void);
/* ================================================================
* 文件枚举
* ================================================================ */
/** 枚举 SD 卡根目录下的文件和目录
* @param list 输出缓冲区
* @param max_files 最多返回的文件数
* @return 实际枚举到的文件数量 (≤ max_files)
*/
int sd_card_list_files(sd_file_info_t *list, int max_files);
/* ================================================================
* 文件读取
* ================================================================ */
/** 读取文本文件全部内容到字符串缓冲区
* @param path 文件路径 (相对于 /sdcard, 如 "readme.txt")
* @param buf 输出缓冲区 (会以 '\0' 结尾)
* @param max_len 缓冲区最大字节数 (含结尾 '\0')
* @return ESP_OK 成功, 否则失败
*
* 注意: 文件超过 max_len-1 时会被截断。
*/
esp_err_t sd_card_read_text(const char *path, char *buf, size_t max_len);
/** 读取图片文件到内存缓冲区 (二进制原始数据)
* @param path 文件路径 (相对于 /sdcard, 如 "photo.bmp")
* @param buf 输出缓冲区 (调用者负责分配)
* @param max_len 缓冲区最大字节数
* @param out_len [输出] 实际读取的字节数
* @return ESP_OK 成功, 否则失败
*
* 注意: 此函数只负责读取原始二进制数据,
* 图片解析和显示由上层实现。
*/
esp_err_t sd_card_read_image(const char *path,
uint8_t *buf, size_t max_len,
size_t *out_len);
#ifdef __cplusplus
}
#endif
#endif /* SD_CARD_H */
+48
View File
@@ -0,0 +1,48 @@
/**
* @file sht30.h
* @brief SHT30 温湿度传感器驱动 (I2C)
*
* 硬件接口: I2C (复用 hw_init 中已初始化的 I2C_PORT)
* I2C 地址: 0x44 (ADDR 接地) 或 0x45 (ADDR 接 VDD)
* 框架: ESP-IDF 5.1.x
*/
#ifndef SHT30_H
#define SHT30_H
#include <stdint.h>
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
/** 单次测量结果 */
typedef struct {
float temperature; /* 摄氏度 */
float humidity; /* 相对湿度 % */
} sht30_data_t;
/**
* @brief 初始化 SHT30 传感器 (验证 I2C 通信)
* @return ESP_OK 成功, 否则失败
*
* 注意: 调用前需确保 I2C 总线已初始化 (hw_i2c_init)。
*/
esp_err_t sht30_init(void);
/**
* @brief 执行单次测量 (高重复性、时钟拉伸模式)
* @param data [输出] 温湿度结果
* @return ESP_OK 成功, 否则失败
*
* 内部等待约 15 ms 后读取 6 字节原始数据,
* 经 CRC-8 校验后转换为物理量。
*/
esp_err_t sht30_read(sht30_data_t *data);
#ifdef __cplusplus
}
#endif
#endif /* SHT30_H */