ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JL-17T接传感器上传小程序:GPIO/ADC/UART支持与I2C/SPI二次开发解析

JL-17T接传感器上传小程序:GPIO/ADC/UART支持与I2C/SPI二次开发解析 最近好几个朋友私信问我同一个问题JL-17T 能不能接传感器接上之后数据能不能发到小程序我的回答一向很简单能但前提是你得知道自己手里的传感器是哪一类输出。GPIO、ADC、UART 这三个接口在 JL-17T 的现有平台能力里基本是现成的配置一下就能用而 I2C/SPI 这类总线接口不是说物理引脚连不上而是固件没有内置完整的总线主控逻辑基本都得走二次开发。这篇文章我从接口边界、接线方案、数据链路到二次开发成本一次性把这些事讲透。想评估采购方案的工程师或刚拿到板子、连 GPIO 输入模式都还没搞明白的新手都可以拿来当一份操作参考。先放结论手上传感器如果是开关量、模拟电压、串口数据那 JL-17T 接传感器发小程序这条路走起来不复杂如果传感器是 I2C/SPI 总线型就要反过来算一下开发成本别一上来就默认“引脚能接就行”。1. 先回答标题问题平台可做和要二开的边界在哪里1.1 什么是 JL-17T 的“平台可做”说“平台可做”指的是一台联网模块在出厂固件里就已经把这些外设能力暴露出来了。JL-17T 这类模块本质上是一个带无线通信能力的控制器节点内部通常有一颗 MCU 负责业务逻辑外加一路 4G/WiFi 等通信链路。用户不需要改固件只需要按照平台的配置方式设置引脚方向、采集周期、上报规则设备就能周期读取传感器数值再通过网络把数据推到指定端点。GPIO 可做是说数字量输入输出能在平台层直接配置比如把一个 IO 配置成输入检测高低电平或者配置成输出控制继电器。ADC 可做是平台已经帮你实现了采样保持和模拟量到数字量的转换你要做的是把传感器电压输出接到 ADC 引脚。UART 可做是平台预留了串口收发能力你可以在配置里定义波特率、数据位、校验位再按帧格式收发数据。这三个接口的底层驱动、引脚复用、中断处理在出厂固件里已经处理完了。对我这种经常做小项目的人来说最大价值就是省掉了写驱动的活把精力放在传感器选型和数据逻辑上。1.2 GPIO/ADC/UART 能覆盖哪些常见传感器我先把三类接口能接的传感器列个清单方便对号入座。GPIO 数字输入类人体红外传感器PIR、门磁干接点、浮球液位开关、急停按钮、光电开关。这类传感器的本质就是“导通/断开”或者“输出高/低电平”模块只需要判断引脚电平变化就知道现场状态。ADC 模拟量采集类土壤湿度传感器、光敏电阻模块、水位传感器、NTC 温度传感器、部分压力变送器。它们输出的是随物理量变化的电压ADC 把它量化成数字再由软件换算成物理单位。UART 数字协议类气象站、风速风向传感器、串口 PM2.5 传感器、部分激光测距模块、Modbus RTU 环境变送器。它们内部已经把物理量转换成了数字信号通过串口帧格式对外发数据。项目里常见的“设备状态、环境参数、防拆告警、能耗监测”这几类需求用 GPIO/ADC/UART 基本能覆盖九成以上。所以先不要急着上 I2C/SPI先看你手上的传感器到底属于哪一类。1.3 I2C/SPI 为什么不直接支持这是很多人容易误解的地方。从外观上看I2C 只有 SDA、SCL 两根线SPI 也就四根线怎么就不能直接用呢问题不在“能不能接线”而在于这两个总线接口工作时需要主动产生时钟、寻址、读写寄存器、判断从机应答这一整套逻辑如果固件里没有那条总线就是死的。I2C 的 SCL 时钟要由主机产生SDA 线电平变化要在时钟节拍内被正确采样每个从机有一个 7 位地址主设备要先发地址再通信。SPI 更讲究CS 片选要拉低选中设备SCK 的极性和相位要和从机匹配MISO/MOSI 数据线要按位读写。这些时序只要错一点点数据就是废的。可能有人会说“板子上明明把 SDA、SCL 引脚引出来了”。引脚引出来和固件支持是两回事。JL-17T 的平台固件如果没有实现 I2C/SPI 的主机状态机你接上一个 I2C 温湿度传感器模块没有定时读写它的能力数据自然进不来。所以标题里那句“I2C/SPI 要二开”本质是说你自己得把固件里缺失的总线驱动补上。2. 动手前先想清楚传感器选型和接口约定2.1 判断传感器信号类型的四步流程每次拿到一个新传感器我不会直接去翻例程而是先问自己四个问题这个传感器供电是多少伏3.3V 还是 5V或者是 12V/24V 独立供电输出是什么类型开关量、模拟电压、4-20mA 电流还是 UART/Modbus 数字协议输出电平范围是多少满量程是 3.3V 还是 5V逻辑高电平最低是多少我需要它多久上报一次毫秒级实时还是几秒一次周期采集这四个问题答完接口基本上就定了。这里再补一句不要只看传感器标签上的“输出信号”要看它是否需要额外驱动电压。很多工业压力变送器输出 4-20mA但供电是 24V。这种传感器JL-17T 的 3.3V 引脚根本带不动必须外置 24V 电源再通过 250Ω 精密电阻把电流转成 1-5V 电压进 ADC。2.2 接线前必做的电平与供电检查电平匹配是现场数据采集最常见的一个翻车点比协议错还容易烧设备。模块的 GPIO 和 ADC大概率工作在 3.3V 逻辑电平。如果传感器输出的是 5V TTL 高电平直接进 GPIO短时间可能能识别但长期使用会加速 IO 口老化严重时损坏内部保护结构。稳妥做法是加一级电平转换电路或者直接选 3.3V 版本的传感器模块。如果是一颗 5V 供电的模拟输出传感器输出满量程可能到 4V 甚至更高这个电压超过 ADC 参考电压的话采样值一直封顶不说还可能把 ADC 前端电路打坏。供电电流也要算。一个 PIR 模块峰值电流可能不到 1mA但一个带加热功能的 PM2.5 传感器瞬间电流能到几百毫安。拿模块的 3.3V 引脚去直接供电压会被瞬间拉低严重时 MCU 直接复位。我的习惯是先把传感器数据手册翻出来重点看“工作电压范围”和“最大工作电流”确认模块 IO 的供电能力是否足够。不够就老老实实用外部稳压电源模块和传感器之间只共地。2.3 一个能少走弯路的传感器接线记录表长期做数据采集的人都会有一本记录表。前几年我给一个农业大棚装了十几路传感器后来全靠这张表才能快速定位问题。建议每接一款传感器就记录一次这六项内容设备编号、安装位置使用的模块接口GPIO 几、ADC 几、UART 几传感器型号与量程供电电压与供电方式信号类型、信号范围上报周期与主要配置参数这张表的用处是当你发现某一路数据异常时不用重新翻手册一眼就能看出到底是“信号接反了”还是“电压等级不匹配”。很多物联网项目后期维护的痛点不是采集逻辑难而是没有一张能对上的记录单靠记忆排查半天时间就耗掉了。3. 把传感器数据送进小程序的完整链路设计3.1 链路怎么走小程序才能拿到数据这里要先纠正一个认知小程序本身是不允许和远端模块直接建立 TCP 长连接来收数据的。微信平台出于安全限制只允许小程序请求已备案且配置过的后台服务器域名。所以数据链路必须是传感器 → JL-17T 采集 → 网络发送到云端 Broker/服务端 → 数据库存储 → 小程序从云端请求或通过 WebSocket 订阅数据。简单说JL-17T 的角色是边缘采集与传输终端云端是数据中转站小程序只是最上层的展示节点。如果项目一开始就把数据当成“从模块点对点发给小程序”后面大概率要返工改架构。我自己最常用的两套链路链路 AJL-17T 通过 MQTT 上报到云 Broker云端写库小程序通过 HTTPS API 查询实时/历史数据。链路 BJL-17T 直接 POST JSON 到自有服务器 API服务器经 WebSocket 主动推送给在线小程序页面。两种链路的共同点是必须有中转层。数据从中转层到小程序这环要特别注意微信小程序对“合法域名”的要求。个人调试时需要在小程序后台把服务器域名加入 request 合法域名列表并确保服务器有有效 HTTPS 证书。自签名证书真机上会被直接拒绝这个坑我踩过好几回。3.2 MQTT、HTTP、WebSocket 怎么选做过现场项目的人都有体会三种协议没有绝对好坏只有合不合适。MQTT 适合“设备多、数据量小、网络不稳定”的情况。它有 QoS 级别设备离线再上线还能收到离线期间的消息流量开销也小。我做环境监测这类项目用得最多。HTTP 适合“低频请求、查询型业务”。模块每个周期 POST 一条 JSON服务器返回 200 就算发送成功。简单直接不需要额外维护长连接但不方便做双向实时推送。WebSocket 适合需要页面实时刷新的场景服务器可以主动把新数据推到小程序端。缺点是每个连接都会长期占用资源设备如果非常多网关压力会比较大。所以我的选择习惯是常规传感器采集用 MQTT 上云小程序通过后端 API 拿数据如果只是单台设备做简单调试直接 HTTP POST 更省事。小程序端代码并不关心底层是 MQTT 还是 HTTP因为最终都是通过 wx.request 拿 JSON或者 wx.connectSocket 订阅推送。3.3 推荐的数据报文结构与解析方法不管底层走 MQTT 还是 HTTP上报字段建议统一用 JSON。模块端上报到云端云端尽量原样保存小程序解析时风格保持一致。我常用的一份上报报文大概长这样{ deviceId: JL17T-001, timestamp: 2025-06-11 08:30:00, data: { gpio_door: 1, soil_moisture: 28.6, temperature: 25.3 } }字段含义deviceId 区分设备timestamp 是采样时间data 里放物理量。解析时注意模拟量不要只发原始 ADC 值最好在模块端先把 ADC 换算成真实物理量如果一定要发原始值云端转换规则必须写清楚不然小程序上显示一屏 0 到 4095 的数字用户根本看不懂。3.4 小程序端展示实现思路小程序端代码其实不复杂核心就是“请求云端接口把 JSON 渲染到页面”。比如查询设备最新一条数据用 wx.request 请求后端接口拿到数据后 setData 渲染即可wx.request({ url: https://api.example.com/device/latest?deviceIdJL17T-001, success(res) { const data res.data.data; this.setData({ temperature: data.temperature, soilMoisture: data.soil_moisture, doorStatus: data.gpio_door 1 ? 打开 : 关闭 }); } });看起来确实“小程序能收到数据”但收到的是中转服务器转发来的数据。真正要提前设计好的是接口返回格式、鉴权方式、错误码约定。想让页面数据自动刷新可以加 setInterval 定时轮询也可以接 WebSocket 实时推送。实时性要求不高时用 5 秒轮询最简单也不容易触发连接数限制。4. 三种平台接口的实际配置与踩坑记录4.1 GPIO 做数字输入人体红外/干接点门磁实操先说 GPIO 接得最多的两类一个是 PIR 人体红外另一个是干接点门磁。PIR 模块一般三根线VCC、GND、OUT。多数模块输出 3.3V 高电平表示“检测到人”平时输出低电平。接线时把 OUT 接到 GPIO然后在模块配置里把引脚设为“数字输入”逻辑上 1 表示触发0 表示没触发。实际踩坑点在供电。我试过用 3.3V 引脚直接给 PIR 供电输出高电平只有 2.8V 左右虽然多数 GPIO 还能识别但低温环境偶尔误判后来统一改用独立 5V 供电才稳定。干接点门磁更典型。门磁两根线关门时磁铁靠近干簧管触点闭合开门时断开。如果直接把两根线接到 GPIO 和 GND模块内部必须配置为上拉输入。建议优先用“内部上拉输入”开关闭合时读到低电平断开时读到高电平这样省掉外部上拉电阻也不至于悬空。如果你习惯外部接 3.3V也可以配置成下拉输入但干接点这种纯通断器件最稳妥的还是“上拉到电源、检测低电平”。还有一点干接点线如果拉得很长建议在 GPIO 对地加一个 10kΩ 电阻再并联一个 100nF 电容滤掉高频干扰。继电器、交流接触器动作瞬间会有电磁干扰不加吸收电路容易误触发。这个组合不是我拍脑袋想的是反复试出来最廉价有效的防抖方案。4.2 ADC 模拟量采集土壤湿度传感器实操与数据换算土壤湿度传感器模块是低端项目里最能体现 ADC 水平的设备。常见模块有两种一种 AO 口输出模拟电压土壤越干电压越高越湿电压越低另一种在模块上还带比较器输出数字量。要拿到连续湿度值接的是 AO。接线时 AO 接 ADC 引脚VCC 接电源GND 共地。JL-17T 这类平台里 ADC 分辨率常见 12 位也就是读值范围 0-4095。假设参考电压 3.3V电压换算公式V raw × 3300 / 4095单位 mV拿到电压之后还要对应湿度曲线做换算。模块厂家一般不给你精确曲线只给“越湿电压越低”这种趋势。我的做法是安装现场做两点标定把探头放干燥空气中测一个电压再泡水后测一个电压两点之间建立线性映射。标定要在设备实际安装环境下做因为不同批次探头输出的干/湿电压并不完全一致。ADC 最大的坑是读数抖动。把探头悬空时数值都不会平稳低端模块更明显。我常用的软件处理是连续采样多次再滤波连读 10 次 ADC去掉一个最大值和一个最小值再取平均。这样能有效消除随机噪声同时不损失太多实时性。硬件上加一个 100nF 电容并在 ADC 引脚到地之间也能滤掉不少高频噪声。如果传感器供电用的开关电源建议在 VCC 和 GND 之间再并一个 10μF 电解电容。别小看这两个电容系统采样抖动从 ±50mV 降到 ±5mV 是很常见的提升。4.3 UART 对接 Modbus 温湿度传感器UART 是三种接口里业务逻辑最重的因为传感器数据是“帧”而不是单纯电平。拿最常见的“RS485 输出、Modbus RTU 协议”的温湿度变送器来说物理接口是 RS485但由于 Modbus RTU 底层就是 UART 异步串行通信所以 JL-17T 的 UART 一样能处理只是中间需要一个电平转换。JL-17T 的 UART 引脚是 TTL 电平RS485 是差分信号两者不能直接互连。需要外接 TTL 转 RS485 模块比如 MAX485 或带自动收发功能的模块。通信参数一般设 9600、8 数据位、无校验、1 停止位。接线时模块 TX 接 485 小板 RX模块 RX 接 485 小板 TX485 的 A 接传感器 AB 接传感器 B。很多新手把 A/B 接反或者没共地导致读回来的数据要么全错要么 CRC 校验失败。距离超过几十米建议在总线末端加一个 120Ω 匹配电阻。Modbus RTU 读温湿度的典型请求帧请求01 03 00 00 00 02 C4 0B从机地址0x01 功能码0x03读保持寄存器 起始寄存器0x0000 读取数量0x0002 CRC 校验C4 0B返回帧一般是 01 03 04 01 2C 00 9A CRC。意思是返回 4 个数据字节温度 0x012C 300湿度 0x009A 154按变送器说明除以 10 就得到 30.0℃ 和 15.4%RH。平台端需要把 UART 收到的字节流按帧格式解析CRC 校验通过后做物理量换算。还要注意很多 RS485 变送器不是主动上发数据而是主机问一帧、从机回一帧。如果 JL-17T 的 UART 只支持被动透传那平台没法自己主动发请求帧这种传感器就接不了。选型时要特别问清楚它 UART 是“透传模式”还是“主动查询模式”前者适合对接串口打印型数据源后者才适合主动查询 Modbus。4.4 上报策略轮询周期、超时重试与断网缓存数据能采到并不代表链路好使真实环境里更关键的是上报策略。我的做法通常是这样普通环境量温度、湿度、土壤10 秒到 1 分钟一个周期就够不需要毫秒级频繁上报。报警类门磁、烟感、水浸检测到变化时立即上报不等周期。上报失败后做指数退避重试比如先等 5 秒再等 10 秒、20 秒最多重试 5 次避免一直占着网络通道。有条件的话加断网缓存现场数据先存在模块里网络恢复后按时间顺序补传。采集周期还要和传感器特性匹配。ADC 采样本身很快毫秒级就完成但如果传感器是加热式的气体探头数据分钟级才变化一次再频繁采样也变不出新数据。所以“采得越快越好”是误区采样频率略高于物理量自然变化频率就够了。5. I2C/SPI 二次开发到底在开发什么5.1 为什么很多新传感器偏偏只给 I2C/SPI 接口现在市面上的高精度传感器很多只出 I2C/SPI 总线版本比如高精度气压计 BMP390、温湿度传感器 SHT4x、IMU 模块 MPU6050、多通道 ADC 芯片。原因在于这些器件寄存器多、精度高、要配置校准系数用总线接口能高效读写内部寄存器省引脚也更可靠。问题也就出在这。你说这些传感器很常用可 JL-17T 目前的平台接口能力只覆盖 GPIO/ADC/UART遇到这类器件就只能看着引脚干瞪眼。我的经验是如果项目里必须用这类传感器而模块不支持优先考虑换接口方案。比如要接 I2C 气压计可以选带 I2C 转 UART 的变送器成品或者用一颗几块钱的 STM32 单片机做协议桥传感器用 I2C 接单片机单片机再用 UART 把数据转发给 JL-17T。这样虽然多了一个 MCU但硬件成本和开发难度都可控比直接改 JL-17T 固件要容易落地。5.2 二开不是“会写一个读函数”就完了真正走到二开这一步整个完整工作包括找到平台开放的 SDK 和编译环境把 I2C/SPI 底层驱动加进去在引脚复用配置里分配 SDA/SCL/CS/SCK/MOSI/MISO 这些信号确保没有被业务外设占用同时移植传感器官方驱动看数据手册确认上电时序、寄存器初始化序列、校准系数读取和转换算法。最后还要把新采集的数据接进原有上报链路统一格式、统一周期上传不能另起炉灶发不兼容的数据。完整走完这一套周期短则一两天长则一两周。而且结果跟原厂 SDK 开放程度强相关。有些联网模块固件根本不公开源码你想二开也没地方下手有些则提供二开示例和驱动框架可控性就好很多。所以在选型阶段一定要先问“固件支不支持二次开发外设驱动源码是否开放”别等代码写一半才发现锁死。5.3 软件模拟 I2C/SPI 到底能不能用来救急如果 JL-17T 支持用户脚本或用户自定义代码确实有土办法用 GPIO 翻转去模拟 I2C 的 SCL/SDA 时序一位一位敲数据。我做临时验证时用过软件模拟 I2C 读气压传感器短距离、100kHz 速率没问题。但要长期量产我强烈不建议。软件模拟 I2C 会持续占用 CPU时序容易受中断影响。设备一边要保持网络通信一边还要精确翻转 GPIO两者很容易互相干扰。SPI 也一样软件模拟在低速下能工作但 SPI 更看重数据在时钟沿的建立保持时间模拟起来更容易出错。结论就是临时调试可以玩正式量产别碰。二开就老老实实写底层驱动。6. 上线前必查常见问题与排查技巧实录6.1 数据根本没传上去先从这四层排查现场故障里数据不上报九成是下面几类原因。排查顺序很重要不要一上来就怀疑模块坏了。电源层传感器和模块有没有正常供电电压是否稳定。网络层SIM 卡是否欠费、信号是否正常、WiFi 是否能连到路由。设备配置层GPIO/ADC/UART 的模式和引脚是否配错上报开关是否打开。云平台层Topic、域名、鉴权信息是否一致服务器接口是否返回异常。有一回现场一直没数据查了半天最后发现是设备上报的 Topic 少了一位和云端订阅不一致。这种问题最容易被忽略所以我一直强调用真实报文做一次“模块到云端再到小程序”的全链路验证不要只看配置界面亮没亮。6.2
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进