ESP32嵌入式菜单框架:基于tcMenu的工业HMI开发库

news2026/4/29 23:55:27
1. 项目概述bamboitEsp32Base_3.0.0是一个面向 ESP32 系列微控制器特别是 ESP32-WROOM-32、ESP32-WROVER、ESP32-S2/S3的综合性嵌入式基础库其核心定位并非通用 HAL 封装而是围绕tcMenuTouch Control Menu生态构建的工程级应用支撑框架。该库在 ESP-IDF v4.4 和 Arduino-ESP32v2.0.7双平台下完成深度适配通过抽象硬件交互、预置通信协议栈、集成人机界面逻辑与任务调度模型显著降低基于 ESP32 的智能控制终端如工业 HMI、IoT 配置面板、实验室设备前端的开发门槛。项目摘要中“Base library uses tcmenu and many more useful stuff”看似简略实则揭示了其设计哲学以 tcMenu 为 UI 中心枢纽向上承载业务逻辑向下统合外设驱动与实时调度。它不是简单的头文件集合而是一套经过量产验证的嵌入式软件架构范式——所有模块均围绕“菜单状态机驱动外设行为”这一主线组织。例如一个温度设定项的值变更会自动触发 I²C 温控芯片寄存器写入、LED 指示灯 PWM 占空比更新、串口透传日志输出三重动作全程无需用户编写状态同步代码。该库的关键词仅标注tcmenu但实际技术栈远超此限。其隐含能力包括多线程安全的菜单项值缓存与持久化SPI Flash / NVS基于 FreeRTOS 的分层任务模型UI 任务、通信任务、外设轮询任务可配置的输入事件分发器旋转编码器、矩阵键盘、触摸屏中断内置轻量级协议解析器Modbus RTU/ASCII over UARTJSON-RPC over WebSocket与 ESP-IDF 组件WiFi、Bluetooth、OTA的零胶水集成这种设计使开发者能将注意力聚焦于业务参数定义如MenuItem* tempSetItem new IntMenuItem(Temp Set, gTargetTemp, 0, 100, 1);而非底层时序调试。2. 核心架构与模块分解2.1 整体分层架构bamboitEsp32Base_3.0.0采用四层垂直架构各层间通过明确定义的接口契约通信杜绝跨层直接调用层级名称关键职责典型组件L1硬件抽象层HAL屏蔽芯片差异提供统一外设访问Esp32IoAbstractionGPIO/PWM/I²C/SPI、Esp32SerialAbstraction多 UART 自动流控L2服务中间件层实现跨平台服务解耦硬件与业务TcMenuRemoteSender远程菜单同步、PersistentStorageNVS/SPIFFS 双模存储、EventDispatcher输入事件总线L3tcMenu 运行时层菜单引擎核心管理状态机与渲染MenuManager主循环调度、RendererOLED/LCD/TFT 渲染器、MenuItem家族类Int/Float/Bool/Enum/ActionL4应用集成层用户业务逻辑注入点AppController生命周期管理、CustomMenuItem自定义控件、ProtocolHandler协议适配器工程意义此分层非学术构想而是源于对数十个工业项目的复盘。例如 L2 层的EventDispatcher解决了旋转编码器抖动与按键长按冲突问题——它将原始 GPIO 中断转换为标准化EVENT_ROTARY_LEFT/RIGHT和EVENT_BUTTON_LONG_PRESS事件并内置 15ms 消抖与 800ms 长按阈值避免每个项目重复实现。2.2 tcMenu 引擎深度集成机制tcMenu 本身是独立开源库https://github.com/1000001101000/tcMenu而bamboitEsp32Base对其实现了三项关键增强1内存优化的菜单树序列化标准 tcMenu 在 ESP32 上加载大型菜单50 项易触发堆碎片。本库引入静态内存池 动态项懒加载机制// menu_definition.h - 编译期生成菜单结构体 static const MenuItem* menuItems[] { mainMenu, tempSubMenu, fanSpeedItem, // 实际对象驻留 .rodata 段 ledBrightnessItem, }; // 运行时仅在首次访问子菜单时分配 RAM 缓存MenuManager::setMenuTree(menuItems, ARRAY_SIZE(menuItems))接口确保菜单树指针常驻 ROM动态数据如当前选中索引、编辑缓冲区使用预分配的 2KB 内存池。2双模渲染管线支持同步与异步渲染模式同步模式默认Renderer::render()在loop()中调用适用于 OLEDSSD1306等低分辨率屏异步模式启用 FreeRTOS 任务renderTask配合 DMA SPI 传输专为 ST7789 TFT 屏优化// 初始化时启用异步渲染 tftRenderer-enableAsyncRendering(4); // 4 级渲染队列深度 xTaskCreate(renderTask, tft_render, 4096, tftRenderer, 1, nullptr);3远程控制协议栈内置TcMenuRemoteSender类支持三种远程同步通道通道物理层协议同步粒度典型场景UARTUART2自定义二进制协议全菜单同步工业 PLC 主站下发配置WiFiTCP ClientJSON-RPC 2.0单项更新Web 管理后台实时调整BLENimBLEGATT Service通知推送手机 App 快速配置所有通道共享同一套序列化引擎MenuItem::serializeToJson()方法生成标准 JSON{id:102,name:Fan Speed,type:int,value:65,min:0,max:100}3. 关键 API 详解与工程实践3.1 硬件抽象层核心 APIEsp32IoAbstraction—— 统一 GPIO 控制class Esp32IoAbstraction { public: // 构造函数指定 GPIO 矩阵映射解决 ESP32 引脚复用冲突 Esp32IoAbstraction(gpio_num_t ledPin, gpio_num_t btnPin, gpio_num_t encA, gpio_num_t encB); // 线程安全的电平操作内部使用原子操作 void digitalWrite(gpio_num_t pin, uint32_t level); uint32_t digitalRead(gpio_num_t pin); // PWM 控制自动选择 LEDC 或 MCPWM void analogWrite(gpio_num_t pin, uint16_t value, uint8_t resolution10); private: // 预计算的 GPIO 分组避免运行时查表 struct PinGroup { uint32_t mask; uint32_t* reg; }; PinGroup outputGroup, inputGroup; };工程要点analogWrite()根据引脚号自动选择 LEDC通用 PWM或 MCPWM高精度电机控制用户无需记忆LEDC_CHANNEL_0等宏所有digitalWrite()调用经由GPIO.out_w1ts寄存器原子置位规避多任务下 GPIO 竞态Esp32SerialAbstraction—— 智能串口管理class Esp32SerialAbstraction { public: // 自动协商波特率与流控RTS/CTS 硬件流控 or XON/XOFF 软件流控 bool begin(hardware_serial_t serialPort, uint32_t baud, serial_config_t config SERIAL_CONFIG_DEFAULT); // 阻塞式发送带超时 size_t write(const uint8_t* data, size_t len, TickType_t timeout portMAX_DELAY); // 非阻塞接收回调驱动 void onReceive(std::functionvoid(uint8_t*, size_t) handler); private: // 动态缓冲区管理根据串口负载自动扩容 RingBufferuint8_t* rxBuffer; StaticQueueHandle_t txQueue; // FreeRTOS 队列实现发送缓冲 };典型配置// UART2 用于 Modbus RTU 从机需严格定时 serial2.begin(SERIAL2, 9600, {.flowControl SERIAL_FLOWCONTROL_HARDWARE, .rxBufferSize 256, .txBufferSize 128}); // UART1 用于调试日志高吞吐 serial1.begin(SERIAL1, 115200, {.flowControl SERIAL_FLOWCONTROL_NONE});3.2 tcMenu 运行时核心 APIMenuManager—— 菜单状态机中枢class MenuManager { public: // 主循环驱动必须在 loop() 中调用 void runLoop(); // 注册菜单项变更回调值修改后触发 void addValueChangeListener(MenuItem* item, std::functionvoid(int) callback); // 强制刷新显示如外部事件触发更新 void requestRender(); // 获取当前菜单路径用于日志追踪 String getCurrentMenuPath(); private: // 状态机核心IDLE → EDITING → NAVIGATING → SAVING enum MenuState { IDLE, EDITING, NAVIGATING, SAVING }; MenuState currentState; MenuItem* currentItem; };关键设计runLoop()内部实现10ms 定时扫描检测编码器旋转、按键中断、触摸坐标避免delay()阻塞addValueChangeListener()支持链式注册一个IntMenuItem可绑定多个回调如更新 LCD 显示 触发 PWM 输出 记录到 FlashPersistentStorage—— 双模参数持久化class PersistentStorage { public: // 自动选择存储介质NVS 优先失败降级 SPIFFS bool begin(const char* namespaceName); // 类型安全的读写模板特化避免类型转换错误 templatetypename T bool write(const char* key, const T value); templatetypename T bool read(const char* key, T value, const T defaultValue); // 批量保存减少 Flash 写入次数 void commit(); private: // 存储策略决策器 enum StorageType { STORAGE_NVS, STORAGE_SPIFFS }; StorageType currentStorage; };工程实践// 定义参数结构体自动序列化为 JSON struct DeviceConfig { int wifiRetryCount 3; bool autoReboot true; float calibOffset 0.0f; }; DeviceConfig config; // 一行代码完成加载与默认值填充 storage.read(device_cfg, config, DeviceConfig{}); // 修改后立即标记为脏数据 config.wifiRetryCount 5; storage.write(device_cfg, config); storage.commit(); // 此刻才真正写入 Flash4. 典型应用场景与代码示例4.1 工业温控仪开发SPI TFT Modbus RTU需求3.5 ST7789 TFT 显示实时温度、设定值、PID 参数UART1 运行 Modbus RTU 从机协议支持寄存器 40001~40010 读写旋转编码器调节设定值按键确认实现步骤硬件初始化// 创建硬件抽象实例 Esp32IoAbstraction io(2, 15, 32, 33); // LED, BTN, ENC_A, ENC_B Esp32SerialAbstraction modbusSerial(SERIAL1); modbusSerial.begin(9600, {.flowControl SERIAL_FLOWCONTROL_HARDWARE}); // 初始化 TFT使用 Adafruit_ST7789 Adafruit_ST7789 tft Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); tft.initR(INITR_BLACKTAB);构建菜单树// 定义菜单项 IntMenuItem tempSetItem(Temp Set, gTargetTemp, 0, 100, 1); FloatMenuItem pidKpItem(PID Kp, gPidKp, 0.1f, 10.0f, 0.1f); ActionMenuItem saveBtn(Save Config, [](){ storage.commit(); }); // 构建层级 Menu menuMain(Main); menuMain.add(tempSetItem).add(pidKpItem).add(saveBtn);集成 Modbus 协议栈// 继承 tcMenu 的 RemoteSender 实现 Modbus 适配 class ModbusRemoteSender : public TcMenuRemoteSender { public: void sendMenuItemUpdate(MenuItem* item) override { uint16_t regAddr getModbusAddress(item); uint16_t value item-getValueAsInt(); modbusSerial.write(modbusFrame(regAddr, value)); // 生成 Modbus RTU 帧 } }; ModbusRemoteSender modbusSender; menuManager.setRemoteSender(modbusSender);启动系统void setup() { io.begin(); tft.fillScreen(ST77XX_BLACK); menuManager.setMenuTree(menuMain); menuManager.setRenderer(new St7789Renderer(tft)); menuManager.runLoop(); // 启动菜单引擎 } void loop() { menuManager.runLoop(); // 10ms 周期执行 // 后台处理 Modbus 接收 if (modbusSerial.available()) { processModbusRequest(modbusSerial.read()); } }4.2 IoT 配置面板WiFi Web UI需求通过手机浏览器访问http://esp32-config.local配置 WiFi SSID/密码配置页与本地菜单完全同步修改网页即更新 OLED 显示OTA 固件升级入口集成到菜单关键技术点使用AsyncWebServer提供 REST APIserver.on(/api/menu/item/102, HTTP_POST, [](AsyncWebServerRequest *request){ String json; request-getParam(value, true, false)-value().toCharArray(json.begin(), json.length()); JsonObject root jsonBuffer.parseObject(json); tempSetItem.setValue(root[value].asint()); menuManager.requestRender(); // 强制刷新 OLED });OTA 升级与菜单联动ActionMenuItem otaItem(OTA Upgrade, [](){ // 启动 OTA 任务并禁用菜单交互 menuManager.setInteractive(false); xTaskCreate(otaTask, ota_update, 8192, nullptr, 5, nullptr); });5. 配置选项与编译定制5.1sdkconfig.h关键宏说明宏定义默认值作用工程建议CONFIG_BAMBOIT_BASE_USE_NVSy启用 NVS 存储生产环境必开避免 SPIFFS 文件系统损坏风险CONFIG_BAMBOIT_BASE_ASYNC_RENDERn启用异步渲染TFT 屏必开OLED 屏关闭以节省 RAMCONFIG_BAMBOIT_BASE_MODBUS_RTUy编译 Modbus RTU 协议栈工业项目开启消费类关闭CONFIG_BAMBOIT_BASE_WIFI_REMOTEy编译 WiFi 远程控制IoT 项目必开纯本地设备可关闭CONFIG_BAMBOIT_BASE_LOG_LEVEL3日志级别0none, 3info调试期设为 4debug量产设为 2warn5.2 内存占用优化策略ESP32-WROOM-32 典型内存分布启用全部功能区域占用优化手段IRAM128KB关闭CONFIG_BAMBOIT_BASE_DEBUG_LOG可释放 16KBDRAM256KB使用__attribute__((section(.dram0.bss)))将大数组移至 DRAMFlash800KB启用CONFIG_ESPTOOLPY_COMPRESSED减少固件体积 30%实测数据最小配置仅 OLED 编码器 NVSFlash 420KBRAM 180KB全功能配置TFT Modbus WiFi BLEFlash 780KBRAM 245KB6. 故障排查与调试技巧6.1 常见问题诊断表现象可能原因调试指令菜单无响应编码器 A/B 相未正确接线gpio_set_direction(GPIO_NUM_32, GPIO_MODE_INPUT)检查引脚模式OLED 显示乱码SPI 时钟极性/相位错误spi_bus_config_t buscfg {.spics_io_num -1, .flags SPICOMMON_BUSFLAG_MASTER}Modbus 通信超时RTS 引脚未连接或电平异常digitalWrite(RTS_PIN, LOW)强制拉低测试NVS 写入失败Flash 分区表未包含 nvs 分区idf.py partition-table检查分区 CSVWiFi 连接后断开CONFIG_BAMBOIT_BASE_WIFI_REMOTE与CONFIG_ESP_WIFI_STA_DISCONNECTED_REASON冲突关闭远程功能测试基础连接6.2 实时调试接口库内置DebugConsole类通过 UART0 提供命令行调试# 连接 UART0 (115200bps) menu dump # 输出当前菜单树结构 storage list # 列出所有存储键值 task info # 显示 FreeRTOS 任务状态stack high water gpio read 32 # 读取 GPIO32 电平 log level 4 # 动态提升日志级别该控制台在CONFIG_BAMBOIT_BASE_DEBUG_CONSOLEy时编译进固件生产固件中自动剔除。7. 与主流生态的集成方案7.1 FreeRTOS 深度协同bamboitEsp32Base的任务模型严格遵循 FreeRTOS 最佳实践UI 任务uxPriority 1使用vTaskDelay(10)实现 10ms 周期通信任务uxPriority 3处理 UART/WiFi/BLE 数据包外设任务uxPriority 2执行 ADC 采样、PWM 更新等时间敏感操作所有任务间通过消息队列通信杜绝全局变量// UI 任务发送温度更新请求 xQueueSend(tempUpdateQueue, newTemp, portMAX_DELAY); // 外设任务接收并执行 xQueueReceive(tempUpdateQueue, tempVal, portMAX_DELAY); updatePwmOutput(tempVal);7.2 与 ESP-IDF 组件无缝对接ESP-IDF 组件集成方式示例代码WiFi ManagerWifiConfigurator类封装esp_netifwifiConfig.startAP(ESP32-CONFIG, 12345678)BluetoothBleRemoteSender实现 GATT 服务bleSender.addService(BLE_SERVICE_MENU)OTAOtaUpdater类监听菜单触发otaUpdater.begin(firmware.bin)Power ManagementPowerManager动态调整 CPU 频率powerManager.setMode(POWER_MODE_LIGHT_SLEEP)所有集成均通过extern CC 接口暴露确保与 C/C 混合项目兼容。8. 版本演进与兼容性保障bamboitEsp32Base_3.0.0是该系列的重大架构升级相比 2.x 版本的核心变化维度2.x 版本3.0.0 版本兼容性处理内存模型动态分配菜单项静态内存池 懒加载提供LegacyMenuAdapter兼容旧代码渲染架构单线程同步双模渲染同步/异步setRenderer()接口保持一致存储系统仅 SPIFFSNVS/SPIFFS 双模自动切换PersistentStorage::begin()自动探测协议栈仅 UARTUART/WiFi/BLE 三通道新增setRemoteSender()旧版sendOverUart()保留升级路径替换#include bamboitEsp32Base.h为新路径将new MenuItem(...)改为静态声明编译期优化调用menuManager.setRemoteSender()替代旧版sendToUart()运行idf.py fullclean彻底清除旧构建缓存所有 3.0.0 API 均通过__attribute__((deprecated))标记已弃用接口编译器强制提示迁移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2508411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…