Johnny-Five Thermometer 驱动 MAX31850K 热电偶放大器OneWire 接线、事件与源码级解析【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five本文聚焦 Johnny-Five 框架中Thermometer组件对MAX31850K 热电偶放大器热电偶温度传感器的支持方式覆盖硬件接线、示例运行、温度事件与属性读取并从 lib/thermometer.js 源码与 test/thermometer.js 测试用例出发剖析其背后的 OneWire 通信协议实现与多传感器寻址机制。读完本文你将能够在一台支持 ConfigurableFirmata 的开发板上用 Johnny-Five 正确接线并读取热电偶的摄氏、华氏与开尔文温度并能理解多只 MAX31850K 挂在同一条 OneWire 总线上时的地址管理原理。背景为什么 MAX31850K 需要 OneWireMAX31850K 是一款热电偶到数字转换芯片将 K 型热电偶的微伏级模拟信号转换为数字温度值并通过OneWire单总线协议对外输出。与 I2C/SPI 器件不同OneWire 器件每个都有唯一的 64 位 ROM 编号因此可以在同一条数据线上挂接多只器件仅需一根数据线即可完成寻址与通信。在 Johnny-Five 中使用 MAX31850K 有一个明确的硬件前提开发板固件必须支持 OneWire 总线操作。Johnny-Five 文档与源码中反复强调这需要ConfigurableFirmata支持 OneWire 的 Firmata 固件配合——见 eg/temperature-max31850k.js 中的注释 This requires OneWire support using the ConfigurableFirmata以及 lib/thermometer.js 中对 DS18B20同样走 OneWire的说明。如果你的板子尚未烧录该固件需要先烧录 ConfigurableFirmata 后再运行本文示例。运行官方示例仓库在 eg/temperature-max31850k.js 提供了可直接运行的示例在项目根目录执行node eg/temperature-max31850k.js示例完整代码如下const { Board, Thermometer } require(johnny-five); const board new Board(); board.on(ready, () { // This requires OneWire support using the ConfigurableFirmata const thermometer new Thermometer({ controller: MAX31850K, pin: 2 }); thermometer.on(change, () { const {address, celsius, fahrenheit, kelvin} thermometer; console.log(Thermometer at address: 0x${address.toString(16)}); console.log( celsius : , celsius); console.log( fahrenheit : , fahrenheit); console.log( kelvin : , kelvin); console.log(--------------------------------------); }); });核心要点controller: MAX31850K告诉Thermometer组件选用 MAX31850K 的专用驱动逻辑。驱动注册表定义在 lib/thermometer.js 的Controllers.MAX31850K中。pin: 2OneWire 数据线所连接的开发板数字引脚号。源码在初始化时会调用board.io.sendOneWireConfig(pin, true)将该引脚配置为 OneWire 总线并启用内部上拉第二个参数true见 lib/thermometer.js。address热电偶器件在总线上的唯一地址示例将其格式化为十六进制0x…输出。地址由源码从 64 位器件 ROM 编号中提取详见下文地址是如何计算出来的。接线Breadboard官方文档 docs/temperature-max31850k.md 提供了对应的面包板接线图与 Fritzing 源文件Fritzing 源文件docs/breadboard/temperature-max31850k.fzz接线要点对应上图与示例代码电源MAX31850K 模块的VIN接开发板5VGND接GND数据线模块的DATAOneWire 信号线接到示例代码pin: 2所指定的数字引脚如需改到其他引脚同步修改代码中的pin即可上拉电阻OneWire 总线规范要求数据线上有上拉电阻。源码中sendOneWireConfig(pin, true)启用了引脚内部上拉硬件上如需更稳定的信号也可在 DATA 与 5V 之间外接约 4.7kΩ 的上拉电阻热电偶K 型热电偶插入模块的接线端子。输出示例运行后当温度发生变化时控制台会持续输出类似Thermometer at address: 0x50403020100 celsius : 32.00 fahrenheit : 89.60 kelvin : 305.15 --------------------------------------事件与属性从实例上读取温度Thermometer实例在 lib/thermometer.js 中定义了完整的事件与属性体系事件data每次底层采样默认频率 25ms由构造选项freq控制都会触发回调收到{C, F, K}即{celsius, fahrenheit, kelvin}对象见 lib/thermometer.js 的eventProcessingchange仅当摄氏温度与上一次读数不同时触发示例使用的事件见 lib/thermometer.js。属性属性含义计算方式源码位置celsius别名C摄氏温度toCelsius(raw)MAX31850K 驱动为raw / 16保留 2 位小数lib/thermometer.jsfahrenheit别名F华氏温度celsius * 9 / 5 32保留 2 位小数lib/thermometer.jskelvin别名K开尔文温度celsius 273.15保留 2 位小数lib/thermometer.js常量CELSIUS_TO_KELVIN 273.15定义于 lib/thermometer.jsaddress器件 OneWire 地址初始化时从 ROM 编号解析未指定时自动采用搜到的首个器件lib/thermometer.jsfreq采样频率ms可读可写默认为 25mslib/thermometer.js此外实例还提供enable()/disable()方法用于动态启停采样并支持enabled: false构造选项见 lib/thermometer.js。源码级原理MAX31850K 驱动的 OneWire 数据流MAX31850K 的底层驱动并非直接定义在Controllers中而是通过一个按(驱动名, 引脚)缓存的共享驱动对象Drivers.MAX31850K实现见 lib/thermometer.js。共享的意义在于同一条 OneWire 总线上的多只器件由同一个底层轮询循环统一驱动避免重复扫描总线。Drivers.get的缓存键为${driverName}_${options.pin}lib/thermometer.js。初始化总线扫描与器件过滤初始化时驱动依次执行sendOneWireConfig(pin, true)—— 配置 OneWire 总线并启用上拉sendOneWireSearch(pin, callback)—— 扫描总线上所有 OneWire 器件用device[0] 0x3BTEMPERATURE_FAMILY过滤出 MAX31850K 家族器件见常量定义与过滤逻辑lib/thermometer.js、lib/thermometer.js若扫描不到任何器件触发error事件FAILED TO FIND TEMPERATURE DEVICElib/thermometer.js。地址是如何计算出来的OneWire 器件 ROM 为 8 字节device[0]是家族码device[1..6]是 48 位序列号device[1]为最低字节device[7]是 CRC。驱动中的getAddress将device[6]到device[1]拼成一个整数作为地址// device[0] Family Code // device[1..6] Serial Number (device[1] is LSB) // device[7] CRC let result 0; for (let i 6; i 0; i--) { result result * 256 device[i]; } return result;lib/thermometer.js温度读取循环转换命令 → 轮询完成 → 读暂存器驱动以freqMAX31850K 驱动默认100ms见 lib/thermometer.js为周期执行readTemperaturelib/thermometer.js发出温度转换命令对每个待读器件执行sendOneWireReset(pin)sendOneWireWrite(pin, device, 0x44)CONVERT_TEMPERATURE_COMMAND等待转换完成通过isConversionAvailable轮询——发送sendOneWireWriteAndRead(pin, device, 0xBE, 9, …)READ_SCRATCHPAD_COMMANDREAD_COUNT 9读取暂存器检查data[0]是否为 0 判断转换是否就绪lib/thermometer.js拼接温度原始值result (data[1] 8) | data[0]随后emit(data, address, result)lib/thermometer.js。Controllers.MAX31850K.initialize收到驱动广播后会按地址过滤只有当未指定address或dataAddress address时才把数据交给Thermometer实例lib/thermometer.js最后经toCelsiusvalue / 162 位小数换算成摄氏温度。多传感器用 address 在同一条总线上区分器件因为 OneWire 支持总线挂接多只器件Johnny-Five 允许给每只 MAX31850K 显式指定地址从而在同一个pin上创建多个Thermometer实例const t1 new Thermometer({ controller: MAX31850K, pin: 2, address: 0x554433221100 }); const t2 new Thermometer({ controller: MAX31850K, pin: 2, address: 0x050403020100 });地址可通过只挂一只器件时的address输出先行获取。相关的两个关键约束均有测试佐证见 test/thermometer.js显式address会注册到共享驱动driver.register(address)lib/thermometer.js轮询循环只读取注册过的地址不带address的实例最多只能有一个第二个无地址实例会触发错误事件You cannot have more than one MAX31850K without an addresslib/thermometer.js测试twoAddresslessUnitsThrowsError验证了该场景test/thermometer.js。测试验证行为是被钉死的仓库的 test/thermometer.js 为 MAX31850K 驱动提供了完整的行为验证是理解驱动契约的权威参考初始化断言sendOneWireConfig、sendOneWireSearch各被调用一次且传入的引脚为pin给定器件[0x3B, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF]期望解析出的地址为0x050403020100数据读取模拟暂存器返回[0x01, 0x02]后断言sendOneWireWrite写入转换命令0x44、sendOneWireWriteAndRead发送读暂存命令0xBE且读取 9 字节并在freq100ms周期后得到celsius ≈ 32、fahrenheit ≈ 90、kelvin ≈ 305与raw0x0201 → 513 → 513/16 ≈ 32.06的换算一致寻址与多单元验证指定地址后只与匹配器件通信twoAddressedUnits中两个地址分别得到约 32°C 与 64°C并断言C属性保留 2 位小数。这些测试同时验证了前面提到的共享驱动与地址过滤机制可作为二次开发时的行为契约。注意事项小结固件前提必须使用支持 OneWire 的ConfigurableFirmata否则sendOneWireConfig等命令不可用引脚选择示例使用pin: 2改接其他数字引脚时请同步修改pin配置上拉源码已启用内部上拉硬件上建议按 OneWire 规范加装 4.7kΩ 上拉电阻以保证长线稳定性地址唯一性挂接多只器件时务必为每只实例显式提供address且地址来自总线扫描结果先单只读地址再加多只找不到器件若总线无 MAX31850K实例会触发FAILED TO FIND TEMPERATURE DEVICE错误事件请检查接线与供电。延伸阅读完整的温度组件 API 与全部控制器列表见 lib/thermometer.js与其他温度传感器的接线示例DS18B20、TMP36、LM35 等可参考 docs 目录 下temperature-*.md系列文档MAX31850/MAX31851 芯片的数据手册索引位于 lib/datasheets.md。【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址: https://gitcode.com/gh_mirrors/jo/johnny-five创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考