news 2026/8/2 14:22:39

Grove红外温度传感器:从原理到实战,实现非接触测温

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Grove红外温度传感器:从原理到实战,实现非接触测温

1. 项目概述:从“非接触测温”到“万物感知”的桥梁

在嵌入式开发和物联网项目中,温度测量是一个基础但至关重要的需求。传统的接触式温度传感器,比如DS18B20或者热敏电阻,需要与被测物体紧密贴合才能获得准确读数。但在很多场景下,这行不通:你想知道一个高速旋转的电机外壳温度、一个正在加热的锅底中心温度,或者一个精密电子元件的表面温度,直接接触要么危险,要么会干扰被测对象本身。这时候,非接触式红外测温技术就成了不二之选。

Grove - 红外温度传感器,正是Seeed Studio推出的、旨在降低这项技术使用门槛的一款模块。它本质上是一个将红外热电堆传感器、信号调理电路和标准Grove接口封装在一起的小板子。你不需要去研究复杂的热电堆电压-温度换算公式,也不用自己搭建精密的前置放大电路,只需要通过一根四线Grove线缆,将其连接到像Arduino、Raspberry Pi这样的主控板上,调用简单的库函数,就能直接读取到物体的表面温度值。这极大地简化了原型开发过程,让开发者可以更专注于应用逻辑本身,比如温度监控、过热预警或者智能控制。

这个模块的核心价值在于“桥梁”作用:它将专业的、工业级的非接触测温原理,封装成了一个创客和开发者友好、即插即用的工具。无论是做智能家居中的家电温度监控,还是做创客项目中的安全防护,甚至是做一些简单的科学实验,它都能提供一个快速、可靠的解决方案。接下来,我将拆解这个模块从原理到应用的全过程,分享我在多个项目中实际使用它时积累的经验和踩过的坑。

2. 核心原理与模块深度解析

2.1 红外测温的物理基础:斯蒂芬-玻尔兹曼定律

要理解这个传感器,必须先搞明白它测的是什么,以及为什么能测。一切物体,只要其温度高于绝对零度(-273.15°C),都会向外辐射电磁波,这种辐射就包含了红外线。而物体辐射红外线的总功率,与其表面温度的四次方成正比,这就是著名的斯蒂芬-玻尔兹曼定律。红外温度传感器,就是通过测量物体发射的红外辐射强度,来反推其表面温度的。

但这里有个关键点:传感器测到的红外辐射,不仅仅是目标物体发射的,还包括了环境反射的红外辐射。因此,一个典型的红外测温模块(如Grove使用的MLX90614或类似热电堆芯片)内部,实际上会有两个检测单元:一个用于测量目标物体的红外辐射,另一个用于测量传感器自身所处的环境温度。通过芯片内部的算法和校准数据,将这两个值结合起来,才能计算出更准确的目标物体温度。这就是为什么这类传感器通常能输出两个温度值:物体温度(TObj)和环境温度(TAmb)。

2.2 Grove模块的电路构成与信号链

拆开Grove红外温度传感器的“黑盒”,其内部信号链可以清晰地分为三级:

第一级是红外传感单元。通常采用热电堆传感器,它由一系列热电偶串联而成。当红外辐射照射到热电堆的热结点时,会产生一个微弱的温差电动势(电压),这个电压信号与接收到的红外辐射功率成正比,极其微弱,通常在毫伏甚至微伏级别。

第二级是低噪声放大与调理电路。这是模块的核心价值所在。微弱的热电堆电压信号首先会经过一个低噪声、高输入阻抗的运算放大器进行初级放大。随后,信号可能会通过一个带通滤波器,以抑制电源噪声和环境光干扰(特别是可见光)。处理后的模拟信号被送入模数转换器。

第三级是数字处理与接口。ADC将模拟电压转换为数字量,然后由一颗小型的MCU或专用的ASIC芯片(例如MLX90614内部就集成了DSP单元)根据存储在芯片内部的工厂校准系数,执行复杂的计算,将数字量转换为温度值。最后,通过I2C(或某些型号的UART)接口,将计算好的温度数据按照特定协议输出。Grove接口将其电源(VCC、GND)和通信线(SDA、SCL)标准化,完成了从物理信号到标准数字信息的转变。

注意:不同批次或型号的Grove红外温度传感器,其核心测温芯片可能不同(常见的有MLX90614、MLX90615,或者国产的GY-906模块使用的芯片)。虽然接口和库可能兼容,但其测量精度、视场角、出厂校准情况可能存在差异。购买和开发时最好能确认具体型号。

2.3 关键参数解读与选型考量

理解以下参数,对于正确使用和评估这个传感器至关重要:

  1. 测量范围与精度:通常标称如-40°C ~ 125°C(物体温度),精度±0.5°C。但这是有条件的。精度通常在接近室温(~25°C)时最佳。当测量极高或极低温度时,误差可能会增大。此外,精度指的是重复性和一致性很好,绝对准确度还需要用户针对特定场景进行一点校准。

  2. 视场角(FOV):这是最容易忽略也最易导致错误的概念。视场角决定了传感器“看到”的范围。例如,一个FOV为10°的传感器,在1米距离上,其测量光斑的直径大约为17.5厘米。这意味着它测得的温度是这17.5厘米圆形区域内所有物体表面温度的平均值!如果目标物体很小(比如一个芯片),距离又远,那么传感器的读数就会混入大量背景温度,导致读数严重偏低。基本原则是:目标物体必须完全覆盖住传感器的整个视场光斑。

  3. 发射率(Emissivity):物体发射红外辐射的能力。这是一个介于0(完美镜面)和1(绝对黑体)之间的系数。大多数有机材料、油漆、氧化金属表面发射率较高(0.8~0.95),而光亮金属表面发射率很低(0.1~0.3)。Grove模块出厂通常默认发射率为0.95(近似为黑体)。如果测量光亮的不锈钢水杯,实际温度100°C,传感器读数可能只有60°C。对于高精度应用,必须根据被测物材质设置正确的发射率。好在一些高级芯片(如MLX90614)支持通过指令修改发射率参数。

  4. 响应时间:指温度变化后,传感器输出稳定读数所需的时间。热电堆的响应通常很快,在几百毫秒量级。但对于快速变化的温度,需要关注这个参数。

3. 硬件连接与基础软件驱动

3.1 硬件连接与供电注意事项

Grove红外温度传感器通常采用I2C接口,四根线定义非常明确:

  • 红色线:VCC,供电正极。绝大多数版本工作电压为3.3V5V兼容。但务必查阅你的具体模块资料,稳妥起见,接3.3V是最安全的选择,尤其是连接树莓派时。
  • 黑色线:GND,接地。
  • 黄色线:SDA,I2C数据线。
  • 白色线:SCL,I2C时钟线。

连接Arduino Uno时,可以直接插到标有“I2C”的Grove底座上,或者连接到A4(SDA)和A5(SCL)引脚。连接树莓派时,需要使用Grove转4Pin杜邦线,连接到树莓派的GPIO引脚上,对应关系为:VCC -> 3.3V(Pin 1), GND -> GND(Pin 6), SDA -> GPIO2(Pin 3), SCL -> GPIO3(Pin 5)。

实操心得:我曾遇到一个诡异的问题,传感器读数偶尔跳变极大。排查了半天,发现是Grove线缆接触不良。由于经常插拔,线缆的微型弹簧针可能氧化或变形。如果出现读数不稳定,第一个要怀疑的就是连接线和接口。用电子清洁剂喷一下接口,或者换一根线试试,往往能解决问题。

3.2 Arduino平台驱动与基础代码解析

在Arduino IDE中,最常用的库是Adafruit MLX90614 Library。首先通过库管理器安装它。

下面是一个最基础的读取示例,包含了详细的注释:

#include <Wire.h> #include <Adafruit_MLX90614.h> // 创建传感器对象 Adafruit_MLX90614 mlx = Adafruit_MLX90614(); void setup() { Serial.begin(9600); // 等待串口连接,仅用于调试输出 while (!Serial); Serial.println("MLX90614 红外温度传感器测试"); // 初始化传感器,如果失败则报错 if (!mlx.begin()) { Serial.println("错误:找不到 MLX90614 传感器,请检查连接!"); while (1); // 停止程序 } Serial.println("传感器初始化成功!"); // 打印传感器自身的唯一ID(可用于区分多个传感器) Serial.print("传感器ID: "); Serial.println(mlx.getID(), HEX); } void loop() { // 读取环境温度(传感器周围的温度) Serial.print("环境温度(Ambient) = "); Serial.print(mlx.readAmbientTempC()); Serial.println(" °C"); // 读取物体温度(传感器指向的目标温度) Serial.print("物体温度(Object) = "); Serial.print(mlx.readObjectTempC()); Serial.println(" °C"); // 华氏度版本(如果需要) // Serial.print("Object = "); Serial.print(mlx.readObjectTempF()); Serial.println(" *F"); Serial.println("-----"); delay(1000); // 每秒读取一次 }

这段代码清晰展示了两个核心读数:环境温度和物体温度。mlx.begin()函数会尝试通过I2C地址与传感器通信,默认地址通常是0x5A。如果总线上有多个I2C设备,需要注意地址冲突。

3.3 树莓派平台使用与Python示例

在树莓派上,我们可以使用Python的smbus2库来操作I2C。首先确保启用I2C接口(通过sudo raspi-config)。

安装必要库:sudo pip3 install smbus2

由于MLX90614的通信协议需要计算CRC校验,直接读写寄存器稍复杂。通常我们会使用一个封装好的Python库,比如mlx90614。安装:sudo pip3 install mlx90614

import time import mlx90614 from smbus2 import SMBus # 创建I2C总线对象,1表示使用树莓派的I2C-1接口(GPIO2/3) bus = SMBus(1) # 创建传感器对象,传入总线和默认I2C地址(0x5A) sensor = mlx90614.MLX90614(bus) try: while True: # 读取环境温度和物体温度 ambient_temp = sensor.get_ambient() object_temp = sensor.get_object_1() print(f"环境温度: {ambient_temp:.2f} °C") print(f"物体温度: {object_temp:.2f} °C") print("-" * 20) time.sleep(1) except KeyboardInterrupt: print("\n程序被用户中断") finally: bus.close() # 关闭I2C总线,释放资源

注意事项:在树莓派上运行I2C设备,需要sudo权限,或者将你的用户加入i2c用户组(sudo usermod -aG i2c pi,假设用户是pi),然后注销重新登录。否则会报权限错误。

4. 校准与精度提升实战技巧

出厂校准是基于理想黑体进行的。在实际应用中,为了获得针对特定场景的最高精度,进行简单的校准非常有价值。

4.1 环境温度补偿的重要性

传感器本身也会发热,其内部的环境温度检测单元可能受到板载电路热量的轻微影响。一个简单的校准方法是:在已知的、稳定的环境温度下(比如空调房内,用另一个可信的温度计监测),让传感器空载(不指向任何特定物体)运行一段时间,读取其输出的环境温度值。将这个读数与真实环境温度对比,得到一个固定的偏移量(Offset)。在后续读取物体温度时,可以尝试用这个偏移量去修正环境温度的读数(因为物体温度计算依赖于环境温度)。不过,更严谨的做法是直接修正最终的物体温度输出。

4.2 针对特定物体的两点校准法

这是提升针对某一固定材质物体测量精度的有效方法。你需要一个高精度的接触式测温仪作为参考。

  1. 准备两个恒温点:例如,一杯冰水混合物(约0°C)和一杯热水(比如50°C,用参考温度计测准)。确保被测物体(如一个金属片)在这两个温度下达到热平衡。
  2. 测量与记录:用Grove传感器测量这两个温度下的物体,分别得到传感器读数T_sensor1, T_sensor2,以及参考温度T_ref1, T_ref2。
  3. 计算校准系数:假设传感器输出与实际温度存在线性关系:T_actual = a * T_sensor + b
    • 将两组数据代入:T_ref1 = a * T_sensor1 + bT_ref2 = a * T_sensor2 + b
    • 解方程得到斜率a和截距ba = (T_ref2 - T_ref1) / (T_sensor2 - T_sensor1)b = T_ref1 - a * T_sensor1
  4. 软件应用:在代码中,每次读取原始物体温度后,都应用这个公式进行修正:T_corrected = a * T_raw + b

4.3 发射率的设置与测量

对于高反射率物体,设置正确的发射率是提高精度的关键。MLX90614等芯片允许通过I2C命令修改芯片内部寄存器中的发射率系数(通常默认0xFFFF对应1.0)。Adafruit库提供了writeEmissivity()函数。你需要知道被测物体的发射率,这通常需要查材料手册或通过实验测定。

一个粗略测定发射率的方法(需要参考接触式测温仪):

  1. 将物体加热到一个稳定温度T_actual(用接触式测温仪测)。
  2. 将红外传感器对准物体,确保视场内只有该物体。
  3. 调整传感器代码中的发射率参数,直到传感器读数T_sensor与T_actual一致。此时的发射率参数即为该物体在当前表面状态下的近似发射率。

踩坑记录:我曾用传感器测量一个抛光铝板,读数比实际低了近30°C。查阅资料发现抛光铝的发射率只有0.05左右。将发射率参数设置为0.05后,读数立刻变得合理。但需要注意的是,发射率会随表面氧化、污渍、温度变化而改变,所以这不是一劳永逸的。

5. 典型应用场景与项目实战

5.1 场景一:智能家电温度监控与安全预警

项目描述:监控热水壶、电饭煲、烤箱等家电的外壳温度,防止因故障或干烧导致过热起火。实现要点

  • 安装位置:将传感器固定在家电外壳侧面或上方适当距离,调整角度使其视场中心对准可能最热的部位(如加热元件对应的外壳处)。
  • 阈值判断:在代码中设置两级温度阈值。一级预警(如60°C),触发本地蜂鸣器提醒;二级报警(如80°C),通过Wi-Fi模块(如ESP8266)向手机发送报警信息,并尝试远程切断电源(通过智能插座)。
  • 数据滤波:由于环境热气流扰动,读数可能会有小幅波动。采用滑动平均滤波算法,取最近10次读数的平均值作为有效值,可以避免误报警。
// 简单的滑动平均滤波示例 const int numReadings = 10; float readings[numReadings]; int readIndex = 0; float total = 0; float average = 0; float getFilteredTemperature() { total = total - readings[readIndex]; // 减去最旧的读数 readings[readIndex] = mlx.readObjectTempC(); // 读取新值 total = total + readings[readIndex]; // 加上新读数 readIndex = (readIndex + 1) % numReadings; // 循环索引 average = total / numReadings; return average; }

5.2 场景二:工业设备非接触式点检

项目描述:定期巡检配电箱接线端子、电机轴承、变压器等设备的温度,及时发现过热隐患。实现要点

  • 便携式设计:使用Arduino Nano或ESP32开发板,搭配小型OLED显示屏和锂电池,制作成手持式测温仪。
  • 数据记录:添加一个SD卡模块,每次测量时,除了记录温度,还通过RTC(实时时钟)模块记录时间戳,并可以手动输入或通过二维码扫描输入设备编号。生成CSV格式日志文件,便于后期在电脑上分析。
  • 瞄准辅助:由于视场角小,精确瞄准困难。可以在传感器旁边加装一个低功率的激光指示器(注意安全),让激光点指示测量光斑的中心,极大提升点检效率和准确性。

5.3 场景三:生物/农业监测应用

项目描述:监测孵化器中鸡蛋表面温度、小型动物的体温,或者植物叶片的温度。实现要点

  • 避免环境干扰:生物监测环境通常湿度大、有绒毛或羽毛遮挡。需要确保传感器镜头清洁,并考虑环境湿度对读数的影响(虽然红外测温受湿度影响较小,但极端情况仍需注意)。
  • 动态与静态测量:测量活动物时,体温会有波动。需要设定较长的测量稳定时间(如连续测量5秒取中值),并注意动物呼吸可能带来的气流影响。
  • 伦理与安全:用于动物监测时,确保激光指示器(如果使用)功率极低,不会对动物眼睛造成伤害,且整个装置不会引起动物应激。

6. 高级应用与数据融合

6.1 多点测温与热成像雏形

单个传感器只能测量一个点的平均温度。如果想获得一个区域的温度分布,可以使用舵机云台,让传感器进行二维扫描。通过程序控制舵机在水平和垂直方向步进,在每个点位停留并记录温度数据,最终可以将数据在电脑上重构为一个低分辨率的“热像图”。虽然分辨率无法与专业热像仪相比,但对于观察大致的温度分布趋势(比如电路板哪个区域更热)已经足够,且成本极低。

实现框架

  1. 使用两个舵机分别控制水平和垂直旋转。
  2. 规划扫描路径,例如水平0-180度,步进10度;垂直0-60度,步进10度。总共产生(180/10+1) * (60/10+1) = 133个点。
  3. 在每个点位,等待舵机稳定(约200-300ms),然后读取温度值。
  4. 将角度坐标(Pan, Tilt)和温度值(Temp)通过串口发送到上位机(如Processing或Python编写的程序)。
  5. 上位机程序将数据转换为二维矩阵,并使用颜色映射(如Jet色谱)将其可视化。

6.2 与热敏电阻互补使用

红外测温擅长测表面、测运动物体、测远距离,但对环境气流、发射率敏感。热敏电阻(如NTC)成本极低,接触测量更准确,但响应慢,需要接触。在需要高可靠性温度监控的场合(如恒温箱),可以同时使用两种传感器。用热敏电阻测量空气温度作为基准,用红外传感器监测加热元件的表面温度。当两个传感器的读数逻辑出现矛盾时(例如红外显示加热管温度极高,但空气温度不升),可以判断为系统异常(如风扇故障),触发更高级别的报警。

6.3 基于温度数据的简单预测

在连续监测的场景下,我们可以对温度时间序列数据进行简单分析。例如,计算温度的上升斜率dT/dt。如果发现某个设备在正常工作负载下,温度上升斜率突然显著增大,这可能意味着散热系统效率下降(如风扇积灰)或内部出现异常热源(如绝缘老化),可以在温度绝对值达到阈值之前,提前发出“趋势预警”,实现更智能的预测性维护。

7. 常见问题排查与故障解决

以下是我在项目中遇到的一些典型问题及解决方法,整理成速查表:

问题现象可能原因排查步骤与解决方案
读数恒定为-273°C或0°C1. I2C通信完全失败。
2. 传感器芯片损坏。
1. 检查接线,确认VCC、GND、SDA、SCL连接正确牢固。
2. 使用I2C扫描工具(Arduino IDE示例中有I2C Scanner)检查地址0x5A是否存在。
3. 更换Grove线缆或尝试另一个I2C接口。
读数乱跳、不稳定1. 电源噪声。
2. I2C总线干扰。
3. 传感器镜头脏污。
4. 被测目标温度剧烈变化或处于气流中。
1. 在传感器VCC和GND之间并联一个10uF~100uF的电解电容进行电源滤波。
2. 确保I2C总线走线不要太长,且远离电机、继电器等强干扰源。
3. 用无尘布轻轻擦拭传感器正中心的透明窗口(热电堆接收口)。
4. 在代码中增加软件滤波(如滑动平均、中值滤波)。
读数明显偏低(测高温物体)1. 视场角过大,目标未充满视场。
2. 物体发射率低(如光亮金属)。
3. 传感器距离物体太远。
1.确保目标物体尺寸大于测量光斑。计算公式:光斑直径 ≈ 距离 × tan(FOV/2) × 2。靠近物体或选择FOV更小的传感器。
2. 查询或测量物体表面发射率,并在代码中设置正确的发射率参数。
3. 适当减小测量距离。
读数偏高(测室温物体)1. 传感器自身发热影响。
2. 附近有热源辐射干扰(如阳光直射、发热的MCU)。
3. 环境温度读数不准。
1. 让传感器持续通电工作几分钟,待其内部热平衡后再读数。避免频繁断电上电。
2. 为传感器加装隔离罩,屏蔽侧面和后面的热辐射。确保镜头只“看到”被测目标。
3. 参考本章节“校准”部分,对环境温度读数进行补偿。
I2C地址冲突总线上有多个相同地址的设备。1. 检查传感器型号,部分MLX90614型号可以通过拉高或拉低某个引脚来切换备用地址(如0x5B)。
2. 使用I2C多路复用器(如TCA9548A)来管理多个相同地址的传感器。
响应速度慢代码中读取间隔设置不当或滤波算法过于“沉重”。1. MLX90614的转换时间约100ms。读取间隔低于100ms没有意义。
2. 简化滤波算法,或采用中断方式读取,而非盲目循环快速读取。

8. 项目优化与进阶思考

经过多个项目的打磨,我发现要让Grove红外温度传感器稳定可靠地工作,除了正确的连接和代码,更多在于对测量场景的深入理解和细节处理。

电源隔离是关键中的关键。如果系统中存在电机、继电器或大功率LED,它们的开关会在电源线上产生严重的毛刺噪声。我曾用一个开关电源同时给Arduino和一台12V小风扇供电,风扇一开,温度读数就出现周期性跳变。后来改为传感器单独由一片低压差线性稳压器供电,或者至少在传感器电源入口处增加一个π型滤波电路(如10Ω电阻串联,再并联两个电容:10uF电解+0.1uF陶瓷),问题迎刃而解。

固件层面的鲁棒性增强。工业应用要求设备不能死机。我在I2C通信函数外包裹了异常处理机制。如果连续多次读取失败,程序不是卡死,而是记录错误日志、尝试软件复位I2C总线,如果还不行就重启整个系统(利用看门狗)。同时,将关键的温控逻辑(如报警判断)放在一个独立于通信任务的定时器中断里,即使主循环因某种原因阻塞,安全功能依然能运行。

最后,关于这个传感器的局限性要有清醒认识。它测的是“表面温度”,而不是“核心温度”。用它去测一杯热水,读数接近水温;但用它去测一个表面有灰尘的散热片,读数可能远低于散热片内部芯片的实际结温。它更像一个出色的“哨兵”和“趋势观察者”,而非绝对精密的计量仪器。理解并接受这一点,在合适的场景下发挥它的长处——快速、非接触、易于集成,你就能用它做出非常多有趣且实用的项目。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 14:22:38

TimeoutException深度解析:从原理到实战的系统性排查与优化指南

1. 项目概述&#xff1a;从一次线上故障说起那天晚上&#xff0c;系统监控突然告警&#xff0c;一个核心接口的响应时间曲线像坐上了火箭&#xff0c;直接冲破了设定的阈值。登录服务器一看&#xff0c;日志里密密麻麻全是java.util.concurrent.TimeoutException。团队立刻进入…

作者头像 李华
网站建设 2026/8/2 14:22:30

别再坚持错误Linux发行版了

Linux并不是一个单一的操作系统。它以Linux内核为核心骨架,而内核之外的所有组件、界面、包管理方式和默认配置,都由不同的发行版团队独立构建。这导致了数百个发行版并存的生态:有的极简高效,有的开箱即用,有的深度定制化。用户在选择时常常基于初次接触时的推荐或一时兴…

作者头像 李华
网站建设 2026/8/2 14:22:28

终极黑苹果配置简化工具:15分钟完成专业级EFI创建

终极黑苹果配置简化工具&#xff1a;15分钟完成专业级EFI创建 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而烦恼吗&#x…

作者头像 李华
网站建设 2026/8/2 14:21:38

Reachy Mini无线版:树莓派机器人远程开发环境搭建全攻略

1. 项目概述&#xff1a;Reachy Mini无线版初印象如果你对桌面级协作机器人感兴趣&#xff0c;最近应该听说过Reachy Mini。它是一款基于Raspberry Pi&#xff08;树莓派&#xff09;驱动的开源机器人手臂&#xff0c;设计初衷就是让机器人开发变得触手可及。而我今天要聊的&am…

作者头像 李华
网站建设 2026/8/2 14:19:44

从零构建个人知识库:Obsidian与AI结合打造第二大脑

1. 从零到一&#xff1a;为什么你需要一个自己的知识库&#xff1f; 你有没有过这样的经历&#xff1a;电脑里塞满了各种PDF、Word文档、网页收藏夹和截图&#xff0c;想找某个信息时却怎么也翻不到&#xff1b;或者&#xff0c;刚学完一个技术概念&#xff0c;过两周要用时&am…

作者头像 李华
网站建设 2026/8/2 14:18:03

Mac Mouse Fix完整指南:3步让普通鼠标在macOS上超越苹果触控板

Mac Mouse Fix完整指南&#xff1a;3步让普通鼠标在macOS上超越苹果触控板 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾羡慕苹果触控…

作者头像 李华