关于之前的答案:DS18B20 是一个数字传感器 - 它在本地读取读数,将其存储在本地,尽管单独的读取过程在它所连接的 OneWire 总线上以数字方式传输结果(通常为 12 位分辨率)。向主机传输读数对电压不敏感(因为不同的电压将代表不同的温度值)。然而,电压问题会破坏信号。
-127C 读数实际上是从 OneWire 总线代码返回 0xFF(即 1111 1111),这是来自总线的错误,它未能从 DS18B20 接收读数。作为 -127 的十进制有符号整数。
对于异常读数(似乎在数字上有效),我没有确切的根本原因答案,但经历过并解决了类似的问题。
在我的情况下,较长电缆上的特定传感器(约 20m)在与他人共享巴士时和单独使用时偶尔会返回 80c(而对于集水箱中的水温而言,通常的范围是 15-25)。
我起初虽然它是由不匹配的信号反射引起的数字损坏,尤其是当与较短的运行混合时,但是这应该已经在 CRC 中检测到并且隔离到单个总线时问题仍然存在。
有趣的是,我将问题缩小到电线温度的快速热变化(一个小时左右从 20C 下降到 10C),即使 DS 保持非常稳定,浸入 20K 升水中也是如此。我把这归结为电压供应线上的电导率的轻微变化。(如果它与信号线相关,则 CRC 应该再次捕获它)。这很可能与您的风扇激活类似。
我已经通过两种电气方式(尽管两者都不是 100% 可靠)和一种软件方式解决了这个问题。
在电气上,将上拉电阻放置在传感器附近(而不是在总线终端处)通常在总线错误(避免 -127s)方面提供更稳定的结果。另一种电气解决方案是增加电源电压以补偿长期运行至 5.2v,并将总线端电阻降低至 2.2K。这几乎摆脱了奇怪的 80C 读数,但并非完全如此。
在软件方面,我接受了不可靠性的处理,并实施了一些健全性检查,如果结果出现明显错误,那么我的系统(每 2 分钟轮询一次),简单地重复之前的有效结果并发出警告。
我的软件健全性检查包括:适用于我所有传感器的可能有效值 (> -5 < 70) 的基本范围检查;并使用可调时间窗口检查自上次有效结果以来的越界增量变化(如果一系列无效结果继续超过该窗口 - 在这种情况下,我接受下一个有效范围值作为真正有效)。考虑到您的风力机可能触发的快速变化,这可能合适也可能不合适。
另一个可能不容忽视的是,您可能只有一个不可靠的传感器。