ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI-on-the-edge-device GPIO 参数 IO1 全解析:将串口 TX 引脚改造为可用的数字输入/输出

AI-on-the-edge-device GPIO 参数 IO1 全解析:将串口 TX 引脚改造为可用的数字输入/输出 AI-on-the-edge-device GPIO 参数 IO1 全解析将串口 TX 引脚改造为可用的数字输入/输出【免费下载链接】AI-on-the-edge-deviceEasy to use device for connecting old measuring units (water, power, gas, ...) to the digital world项目地址: https://gitcode.com/GitHub_Trending/ai/AI-on-the-edge-deviceIO1是 AI-on-the-edge-deviceAI-on-the-edge-device 智能抄表项目GPIO 配置模块 中的核心参数之一用于配置 ESP32 上 GPIO1 引脚的工作状态使其可以作为普通数字输入/输出引脚接入水表、电表等外部测量设备的开关信号或继电器控制。阅读本文后你将掌握IO1各字段的取值含义、在config.ini中的完整配置方法以及其背后的引脚模式解析、中断触发、HTTP 接口与 MQTT 发布/订阅等源码级实现原理从而安全地在不影响 USB 串口日志的前提下复用该引脚。IO1 参数概览IO1是 GPIO 引脚配置参数族IO0、IO1、IO3、IO4、IO12、IO13中的一员定义在参数文档 param-docs/parameter-pages/GPIO/IO1.md 中其默认值为input disabled 10 false false该参数属于Expert Parameter专家参数文档明确警告只有真正理解其含义的开发者才应修改它误配置可能导致系统行为异常。对于IO1这个特定引脚还有一个必须牢记的硬件约束警告该引脚默认用于串口通信的TX 引脚USB 日志输出这意味着 ESP32 开发板通过 USB 转串口芯片输出的调试日志、启动信息都依赖 GPIO1。一旦把IO1改配为其他模式尤其是输出模式USB 串口日志将不再可用排查问题时将失去重要的调试手段。因此在使用前必须评估是否仍需要通过 USB 查看日志Wi-Fi 下的 Web 界面日志 log.html 是替代方案之一。六个配置字段逐项解析IO1参数的完整值由空格分隔的 6 个字段组成对应 server_GPIO.cpp 中readConfig()的逐字段解析逻辑代码要求splitted.size() 6并支持可选的第 7 个字段字段序号参数名可选值说明1GPIO 1 stateinput、input pullup、input pulldown、output引脚工作模式下文详述2GPIO 1 use interruptdisabled、rising-edge、falling-edge、rising-and-falling、low-level-trigger、high-level-trigger是否启用中断及触发方式3GPIO 1 PWM duty resolution整数bitLEDC PWM 占空比分辨率位数4GPIO 1 enable MQTTtrue/false是否启用 MQTT 发布/订阅5GPIO 1 enable HTTPtrue/false是否启用 HTTP 读/写6GPIO 1 name字符串MQTT topic 名称为空时使用默认值GPIO1仅允许字符a-z, A-Z, 0-9, _, -默认值input disabled 10 false false的含义是IO1以普通输入模式工作、不启用中断、PWM 占空比分辨率为 10 bit、不启用 MQTT、不启用 HTTP、使用默认名称GPIO1。字段 1引脚状态state文档列出的合法取值为input输入、input pullup输入上拉、input pulldown输入下拉、output输出。从源码 server_GPIO.cpp 的resolvePinMode()可以看到实际支持的解析结果比文档列出的更多包括disabled禁用、built-in-led板载闪光 LED对应 IO4 的默认模式、output-pwmPWM 输出、external-flash-pwm、external-flash-ws281x外部 WS281x 灯带对应 IO12等任何无法识别的字符串都会回落为disabled。因此把IO1显式写为disabled即可完全禁用该引脚。注意文档仅列出input、input pullup、input pulldown、output四种对IO1合法/推荐的状态值其余模式如built-in-led、external-flash-ws281x属于其他引脚的专用模式不建议在IO1上使用。字段 2中断触发use interrupt取值在源码resolveIntType()中与 ESP-IDF 的中断类型一一对应server_GPIO.cpp配置值ESP-IDF 中断类型触发时机disabledGPIO_INTR_DISABLE不触发中断rising-edgeGPIO_INTR_POSEDGE上升沿falling-edgeGPIO_INTR_NEGEDGE下降沿rising-and-fallingGPIO_INTR_ANYEDGE上升沿或下降沿low-level-triggerGPIO_INTR_LOW_LEVEL低电平high-level-triggerGPIO_INTR_HIGH_LEVEL高电平启用中断后GpioPin::init()会调用gpio_isr_handler_add()注册 ISR 处理函数server_GPIO.cpp中断发生时通过 FreeRTOS 队列xQueueSendToBackFromISR()将GpioResult引脚号 电平值投递给后台任务再由gpioInterrupt()将状态变化发布到 MQTTserver_GPIO.cpp。若任一引脚启用了中断readConfig()会调用gpio_install_isr_service()安装 ISR 服务。字段 3PWM 占空比分辨率duty resolution该字段以 bit 为单位指定 LEDC PWM 的占空比分辨率例如10表示 10 bit0~1023 级占空比。readConfig()通过atoi()将其解析为uint8_t并存入GpioPin构造参数dutyResolutionserver_GPIO.cpp主要在output-pwm/external-flash-pwm模式下生效。对于IO1的常规输入/输出用法该字段保持默认值10即可。字段 4/5MQTT 与 HTTP 使能开关enable MQTT为true时若固件以ENABLE_MQTT宏编译见 defines.h 与 CMakeLists.txt会拼接 MQTT topic 并在 interface_mqtt 中注册订阅回调输出模式下可通过 MQTT 消息true/false/1/0控制引脚输入模式下则把引脚状态发布到 topic。enable HTTP为true时可通过设备内置 Web 服务器的/GPIO接口读写该引脚。字段 6名称name该名称用于构造 MQTT topic。为空时默认使用GPIO1源码中通过sprintf(gpioName, GPIO%d, gpioNr)生成见 server_GPIO.cpp指定名称时仅允许a-z, A-Z, 0-9, _, -字符。最终 topic 由MainTopicMQTT / gpioName拼接而成如wasserzaehler/GPIO/GPIO1参见 MainTopicMQTT.md。在 config.ini 中配置 IO1GPIO 配置位于 SD 卡上的 sd-card/config/config.ini或 sd-card/demo/config.ini的[GPIO]段落。示例文件中的相关配置如下[GPIO] ;MainTopicMQTT wasserzaehler/GPIO ;IO0 input disabled 10 false false ;IO1 input disabled 10 false false ;IO3 input disabled 10 false false ;IO4 built-in-led disabled 10 false false ;IO12 input-pullup disabled 10 false false ;IO13 input-pullup disabled 10 false false LEDType WS2812 LEDNumbers 2 LEDColor 150 150 150默认情况下IO1处于注释状态等价于使用默认值input disabled 10 false false。几个实用的配置示例1. 把 IO1 用作按钮/开关输入并通过 MQTT 上报状态变化[GPIO] IO1 input-pullup rising-and-falling 10 true false GPIO1含义输入上拉模式上升沿/下降沿均触发中断10 bit PWM 分辨率启用 MQTT、禁用 HTTPtopic 名称为GPIO1实际订阅地址为MainTopicMQTT/GPIO/GPIO1。2. 把 IO1 用作继电器等外设的输出控制同时支持 HTTP 与 MQTT 双通道[GPIO] IO1 output disabled 10 true true pump_relay含义输出模式不启用中断启用 MQTT 与 HTTP自定义名称为pump_relay。此后既可用 MQTT 消息控制也可用 HTTP 接口控制。3. 完全禁用 IO1例如需要恢复 USB 串口日志[GPIO] IO1 disabled disabled 10 false false源码级原理GpioPin 与 GpioHandlerIO1参数的落地执行由 jomjol_controlGPIO 组件完成核心是server_GPIO.h中定义的两个类server_GPIO.hGpioPin单个引脚的抽象构造参数为(gpio_num_t gpio, const char* name, gpio_pin_mode_t mode, gpio_int_type_t interruptType, uint8_t dutyResolution, std::string mqttTopic, bool httpEnable)与IO1的 6 个字段一一对应。提供init()、getValue()、setValue()、publishState()、gpioInterrupt()等方法。GpioHandler全局管理类负责解析config.ini的[GPIO]段落、维护std::mapgpio_num_t, GpioPin*引脚映射、注册 HTTP URI、创建中断处理任务等。启动流程为gpio_handler_create()→gpio_handler_init()server_GPIO.cpp后者调用GpioHandler::init()读取配置并初始化每个GpioPin随后创建一个名为gpio_int的 FreeRTOS 任务3 KB 栈优先级tskIDLE_PRIORITY 4持续轮询队列server_GPIO.cpp。引脚模式的底层映射GpioPin::init()server_GPIO.cpp把IO1的配置映射为 ESP-IDFgpio_config_t输出类模式GPIO_PIN_MODE_OUTPUT、GPIO_PIN_MODE_BUILT_IN_FLASH_LED→GPIO_MODE_OUTPUT其余 →GPIO_MODE_INPUTinput pulldown→ 使能下拉GPIO_PULLDOWN_ENABLE否则禁用上拉行为由gpio_config_t中pull_up_en决定代码中input-pullup模式会启用内部上拉。setValue()与getValue()server_GPIO.cpp直接调用gpio_set_level()/gpio_get_level()若引脚不是相应模式如在输入模式下调用setValue会返回错误文本GPIO is not in input/output mode。状态发布与变化检测后台任务每秒调用taskHandler()server_GPIO.cpp对未启用中断的输入引脚执行publishState()读取当前电平并与currentState比较仅在新旧状态不一致时才向 MQTT 发布true/falseQoS 1避免重复发布相同状态。MQTT 重连时也会通过handleMQTTconnect()重新发布全部输入引脚状态server_GPIO.cpp。通过 HTTP 接口读写 IO1若IO1的第 5 个字段enable HTTP为true可通过设备 Web 服务器的/GPIO接口进行读写该 URI 在registerGpioUri()中注册并挂接基础认证过滤server_GPIO.cpp。读取引脚状态不带Status参数时返回HIGH或LOWhttp://设备IP/GPIO?GPIO1写入引脚状态仅输出模式有效Status接受HIGH、LOW、TRUE、FALSE、1、0http://设备IP/GPIO?GPIO1StatusHIGH http://设备IP/GPIO?GPIO1StatusLOW源码 server_GPIO.cpp 的处理逻辑为解析GPIO与Status查询参数 → 校验Status合法性 → 通过resolvePinNr()解析引脚号仅允许 0/1/3/4/12/13其余返回GPIO_NUM_NC响应unsupported - only 12 13 free→ 校验引脚已注册 → 无Status时读取电平有Status时写入电平。写入会返回GPIO1 switched to HIGH之类的确认文本。MQTT 集成状态上报与远程控制GPIO 功能的 MQTT 集成代码位于#ifdef ENABLE_MQTT分支内server_GPIO.cpptopic 的构造规则为MainTopicMQTT/gpioName其中MainTopicMQTT默认值为wasserzaehler/GPIO见 MainTopicMQTT.md且该参数无法在 Web 配置页面中修改只能手工编辑config.ini文档标注为实验性功能。因此IO1启用 MQTT 后默认 topic 为wasserzaehler/GPIO/GPIO1输入模式引脚状态变化含中断触发与轮询检测两种路径发布为true/false输出模式订阅同一 topic收到true、1转为高电平或false、0转为低电平时执行setValue()其他字符串返回错误wrong valueserver_GPIO.cpp。订阅回调通过MQTTregisterSubscribeFunction()注册MQTT 连接建立时通过MQTTregisterConnectFunction()注册的重连函数重新同步状态。与其他 GPIO 参数及引脚约束的对比IO1并非唯一可配置引脚GPIO 参数目录 中还包含IO0、IO3、IO4、IO12、IO13各引脚默认值与硬件约束各不相同参数默认值主要硬件约束IO0input disabled 10 false false使用相机时必须禁用同时用于激活 Bootloader 模式复位后必须保持 HIGHIO1input disabled 10 false false默认作为串口 TXUSB 日志引脚IO3input disabled 10 false false默认作为串口 RXUSB 日志引脚IO4built-in-led disabled 10 false false默认用于板载闪光 LEDIO12input-pullup disabled 10 false false无已知限制支持external-flash-ws281x配合 LEDType、LEDNumbers、LEDColorIO13input-pullup disabled 10 false false无已知限制可见IO1与IO3是仅有的两个默认承载串口日志功能的引脚改动前务必确认日志获取途径。若只是想让外部设备触发拍照或其他流程更推荐优先考虑IO12/IO13这类无限制引脚。注意事项与使用建议调试日志优先级IO1是 USB 串口 TX 引脚重配置后将无法通过串口查看日志建议先在 setup.html 中完成 Wi-Fi 配置之后改用 Web 界面的日志页排查问题。专家参数文档明确标注IO1为 Expert Parameter非充分理解请勿修改修改后需重启设备生效配置在GpioHandler::init()时一次性读取。HTTP 只支持已注册引脚若某引脚未在[GPIO]段落注册如处于注释状态/GPIO接口会返回GPIO1 is not registred。输出模式与 MQTT 回环setValue()在setSource ! GPIO_SET_SOURCE_MQTT时才会回发状态到 MQTT避免 HTTP 写入与 MQTT 写入互相触发循环发布server_GPIO.cpp。名称字符限制自定义名称仅限a-z, A-Z, 0-9, _, -非法字符可能导致 topic 无法正常解析。总而言之IO1参数提供了一套“声明式”的引脚配置方案一行配置即可决定引脚的输入/输出模式、中断触发方式、PWM 分辨率以及 MQTT/HTTP 接入能力。在理解了其默认 TX 引脚的特殊约束后你可以安全地把它改造为水表脉冲计数输入、继电器控制输出或自定义传感器信号接口并借助 server_GPIO.cpp 中的完整实现继续深入定制。【免费下载链接】AI-on-the-edge-deviceEasy to use device for connecting old measuring units (water, power, gas, ...) to the digital world项目地址: https://gitcode.com/GitHub_Trending/ai/AI-on-the-edge-device创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表