新闻详情

新闻详情

首页 / 资讯中心 / 详情

ESP32-S3环境监测节点Madeira:硬件选型、固件架构与低功耗设计

发布时间:2026/10/1 6:18:27来源:尧图网络
ESP32-S3环境监测节点Madeira:硬件选型、固件架构与低功耗设计
最近在整理一个用 ESP32-S3 做的桌面环境监测小项目项目代号就叫 Madeira。名字是随手取的没有特别含义但这套板子的硬件选型、固件结构和联调方法做完之后基本沉淀成了我手边一个可复用的物联网节点模板。所以这篇文章打算把 Madeira 从需求拆解、硬件设计、代码实现到问题排查完整梳理一遍。它本质上是一个基于 ESP32-S3 的 Wi-Fi/BLE 物联网开发节点可以用一个 3.7V 锂电池供电采集温湿度、光照强度把数据通过 MQTT 上报到本地服务器或云平台同时用一块 0.96 寸 OLED 做本地显示预留了 GPIO 做外设控制。如果你正准备做一个环境监测、智能家居中控、传感器网关之类的小玩意或者想找一套能直接抄作业的 ESP32-S3 工程骨架这篇文章应该能帮到你。1. 项目背景与整体设计思路拆解1.1 为什么选择“Madeira”这个项目代号我习惯给每个手头在做的硬件项目起一个内部代号方便在整个开发周期里用一个短词指代它。Madeira 这个词最早出现在芯片厂商的参考设计文档里我借过来用中文可以理解为一个偏欧洲风的地名代称并没有具体含义。但这背后有一个习惯值得保留给项目起代号不是纯粹图方便它能帮你快速归类日志、分支、硬件版本甚至采购清单。比如我的固件仓库分支叫 feature/madeira-oled打样的 PCB 文件夹叫 Madeira-V1.2GitHub 上的工程说明第一行就是“Madeira: a ESP32-S3 based ambient monitoring node”。一旦代码和文档多了这种命名一致性会省掉很多找文件的麻烦。1.2 需求拆解一个“能用”的制作需要哪些组件如果只是点亮一颗 LED那不算项目。Madeira 的目标很明确放在桌面上能实时显示环境数据能远程查看历史数据还要在断电后重新上电时自动恢复工作。我把需求拆成了四条环境采集温度、湿度、光照强度三项基础数据采集周期默认 10 秒一次。本地显示0.96 寸 OLED 直接显示当前数据不需要打开手机也能看到。远程上报通过 Wi-Fi 连接路由器用 MQTT 协议把 JSON 格式的数据推送到服务器。低功耗待机如果选择电池供电模式设备要能在无人查看时进入浅睡眠定时唤醒采集再自动睡回去。这个拆解过程看起来简单但真正决定项目成败的是“不做什么”。我最初还想加上音频播放、人脸识别、语音控制后来全部砍掉了。一个稳定可靠的小节点比一个功能堆砌但总出问题的原型有价值得多。所以整个设计始终围绕“低复杂度、高可靠性、易复现”三个关键词展开。1.3 开发板选型与采购避坑Madeira 的核心模块我选了 ESP32-S3-WROOM-1N8R8 版本也就是 8MB Flash 加 8MB PSRAM 的模组。选它有四个原因双核 LX7 处理器跑 240MHz做数据采集和 MQTT 上报绰绰有余。原生 Wi-Fi 加 BLE 5.0不需要外挂无线芯片。支持向量指令和 SIMD以后如果接麦克风做语音关键词识别还能继续用。板载 USB 烧录调试功能省去外接 USB-TTL。如果自己画板采购模组时最需要留意的是 Flash 容量的字样。市面上有 N44MB、N88MB、N1616MB等型号N8 后面还有 R8 表示带 PSRAM。如果你的代码里用到了 PSRAM 扩展内存或者 OTA 差分包空间规划就很重要。我自己在 V1.0 版本吃过亏买成了 N4 版本编完固件还剩不到 500KB升级一个差分包很容易失败后来全部换成 N8R8 才安心。2. 核心硬件细节解析传感器、屏幕和供电方案2.1 I2C 挂设备的原则与 GPIO 分配Madeira 的传感器和屏幕都走 I2C 总线这样只占两个 GPIO电路布线也简单。具体组合如下外设型号I2C 地址功能说明温湿度传感器SHT300x44温度精度 ±0.2℃湿度精度 ±2%RH光照传感器BH17500x23量程 1-65535 lux可配高分辨率模式OLED 显示屏SSD13060x3C128x64 像素白字显示GPIO 分配上我用了 GPIO8 作为 SCLGPIO9 作为 SDA。这两个引脚在 ESP32-S3 的很多模组上都已经引出来而且不占用默认的 Flash 引脚。需要注意不要把 SCL/SDA 放在 GPIO26 和 GPIO27因为这两个引脚在某些核心板上直接连到了板载 Flash轻则信号干扰重则导致启动失败。I2C 挂多个设备时要注意总线上拉电阻的选择。ESP32-S3 内部有上拉电阻但默认阻值偏大高速通信时波形不够好。我在板子上外挂了两个 4.7kΩ 上拉电阻实测 400kHz 速率下波形干净没有出现 CRC 错误。如果是纯手焊的飞线板建议加上拉电阻后把速率降到 100kHz 或 200kHz稳定性会明显好很多。2.2 电源树与低功耗门槛这部分的坑最多。ESP32-S3 本身可以在 Deep Sleep 下做到几十微安但如果你把 OLED 和传感器的电源直接接在 3.3V 上一切努力都是白费。因为 SSD1306 待机也要一两毫安SHT30 和 BH1750 常开再各加零点几毫安整个系统就永远降不到微安级别。Madeira 的电源方案分两条路系统主供电3.7V 锂电池经过 XC6206P332MR 或类似低压差 LDO输出稳定的 3.3V给 ESP32-S3 供电。外设供电OLED、SHT30、BH1750 的 VCC 不直接接 3.3V而是接在一颗 MOS 管开关后面开关的控制脚接到 ESP32-S3 的 GPIO21。需要测量时打开电源测完立刻关掉。这个细节让 Madeira 的休眠功耗从 3.2mA 降到了约 90μA。对于一块 400mAh 的电池来说如果每 30 秒唤醒一次每次唤醒工作 2 秒理论上可以跑很多天。当然实际还要算上电池自放电和 Wi-Fi 重连瞬间的电流尖峰。另一个电源细节是ESP32-S3 在 Wi-Fi 发射瞬间电流会拉到 350mA 左右电源走线太细或者 LDO 压差太大会导致射频输出功率下降、握手失败。所以我在 PCB 上把 3.3V 主供电走线加宽到 1mm并在模组电源引脚旁边放了 10μF 和 0.1μF 两级电容。2.3 天线布局与 PCB 注意事项如果你用的是官方模组而不是自己画 RF 部分天线区域还是不能马虎。ESP32-S3-WROOM-1 的天线在 PCB 板边我在布局时保证天线下方和周围 10mm 范围内没有任何金属件、螺丝孔、底线或传感器排线。曾经有一版我把蜂鸣器放在天线旁边结果实测 Wi-Fi RSSI 掉了 8dBm 左右重新挪开位置后才恢复正常。还有一点PCB 铺地不要大面积挖空。很多新手为了“绝缘”把天线区域背面挖空其实模组参考设计里天线正下方是有铺铜的并且通过过孔连接到主地。挖空反而破坏了参考地平面驻波比变差。我的经验是直接照抄模组 datasheet 里的 Layout Guide别自己发明。3. 开发环境搭建与固件实现3.1 工具链选择ESP-IDF 还是 Arduino做这种原生 Wi-Fi 加 MQTT 的节点我强烈建议直接用乐鑫官方 ESP-IDF而不是 Arduino。理由很简单ESP-IDF 对电源管理、Wi-Fi 事件处理、MQTT 客户端和 OTA 的封装更完整调试信息也更规范。你用 Arduino 写 30 行能跑通联网但后续加低功耗、加 OTA、加错误重连机制往往要到处找库补丁反而更折腾。我用的版本是 ESP-IDF v5.2安装方式很简单在 Ubuntu 或 macOS 上克隆 esp-idf 仓库运行 install.sh然后 source export.sh。Windows 上可以直接用乐鑫官方 IDE或者用 MSYS2 终端。开发时配 VS Code 加 ESP-IDF 插件能用图形界面管理和切换 SDK 版本对新手更友好。为了兼顾老项目我验证过同样的代码结构在 ESP-IDF v4.4 上也能编译只是注意几个函数名的兼容性比如 esp_netif_create_default_wifi_sta 在 v4.4 已经存在但 v4.4 的 Wi-Fi 事件循环需要额外注册事件基。建议新项目直接用 v5.x少踩兼容坑。3.2 工程结构和关键代码实现Madeira 的固件工程遵循 ESP-IDF 的标准结构核心源码放在 main 目录下madeira/ ├── CMakeLists.txt ├── sdkconfig.defaults ├── main/ │ ├── CMakeLists.txt │ ├── main.c │ ├── app_wifi.c │ ├── app_sensor.c │ ├── app_mqtt.c │ └── app_display.cmain.c 负责初始化所有模块并创建三个任务传感器采集任务、显示刷新任务、网络状态监控任务。这里我没有用 FreeRTOS 的复杂队列只用一个全局结构体保存最新传感器数据任务之间通过互斥锁或原子写来避免资源竞争。数据量小、更新频率低这个方案足够简单可靠。下面这段是传感器读取的核心逻辑。SHT30 需要先发送测量命令再等待 50ms 读取 6 个字节BH1750 则需要在每次读取前发送一次连续高分辨率模式指令等 180ms 后读取 2 个字节。注意读取完成后要关闭外设电源为后面的休眠做准备。// app_sensor.c 关键代码 #define SHT30_ADDR 0x44 #define BH1750_ADDR 0x23 #define POWER_PIN 21 typedef struct { float temperature; float humidity; float lux; } madeira_sensor_data_t; static madeira_sensor_data_t s_sensor_data; static SemaphoreHandle_t s_sensor_mutex; void app_sensor_init(void) { gpio_set_direction(POWER_PIN, GPIO_MODE_OUTPUT); gpio_set_level(POWER_PIN, 0); s_sensor_mutex xSemaphoreCreateMutex(); } bool app_sensor_read(madeira_sensor_data_t *out) { if (!out) return false; gpio_set_level(POWER_PIN, 1); // 打开外设电源 vTaskDelay(pdMS_TO_TICKS(50)); // 等待传感器上电稳定 esp_err_t ret ESP_OK; uint8_t temp_sensor_data[6] {0}; i2c_cmd_handle_t cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (SHT30_ADDR 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0x2C, true); i2c_master_write_byte(cmd, 0x06, true); // 重复测量高重复性 i2c_master_stop(cmd); ret | i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); vTaskDelay(pdMS_TO_TICKS(50)); cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (SHT30_ADDR 1) | I2C_MASTER_READ, true); i2c_master_read(cmd, temp_sensor_data, 6, I2C_MASTER_LAST_NACK); i2c_master_stop(cmd); ret | i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); // BH1750 读取 uint8_t light_data[2] {0}; cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (BH1750_ADDR 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0x10, true); // 连续高分辨率模式 i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); vTaskDelay(pdMS_TO_TICKS(180)); cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (BH1750_ADDR 1) | I2C_MASTER_READ, true); i2c_master_read(cmd, light_data, 2, I2C_MASTER_LAST_NACK); i2c_master_stop(cmd); ret | i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); gpio_set_level(POWER_PIN, 0); // 关闭外设电源省电 if (ret ! ESP_OK) return false; out-temperature -45 175 * ((temp_sensor_data[0] 8 | temp_sensor_data[1]) / 65535.0f); out-humidity 100 * ((temp_sensor_data[3] 8 | temp_sensor_data[4]) / 65535.0f); out-lux (light_data[0] 8 | light_data[1]) / 1.2f; xSemaphoreTake(s_sensor_mutex, portMAX_DELAY); s_sensor_data *out; xSemaphoreGive(s_sensor_mutex); return true; }Wi-Fi 连接部分我建议使用事件驱动的 STA 模式而不是阻塞式连接。代码如下注意事件的注册时机要在 esp_wifi_start 之前完成否则容易漏掉事件。// app_wifi.c 关键代码 static void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { if (event_base WIFI_EVENT event_id WIFI_EVENT_STA_START) { esp_wifi_connect(); } else if (event_base WIFI_EVENT event_id WIFI_EVENT_STA_DISCONNECTED) { // 断线后重连注意加退避时间避免频繁重试 vTaskDelay(pdMS_TO_TICKS(3000)); esp_wifi_connect(); } else if (event_base IP_EVENT event_id IP_EVENT_STA_GOT_IP) { // 记录获得的 IP后续 MQTT 连接可以放在这里 ip_event_got_ip_t *event (ip_event_got_ip_t *)event_data; ESP_LOGI(WIFI, got ip: IPSTR, IP2STR(event-ip_info.ip)); } } void app_wifi_init(void) { esp_netif_init(); esp_event_loop_create_default(); esp_netif_create_default_wifi_sta(); wifi_init_config_t cfg WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(cfg); esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, wifi_event_handler, NULL); esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_event_handler, NULL); wifi_config_t wifi_config { .sta { .ssid CONFIG_MADEIRA_WIFI_SSID, .password CONFIG_MADEIRA_WIFI_PASSWORD, }, }; esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_config(WIFI_IF_STA, wifi_config); esp_wifi_start(); }MQTT 上报我用的组件是 esp-mqtt在 menuconfig 里开启 MQTT 之后调用 mqtt_client 接口。上报的数据格式特意做成了 JSON 对象方便服务器端解析{device:madeira,temp:25.3,humidity:48.2,lux:386.5,rssi:-52}实际发布时把温度值保留一位小数湿度一位小数光照取整。订阅端收到后可以直接判断是否需要立刻处理比如温度过高就推送告警。OLED 显示部分我用的是 U8g2 图形库。初始化时注意设置 I2C 通信速率SSD1306 在 800kHz 下也能跑但为了省电流我把速率降到 400kHz。显示内容采用两屏轮换第一屏显示温度和湿度第二屏显示光照强度和 Wi-Fi 信号强度。每 10 秒切换一次避免长期烧屏。3.3 编译烧录与日志调试编译过程在 ESP-IDF 里已经非常流畅先设置目标芯片idf.py set-target esp32s3 idf.py menuconfig idf.py build idf.py -p /dev/ttyACM0 flash monitor需要注意的是ESP32-S3 的板载 USB 口有两种角色一种是 USB-OTG一种是 USB-Serial-JTAG。很多核心板默认用 USB-Serial-JTAG 枚举出一个串口大部分系统会显示为 ttyACM0。如果你用 USB 口连接还是无法烧录或者串口列表里看不到设备先按住板子上的 BOOT 键再插入 USB让芯片进入下载模式。调试日志我开了三级INFO 打印关键事件WARN 打印重连情况ERROR 打印传感器读取失败。实测下来ESP-IDF 自带的日志系统足够用。不要过度 DEBUG否则大量日志会拖慢 Wi-Fi 的实时行为偶尔还会触发任务看门狗。4. 功能联调与参数调优4.1 无线稳定性与功耗实测联调阶段我最关心的两个指标是 Wi-Fi 重连稳定性和待机电流。经过多轮测试我得出了几组参考数据冷启动到 MQTT 首次上线时间约 1.8 秒最快 1.5 秒。Wi-Fi 断线重连时间3 到 5 秒。因为我在断线事件里加了 3 秒延时防止模块频繁发起无效连接。正常工作电流约 80mA 到 120mA 之间取决于 MQTT 发布频率。Deep Sleep 外设断电实测约 95μA其中 ESP32-S3 的 Deep Sleep 电流 80μA 左右LDO 静态功耗 10μA 左右还有几微安的漏电流。如果想进一步压低休眠电流可以把系统主供电也改成 MOS 管控制但那样需要一颗纽扣电池或者法拉电容维持 RTC 时钟复杂度会上升。我的结论是95μA 对于家庭桌面节点已经可以接受再往下抠成本不太划算。4.2 数据上报格式与云端解析方案MQTT 主题我定义为 madeira/sensor/dataQoS 设成 0因为环境数据允许偶尔丢包。发布频率默认 10 秒一次服务器端按时间序列存储不需要实时响应QoS 1 反而会因为重传导致数据堆积。在云端解析时我用 Node-RED 订阅这个主题把 JSON 拆出来写入时序数据库比如 InfluxDB。再用 Grafana 画一个简单的仪表盘显示温度和湿度曲线。如果你想用现成平台也可以直接接入 Home Assistant 的 MQTT 传感器配置几行 YAML 就能显示。这里分享一个细节上报数据时建议带上 RSSI 字段。它不仅能反映设备信号强度还能用来做位置判断。比如某天 RSSI 突然稳定在 -70dBm 以下说明设备可能被挪到了角落或者天线附近被金属遮挡。这个信息对家庭场景很有用。4.3 本地显示与升级扩展OLED 显示部分的代码很简单但有一个容易忽略的点SSD1306 是全屏刷新模式更新整个画面需要 1KB 的显存。如果你的板子没有 PSRAM全部用内部 SRAM 会有点紧。我用了 U8g2 的全缓冲模式在 8MB PSRAM 的板子上毫无压力在无 PSRAM 的板子上建议改用半缓冲或页模式。扩展性方面Madeira 预留了 OTA 升级能力。我实现了最基本的 HTTP OTA设备定期请求一个固定 URL比较服务端的版本号和当前运行固件版本不一致就下载升级。其实 HTTP OTA 已经很成熟乐鑫官方也提供了 native OTA 示例。要特别注意分区表要预留 ota_0 和 ota_1 两个分区否则无法拥有 A/B 备份回滚能力。5. 常见问题与排查技巧实录5.1 烧录失败与枚举问题遇到最多的烧录失败十有八九是芯片没有进入下载模式。ESP32-S3 用原生 USB 口烧录时需要按住 BOOTGPIO0插线等串口出现后再松开。有些人用 USB-OTG 口想直接烧录但没注意到板子默认的 USB 工作模式是 USB-Serial-JTAG两者枚举的串口名不一样容易选错端口。排查步骤我建议按顺序来插上 USB执行 dmesg 或 ls /dev/tty*确认系统是否识别到设备。如果识别到设备但烧录一直失败按住 BOOT 复位一次。如果系统完全没识别检查 USB 线是不是纯充电线。这个坑很多人中招换一根数据线立刻解决。如果用的是自定义板卡确认 GPIO0 没有外接强上拉或强下拉否则芯片启动模式会被锁定。5.2 Wi-Fi 频繁掉线这个问题的软件原因通常有两个。一个是电源输入瞬时纹波太大射频前端在高功率发射时供电被拉低导致模块自己复位或掉线。解决办法是在 LDO 输出端并联大容量电容并在模组电源引脚附近放 100nF 高频去耦电容。另一个原因是断线重连没有做退避。如果路由器重启模块连续 100ms 内发起十几次连接请求很容易触发路由器的连接限速导致一直连不上。我在代码里加了 3 秒固定延时如果需要更平滑可以使用指数退避策略比如第 1 次 2 秒第 2 次 4 秒第 3 次 8 秒最大不超过 60 秒。5.3 内存不足和任务看门狗如果你在 sdkconfig 里开了一堆功能编译后发现内存不足先检查是不是把 WiFi 和 MQTT 缓冲同时开到了最大值。默认情况下ESP32-S3 的 Wi-Fi 协议栈会占用约 100KB 动态内存MQTT 发送缓冲默认 1KB接收缓冲 1KB这些都很小。真正吃内存的是 TLS 连接。如果没有启用服务器证书校验和 ALPN连接一次大概会多占用 40KB 以上。非加密场景就没必要给 TLS 留太多缓冲。任务看门狗报错则通常是因为某个任务在较长循环里调用了阻塞 API比如在 I2C 读取时等待 180ms 的场景。解决办法是把这个等待放到一个专门的任务里并调用 vTaskDelay 让出 CPU或者临时提高看门狗超时阈值。5.4 传感器读数异常与 OLED 黑屏传感器读数为 0 或者错误先检查 I2C 地址是否正确。BH1750 的地址取决于 ADDR 引脚电平接地是 0x23接 VCC 是 0x5C。SHT30 同样有 0x44 和 0x45 两个版本。很多情况下说明书写的是默认地址但实际模块上已经接了不同的电阻最好用 i2cscanner 扫描一遍所有地址避免死磕。OLED 黑屏则先看电源是否已经打开。因为我把外设电源接到了 GPIO21 上如果初始化代码没把它拉高屏幕自然不亮。其次看 I2C 地址SSD1306 的 7 位地址通常是 0x3C但也有 0x3D 的模块扫描确认就行。最后再看初始化顺序要在 U8g2 初始化之前先调用 app_sensor_init 打开电源开关否则屏幕上电时序不对初始化就失败。6. 我个人对这套设计的一点体会做 Madeira 的过程中最深的体会是硬件项目的坑大多不是出在单一功能上而是出在各个子系统交互的边界。传感器单独测没问题Wi-Fi 单独连没问题可一旦传感器任务和 Wi-Fi 重连同时跑偶发卡顿就会出现。所以后来我在设计中特别强调“每个外设都要能独立控制电源”以及“不同任务之间尽量通过简单信号量通信不做复杂队列”。如果再让我重新做 V1.0我会在一开始就把 GPIO 和电源分配表写在 README 里而不是靠记忆。这份文档虽然只花十分钟却能在后续调车式排查里省几个小时。最后再分享一个小技巧给传感器外设统一做一个硬件电源开关哪怕你现在不做低功耗也值得加。因为调试时每次断电重启传感器比软件复位靠谱得多。这就是我在这套板子上的经验希望对你做自己的 Madeira 项目有一点参考价值。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Wireshark+USBCAP抓包实战:解决USB偶发断连与枚举失败 2026/10/1 7:21:03

Wireshark+USBCAP抓包实战:解决USB偶发断连与枚举失败

干嵌入式、工控或者运维的人,基本都遇到过这种鬼事:设备用着用着USB口就“掉线”了,要么直接断开,要么系统提示“无法识别的USB设备”,重新插拔一下又好了。这种问题最折磨人,因为它不是每次必现&#xff0…

阅读更多 →
YouTube与AI融合运营的核心策略 2026/10/1 7:21:03

YouTube与AI融合运营的核心策略

利用AI技术优化YouTube内容创作与账号运营,已成为提升效率和增强用户粘性的关键路径。通过智能工具实现从选题策划到数据分析的全流程自动化,可显著降低人力成本并提高内容质量。智能选题与内容策划借助AI驱动的内容分析工具,如Google Trends…

阅读更多 →
一键开关机芯片怎么选?电压、功耗、按键逻辑与封装四维指南 2026/10/1 7:21:03

一键开关机芯片怎么选?电压、功耗、按键逻辑与封装四维指南

做便携式设备的朋友可能都有过这种经历:产品就一个按键,要负责开机和关机,电池还要求能撑几个月。我去年做一台手持温湿度记录仪就撞上了这个问题。一开始图省事,直接用PMOS加三极管搭自锁开关电路,结果一测待机电流&a…

阅读更多 →
Harness 工程中怎么做 RAG:从 chunking 到 Knowhere 检索的落地配置 2026/10/1 7:21:03

Harness 工程中怎么做 RAG:从 chunking 到 Knowhere 检索的落地配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
2026企业微信会话存档单席位价格 2026/10/1 7:21:02

2026企业微信会话存档单席位价格

企业微信的会话存档分为两个版本:官方原生存档与SAAS版存档。 主要区别 1:价格区别。原生存档服务版单席位价格900元,企业版【可存档语音通话】单席位价格1800元。 SAAS版服务版单席位价格一般是300-500元,企业版单席位价格一般是…

阅读更多 →
【蝌蚪智汇】小程序上线半年了,它给我赚了多少钱? 2026/10/1 7:20:56

【蝌蚪智汇】小程序上线半年了,它给我赚了多少钱?

前言 有干汽修的朋友(我弟)问:“你能给我开发一个记录客户在这里消费项目与金额的管理工具吗?” 我说:“应该可以吧,我试试。” 还有干理发店的朋友问:“能给我开发一个会员管理吗?”…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉