十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

从传感器到微信小程序:JL-17T的GPIO/ADC/UART接入与I2C/SPI二开解析

从传感器到微信小程序:JL-17T的GPIO/ADC/UART接入与I2C/SPI二开解析 JL-17T“能不能接传感器、能不能发小程序”这个问题我最近被问了好几次。不少人是手上正好有这个模组想做个小项目结果翻了一圈资料看到“GPIO/ADC/UART 平台可做I2C/SPI 要二开”这句话人直接懵了。这行字的信息量其实很大它告诉你哪些传感器能直接怼上去哪些必须绕路以及整个“传感器 → 模组 → 手机小程序”的链路大概长什么样。先把结论放在前面如果你的传感器是开关量、模拟量或者本身走串口输出那 JL-17T 拿到手基本就能干活配合厂商的云平台或者自建服务器把数据送进微信小程序是完全走得通的。但如果你手上的传感器是 I2C 或者 SPI 协议比如常见的温湿度传感器 SHT30、气压计 BMP280、OLED 屏幕那就别指望开箱即用了得考虑二次开发或者外挂一颗小单片机转接。这篇就围绕这个“能不能、怎么接、怎么发”的问题把整个链路拆开讲清楚。1. 先弄清 JL-17T 的定位它到底是什么样的设备JL-17T 从命名和描述来看属于典型的物联网无线采集/透传模组。这类设备的定位不是“万能开发板”而是一个“通信管道”它把你的数据从采集端搬到云平台再让小程序通过接口拿下来。理解这一点很重要因为很多人拿它当 ESP32 或者 STM32 用以为所有外设都能直接挂上去这从一开始就走偏了。1.1 JL-17T 在产品中的角色无线传输网关而非通用主控通俗点说JL-17T 的“本职工作”是负责无线传输和简单的数据采集。它内部有无线通信模块可能是 WiFi、4G 或者 NB-IoT 之类的蜂窝方案具体看型号配置同时引出了一些通用引脚方便用户接传感器。它的核心价值是把“采集数据”和“远程查看”之间那段看不见的距离打通传感器测到温度、湿度、开关状态经过 JL-17T 编码后发送到云端小程序再从云端拉取展示。弄清楚这个角色定位后你对它的接口能力就会有合理预期它是面向“简单采集 可靠传输”设计的不是拿来跑复杂算法的。它支持的传感器类型取决于出厂固件暴露了哪些接口和协议。平台说“GPIO/ADC/UART 平台可做”意思是这三类接口的能力已经在固件里做好了用户可通过配置或简单调用直接使用。所以当你问“JL-17T 能接传感器吗”准确回答是能接但不是所有传感器都能直接接。能不能接取决于传感器输出的是什么信号类型。1.2 为什么 GPIO/ADC/UART 能直接支持这三类接口是物联网采集的基本盘GPIO、ADC、UART 之所以是“平台可做”因为它们是物联网领域最通用、最容易被固件预先支持的三种外设接口GPIO通用数字输入输出读的是高电平或低电平对应传感器的数字输出。比如人体红外传感器有人输出高电平没人输出低电平、门磁开关开合导致电平跳变、继电器状态反馈这类传感器本质是“开关量”一根线就能搞定。ADC模数转换读的是电压值对应传感器的模拟输出。典型的如土壤湿度传感器、光敏电阻模块、NTC 热敏电阻分压电路它们输出的电压随被测物理量变化ADC 引脚将这个电压换算成数字量。UART串口读的是异步串行数据。很多中高精度传感器本身就是串口输出的比如 PM2.5 激光粉尘传感器如攀藤 PMS5003、GPS 模块、部分气体传感器它们把处理好的数据打包成固定帧格式通过 TX/RX 两根线发出来。这三类接口的共同点是固件可以提前把这些“读数据”的能力做好用户拿到手只需要配置一下引脚、上报周期不需要编写复杂的驱动协议。这就是“平台可做”的真实含义。1.3 I2C/SPI 为什么要二开总线协议不是“接根线就有数据”这么简单I2C 和 SPI 则完全是另一回事。它们是有时钟线、有地址/片选机制、有严格时序要求的同步总线协议。传感器挂在 I2C/SPI 总线上主控需要按照协议规范发起通信、读写寄存器、解析数据。这对固件的要求高得多固件里要有对应的总线控制器驱动或者用 GPIO 模拟时序的软件实现要预留引脚给 SCL/SDA 或 CS/SCK/MOSI/MISO应用层要支持用户配置传感器型号、寄存器映射、采样频率如果 I2C 地址冲突或 SPI 片选不够还要做多路切换。这意味着厂商如果把 I2C/SPI 支持做进标准固件里成本会显著上升。所以很多物联网模组选择只把 GPIO/ADC/UART 做成“开箱即用”I2C/SPI 则留给有开发能力的客户自行二次开发改固件、加驱动或者干脆不开放。注意这里说“I2C/SPI 要二开”不代表你完全没救二开有两层路径一是你有 SDK 和编译工具链自己改固件二是你没有能力改固件那就通过外部单片机“转接”。后面第 4 部分会详细展开。2. 从传感器到小程序整条链路的三种可行形态单看“能不能接”没有意义真正的目标是数据能从传感器一路跑到手机上的微信小程序里。JL-17T 在这个链路里处于中间传输层根据你的设备形态和服务器情况有几种完全不同的落地形态。2.1 形态一设备上报到云平台小程序通过 API 拉取这是最主流、也最稳的架构。JL-17T 通过自带的无线模块连接互联网将采集到的数据以一定频率上报到物联网云平台厂商自己的云、阿里云 IoT、腾讯云 IoT、EMQX 自建等。云平台把数据存起来提供 HTTP API 或消息推送接口。小程序端通过wx.request请求云平台 API 获取数据或者通过 WebSocket 实时接收推送。推荐给大多数场景原因有三开发量最小设备端只需要处理采集和上报小程序端只需要调用接口两端解耦。云平台天然解决设备管理问题设备鉴权、数据存储、告警规则都不用自己造轮子。小程序上线审核友好微信小程序要求所有请求域名必须备案且开启 HTTPS/WSS云平台自带合法域名避免审核折腾。2.2 形态二小程序蓝牙直连设备仅限支持 BLE 的变体如果 JL-17T 的无线方案是低功耗蓝牙BLE那就多了一条很有意思的路设备本身不连互联网手机小程序通过蓝牙 BLE 接口直接连接设备读取传感器数据。微信小程序是有蓝牙 API 的wx.openBluetoothAdapter、wx.createBLEConnection、wx.getBLECharacteristicValue而且不需要服务器。但这条路的限制也很明显只能本地近距离操作一般 10 米以内出了屋子就没信号了小程序进入后台蓝牙连接很可能会被系统断开如果你的 JL-17T 是 WiFi/4G 版本没有 BLE这条路直接堵死。形态二适合“人到现场调试设备”的场景不太适合远程监控类产品。2.3 形态三DTU 透传 自建 TCP/UDP 服务器小程序读服务器还有一种老派做法JL-17T 以 DTU数据传输单元模式工作把串口收到的数据原样透传到一台自建的 TCP/UDP 服务器上。服务器端自己写协议解析、数据存储然后小程序再从这台服务器读取数据。这条路灵活度最高但开发量也最大你需要自己搞定公网服务器、TLS 证书、域名备案、数据存储方案以及小程序端和服务器之间的接口设计。除非有特殊需求比如要对接私有协议、本地闭环否则我不建议从零开始搭。三种形态对比形态设备要求开发量延迟适合场景云平台API能联网上报最低秒级远程监控、产品上线BLE 直连设备带 BLE中等毫秒级现场调试、近场操作DTU自建服务器支持透传最高秒级私有协议、特殊业务3. GPIO/ADC/UART 三种接入方式的实操指引既然 JL-17T 标准平台支持 GPIO/ADC/UART那这部分展开说说每种接口怎么接、怎么避坑。我不是 JL-17T 的厂商工程师无法给出特定型号的具体引脚号和配置菜单但基于同类物联网模组的通用实践下面的内容和检查点是普适的。你拿到设备后第一步先看厂商提供的《接口说明》或《AT 指令手册》对照自己的传感器选型。3.1 GPIO 数字量采集开关、门磁、人体红外一类的传感器这类传感器输出的是离散电平要么高要么低接法最简单。常见的几种人体红外传感器 HC-SR501输出高电平表示有人低电平表示无人供电一般是 5V输出也是 5V 电平。门磁开关本质是干接点常开或常闭需要接一个上拉电阻到 VCC开关闭合时把电平拉低。继电器状态反馈继电器辅助触点同样处理成开关量。实操要点确认 JL-17T 的 GPIO 耐压值。很多无线模组的 GPIO 是 3.3V 电平直接接 5V 输出的传感器轻则采样错误重则烧毁引脚。安全做法5V 传感器输出先经过电阻分压比如 10K 和 4.7K 分压降到 3.3V 再进 GPIO。对于干接点输入MCU 内部上拉未必可靠建议外部加 10K 上拉电阻到 VCC默认读到高电平闭合时读到低电平。如果是脉冲计数场景比如流量计、风杯风速计输出脉冲还要确认 JL-17T 的 GPIO 是否支持中断计数以及固件里有没有对应的计数配置项。没有的话可以通过高电平持续时间粗算但精度就不要期望太高了。3.2 ADC 模拟量采集土壤湿度、光敏、NTC 温度模拟量传感器输出的是连续电压JL-17T 的 ADC 引脚将电压转换成数值。典型接法土壤湿度传感器市面上几十块钱的土壤湿度模块输出 0~3V 左右的模拟电压干燥时电压高湿润时电压低也有反的看具体型号。直接接 ADC 引脚即可注意模块供电要稳定。光敏电阻模块本质是光敏电阻加上可调电位器组成分压电路输出模拟电压。很多模块还同时提供数字输出可调阈值模拟输出接 ADC 更精确。NTC 热敏电阻测温不能直接把 NTC 接 ADC需要搭一个分压电路。最常见的接法是 NTC 一端接 VCC另一端串联一个固定电阻比如 10K到 GND中间节点接 ADC。读取到的电压经过公式换算得到电阻值再从 NTC 分度表或 Steinhart-Hart 方程算出温度。分压电路示意VCC ──┬── NTC (10K25℃) │ ADC ──┐ │ │ └── R_fixed (10K) ── GNDADC 采样的几个关键坑参考电压确认 JL-17T 的 ADC 参考电压是内部固定 3.3V 还是可配置的。如果参考电压是 3.3V而传感器输出范围只有 0~1V那分辨率会浪费很大一截可以考虑用运放把信号放大或者选输出范围更匹配的传感器。量程匹配传感器输出超过 ADC 参考电压时必须分压否则数值会一直顶满看不出变化。我见过很多新手直接把输出 5V 的模块接到 ADC 上采回来全是 409512bit ADC 满量程完全白搭。电源稳定性ADC 读数对参考电压波动很敏感给传感器供电时尽量用模组自带的稳压输出不要用电池直接怼。如果传感器瞬间电流较大供电电压跌落会导致读数跳变。3.3 UART 串口接入PM2.5、GPS、以及外挂 MCU 的通信口UART 是这类模组最值得深挖的接口。它有两个典型用途直接接串口输出的传感器比如攀藤 PMS5003 PM2.5 传感器输出主动帧里面包含 PM1.0/PM2.5/PM10 数值或者串口 GPS 模块输出 NMEA 0183 协议文本。接一颗外挂单片机比如 STM32、Arduino、ESP32让单片机负责采集复杂传感器然后通过串口把整理好的数据发给 JL-17T 上传。这是绕开 I2C/SPI 限制的关键思路后面会重点讲。串口接入的检查清单电平匹配绝大多数串口传感器和模组的 UART 都是 TTL 电平可以直接连但要确认模组是 3.3V 还是 5V IO。如果是 RS232 电平的传感器必须加 MAX3232 电平转换芯片。波特率一致传感器默认波特率通常写在数据手册里。PMS5003 默认 9600GPS 模块常见 9600 或 115200。JL-17T 的配置端要把波特率设成一致否则收到的全是乱码。数据帧格式有些传感器是主动上报上电就源源不断发数据有些是需要主机下发指令才应答。对主动上报型JL-17T 只需要透传数据对应答型需要确认平台固件支不支持“定时下发指令、接收应答”的链路不支持的话就要靠外挂 MCU 去转。引脚交叉串口连接必须 TX 接 RX、RX 接 TX接线错了不烧但收不到数据。两个设备的 GND 必须共地别漏了。UART 还有一个好处即使 JL-17T 只有一个可用串口你也能通过外挂 MCU 串口扩展出一堆设备来。我在实际项目里经常这么干STM32 负责 I2C 读取温湿度 SPI 读取气压整理成一串 JSON 后通过串口丢给无线模组模组只负责透传。这套组合拳基本能兼容 90% 的传感器。4. I2C/SPI 二开到底难在哪协议、内存与固件的三重限制这个部分说说为什么要二开以及二开到底要动哪些东西。你理解了背后的限制之后才能评估自己到底要不要走这条路。4.1 第一层限制引脚和硬件控制器不一定引出来很多物联网模组把有限的引脚做了多功能复用。比如说某个引脚在硬件上支持 I2C但出厂固件把这个引脚的复用功能配成了 GPIO 或者串口用户配置界面根本没有“切换成 I2C”这个选项。硬件上能做软件层没开放等于没有。如果引脚恰好引出来了并且芯片的硬件 I2C/SPI 控制器没有被占用理论上你还有一条“软硬结合”的路用任意两个 GPIO 模拟 I2C俗称 Bit-banging用 4 个 GPIO 模拟 SPI。但这种做法对 CPU 负担不小尤其是高频读写传感器时容易影响无线协议栈的实时性。JL-17T 这种弱主控模组跑模拟 I2C 还能承受但跑高频率 SPI比如刷 TFT 屏就别想了。4.2 第二层限制固件和应用层没有对应的协议驱动就算引脚能用你的传感器也得有人去驱动。标准固件里如果有“读 SHT30 温湿度”的预设功能你用起来自然舒服。但如果你手上是一个不太常见的 I2C 传感器厂商没有预设驱动你就需要自己写寄存器配置、自己解析数据然后想办法把数据塞进上报帧里。这已经不是“配置一下”能解决的事了必须进入固件开发层面。4.3 第三层限制内存和资源有限不一定会给你留二开空间类 JL-17T 方案的 MCU 内存通常以 KB 为单位。通讯协议栈、数据缓冲、状态机已经吃掉大量资源。你再往里塞 I2C 驱动、SPI 驱动、传感器数据处理代码很容易把内存挤爆。尤其是用 RTOS 或裸机循环通信的程序加一个带 DMA 的 SPI 驱动内存开销会很可观。基于这些限制实际项目里 I2C/SPI 传感器的接入通常走下面三条路路径 A厂商二次开发支持。联系厂商确认是否提供 SDK 和固件编译环境。如果提供你自己/让厂商加驱动后重新编译固件。这条路径最直接但依赖厂商配合一般量大才有这个待遇。路径 B外挂协处理器转接强烈推荐。用一颗几块钱的 8 位单片机STM32、ATtiny、甚至 Arduino Nano专门负责 I2C/SPI 传感器把读到的数据算好后通过 UART 发给 JL-17T。JL-17T 不需要任何改动只当“串口透传通道”用。这是我在项目里最常用的解法。路径 C换主控。如果产品还在选型阶段而且传感器数量多、种类杂、需要高速采集那就别硬用 JL-17T。换一颗本身支持 I2C/SPI 且带无线通信的主控比如 ESP32、nRF52840 之类后面的事会简单很多。协处理器转接的接线逻辑SHT30 (I2C) ──┐ BMP280 (I2C) ──┼── STM32/Arduino ── UART (TTL) ── JL-17T ── 云平台 ── 小程序 MAX31865 (SPI) ┘这样做的好处显而易见JL-17T 保持原样不用承担二开风险传感器数据在协处理器里完成解析和预处理JL-17T 拿到的已经是“整理好的文本帧”上传就完事。唯一的坏处是多了一块板子和几根线但换来的稳定性和开发效率是值得的。5. 数据上云与小程序展示设备端搞定了接收端怎么弄数据从传感器到 JL-17T只是第一步。真正让用户“看得到”的是小程序端。这部分的工程量和坑其实比设备端还要多。5.1 上报数据格式设计先定协议再写代码无论走哪种链路设备端上报的数据应该有一个相对统一的格式。我比较推荐 JSON 文本易读、易扩展、小程序端解析也方便。一份典型的上报数据长这样{ deviceId: JL17T-001, ts: 1699999999, data: { pm25: 35.2, pm10: 58.1, switch: 1, battery: 3.85 } }注意几个要点deviceId用于区分设备小程序端展示时按设备筛选。ts用 Unix 时间戳便于云平台排序和历史查询。data里只放业务数据字段名统一用英文小写加下划线避免中文编码问题。如果走串口外挂 MCU 路线协处理器发给 JL-17T 的也应该是这种 JSON 行文本JL-17T 直接当透传内容上传即可。这样即便后面更换主控方案上面的数据格式也不用变。5.2 云端通道选择厂商云、阿里云/腾讯云 IoT、还是自建 EMQX云端负责接收、存储、转发数据。三种常见选择厂商自带云平台如果是 JL-17T 原厂提供的配套云服务那是最省事的。设备上电自动注册云平台自动建产品小程序端调用厂商开放的 OpenAPI 即可。不足之处是自由度低数据可能只能在自己的小程序里用想搞复杂业务逻辑得看厂商 API 给不给力。公有云 IoT 平台阿里云 IoT、腾讯云 IoT 都是比较稳的选择。设备端通过 MQTT 接入云平台自动处理设备影子、数据流转可以配置规则引擎把数据转发到数据库或者函数计算里。腾讯云 IoT 跟微信小程序是同生态鉴权对接更顺滑。自建 EMQX/Mosquitto适合有服务器运维能力、数据不想经过第三方的场景。自建 MQTT Broker 本身不难难的是后续的数据存储、消息持久化、API 封装、域名备案、TLS 证书配置这一整套下来工作量不小。小程序端访问云端的数据需要服务器提供 HTTP API 或 WebSocket 推送。以微信小程序为例wx.request只能发 HTTPS 请求而且域名必须在小程序后台配置白名单并校验文件。如果你的服务器没有备案、没有 HTTPS 证书调试阶段还行上线审核一准卡壳。5.3 小程序端数据展示请求拉取与 WebSocket 实时刷新小程序端相对简单。请求拉取模式适合低频展示场景比如用户打开小程序才刷新一次Page({ data: { temp: --, humidity: -- }, onLoad() { this.fetchData(); }, fetchData() { wx.request({ url: https://your-api.example.com/api/sensor/latest, method: GET, success: (res) { if (res.statusCode 200) { this.setData({ temp: res.data.temp, humidity: res.data.humidity }); } } }); }, onPullDownRefresh() { this.fetchData(); wx.stopPullDownRefresh(); } });如果需要实时刷新比如数据每秒都在变化用 WebSocket 更合适const socket wx.connectSocket({ url: wss://your-api.example.com/ws }); socket.onMessage((msg) { const data JSON.parse(msg.data); this.setData({ temp: data.temp, humidity: data.humidity }); });实时刷新有三个注意点WSS 协议WebSocket 必须走wss://不能走裸ws://否则真机上连不上。屏幕常亮长时间保持小程序在前台用户锁屏后 WebSocket 连接会被系统回收回到前台需要重新连接。数据频率控制如果设备每 5 秒上报一次小程序端不一定需要每 5 秒刷新一次 UI。可以在服务端做缓存客户端每 15 秒或 30 秒拉一次能显著减少服务器压力和流量消耗。别把“实时”做成“疯狂轮询”这不是实时这是给自己找麻烦。6. 关于“发到小程序”的交付细节域名、HTTPS、权限一个都不能漏很多项目设备端调通了小程序端代码也写完了结果真机一测数据死活出不来。十有八九是卡在微信小程序的平台限制上。6.1 合法域名与 HTTPS 证书是硬门槛微信小程序从基础库 2.x 开始wx.request的 URL 必须满足域名必须备案必须 HTTPS且 TLS 版本不低于 1.2域名证书必须有效不能自签名必须在微信公众平台后台的“开发设置-服务器域名”中添加 request 合法域名。开发阶段可以在开发者工具里勾选“不校验合法域名”但真机预览也会校验。所以最稳妥的安排是项目一开始就准备好一个备案域名配上免费的 Lets Encrypt 证书后台把域名加白名单后面所有联调都会顺很多。6.2 设备鉴权与小程序登录态数据安全不能忽略。如果 JL-17T 上报的数据是私有数据云平台侧要做设备鉴权比如 MQTT 的设备证书/密钥小程序侧要处理wx.login换取 openid再通过 openid 关联数据。一个简单的数据权限链路JL-17T 上报时带设备密钥 → 云平台校验合法性 → 数据入库时绑定 deviceId 小程序用户 wx.login → 后端用 code 换 openid → 用户绑定设备 → 只返回该设备的数据很多硬件项目前期图省事设备端不上密钥小程序端不做登录结果数据对外开放谁拿到 URL 都能看。做 demo 没问题做产品绝对不行。最少也要加一层简单的鉴权别裸奔。7. 我踩过的坑和选型建议最后分享一些真实踩坑经历都是拿真金白银换回来的教训希望你能绕开。7.1 引脚电平不一致烧过不少引脚有次我把一个 5V 供电的传感器输出直接接到了 3.3V 的模组 GPIO 上一开始工作正常用了半天后引脚就废了。后来查手册才发现那个引脚最大耐压是 3.6V虽然传感器的高电平偶尔能到 5V但长期高压冲击让引脚老化击穿。从此我养成了一个习惯不管传感器标称几伏只要输出不是同电平一律加分压或用电平转换模块绝不图省事。7.2 ADC 参考电压和精度对不上有次做一个土壤湿度检测项目传感器输出 0~3V模组 ADC 参考电压是 3.3V按说匹配度已经不错了。但实际读数跳来跳去同一杯土上午和下午读数差不少。排查下来发现传感器供电来自一个电压跌落的电池供电波动直接影响传感器输出电压。后来给传感器单独加了一颗低压差稳压器LDO读数立刻稳定下来。模拟链路里供电稳定压倒一切。7.3 串口透传模式下不知道数据帧从哪截断JL-17T 这类模组在透传模式下如果传感器源源不断发数据传输会变得像水流一样持续不断。但如果你用的是应答型传感器发一条指令才回一包数据就要特别小心“半包”和“粘包”问题JL-17T 收到的是从任意位置开始的字节流不确定哪一段是完整的传感器应答帧。解决办法是在传感器数据帧中引入帧头和帧尾校验。比如 PMS5003 的帧头是0x42 0x4D帧尾有校验和。如果 JL-17T 固件支持自定义透传协议你可以在固件里做帧同步如果不支持就只能在云平台端处理半包拼接。最省心的还是外挂 MCU让 MCU 先把完整帧组装好再一次性发给 JL-17T。7.4 传感器轮询周期别太激进有些传感器出厂推荐 1 秒读一次有些是几百毫秒实测很多无线模组在默认配置下上报频率太高会出问题比如模块持续处于发射状态导致发热或者被云平台限流。我一般把采集和上报频率压到 10~30 秒一次除非业务真的需要秒级更新。这个频率对设备功耗、云端负载都友好得多。7.5 选型建议什么时候闭眼用 JL-17T什么时候赶紧换方案最后给一个比较务实的选型判断标准建议继续用 JL-17T 的场景传感器都是开关量、模拟量或串口输出对数据刷新频率要求不高秒级以上需要快速上线、稳定传输不追求极致边缘计算没有特殊私有协议需要处理。建议换方案或加协处理器的场景手上有一堆 I2C/SPI 传感器而且没有能力做固件二开需要高速连续采样比如振动分析、音频采集需要在本地做复杂的边缘计算和逻辑判断需要同时挂很多传感器IO 数量不够用。我在实际项目里的原则是能用现成平台接口解决的绝不动固件必须接 I2C/SPI 时优先加一颗协处理器 MCU 转接而不是纠结模组要不要二开。这样既保住了无线链路的稳定性又不用冒险改厂商固件产品上线周期可控后期维护也省心。如果你正准备用 JL-17T 做传感器数据上小程序的项目建议按这个顺序动手先确认传感器输出类型再查 JL-17T 的接口配置方式然后定链路形态云平台 API 还是 BLE 直连接着设计好数据格式最后才写小程序界面。顺序反了的话大概率会在某个环节推倒重来。祝你的项目少走弯路一次跑通。
返回列表