使用 Python 3 将称重传感器和 HX711 与 Raspberry Pi 3 连接

Interfacing Load Cell and HX711 with Raspberry Pi 3 using Python 3

我目前正在从事一个物联网项目,我正在尝试将我的 Raspberry Pi 3 连接到 HX711,以便我可以从我的称重传感器读取重量读数范围为 200 公斤。

对于Python代码,我试过this Python library from github

根据此存储库的描述,我首先使用 5 公斤的已知重量校准了 HX711 (calibration.py),给出了偏移量和比例。之后我复制它们并在 example_python3.py.

中使用它们

但我不断从称重传感器获取变量读数,如下面来自 Raspberry Pi window 的屏幕截图所示:

我通过放置 5 公斤负载获得此输出。我尝试了这个校准循环并多次检查输出,但我的输出仍然是可变的。

这是我使用的代码:

import RPi.GPIO as GPIO
import time
import sys
from hx711 import HX711

# Force Python 3 ###########################################################

if sys.version_info[0] != 3:
    raise Exception("Python 3 is required.")

############################################################################
GPIO.setwarnings(False)

hx = HX711(5, 6)


def cleanAndExit():
    print("Cleaning...")
    GPIO.cleanup()
    print("Bye!")
    sys.exit()


def setup():
    """
    code run once
    """
    #Pasted Offset and Scale I got from calibration..
    hx.set_offset(8608276.3125)
    hx.set_scale(19.828315054835493)


def loop():
    """
    code run continuosly
    """
   
    try:

        val = hx.get_grams()
        print(val)
        hx.power_down()
        time.sleep(0.001)
        hx.power_up()


    except (KeyboardInterrupt, SystemExit):
        cleanAndExit()


##################################

if __name__ == "__main__":

    setup()
    while True:
        loop()

很遗憾,我没有 HX711,因此无法测试您的代码。但我可以提供一些可能有帮助的建议。

  1. 我的主要问题是:为什么你的代码包含

    hx.power_down()
    time.sleep(0.001)
    hx.power_up()
    

    在循环中?根据datasheet,输出稳定时间(即从上电、复位、输入通道变化和增益变化到有效稳定输出数据的时间)为400 ms。所以如果每次读完就给HX711断电,每次读都会不稳定!

  2. 此外,您预计读数之间的偏差有多大?您的值目前大约在 4990 和 5040 之间波动,相差 50,因此只有 1% 的差异。那还不错。不幸的是,HX711的精度在数据sheet中没有说明,所以我无法确定这是“正确”还是“错误”。但是,在假设出现问题之前,您应该先检查您的期望。数据 sheet 提到输入失调漂移为 0.2 mV,而满量程差分输入电压(增益为 128)为 20 mV。那也是1%。 (这可能是巧合,但如果你想确定的话,你应该深入研究一下。)

  3. 你检查过串口通信的时序了吗?代码只是切换 IO 引脚,没有任何特定的时序,而数据 sheet 提到 PD_SCK 必须至少持续 0.2 us 和最多 50 us。切换得更快可能会导致读数不正确,而切换得更慢可能会导致设备重置(因为保持 PD_SCK 高电平超过 60 us 会导致其进入断电模式)。例如,参见 this C implementation,其中包含针对快速 CPU 的修复。您的 Python 库不包含此修复程序。

    不过,我不确定您将如何使用 Raspberry Pi 执行此操作。如果你能在 Raspberry Pi(或任何其他非实时平台)上可靠地工作,你似乎很幸运,因为如果你的代码在糟糕的时间被中断,读取可能会失败(见this comment 例如)。

  4. 我在网上看到一些报道说HX711需要“预热”2-3分钟,这样之后读数会更稳定。

  5. 最后,问题也可能与硬件有关。似乎有很多低质量的板。例如,有 this known design fault 可能是相关的。

注意: 另请注意,您的偏移量 (8,608,276.3125) 可能不正确。 HX711 return 是一个 24 位的 2 的补码值。这意味着介于 -8,388,607 和 +8,388,608 之间的值。你的价值超出了这个范围。你得到这个值的原因是你使用的库没有正确考虑数据编码。参见 this discussion. There are several forks of the repository in which this was fixed, for example this one。如果正确读取,该值应该是 -8,168,939.6875。此错误不会影响准确性,但可能会导致某些权重的结果不正确。

对于认为精度是 24 位因此应该 return 非常可靠的读数的每个人来说最后的注释:精度与准确度不同。仅仅因为设备 returns 24 位并不意味着这些位是正确的。该值与实际值(实际重量)的接近程度取决于许多其他因素。请注意,默认情况下您使用的库会读取 16 次权重并对结果取平均值。如果设备如此准确,那根本就没有必要!

我的建议:

  • 从你的循环中移除电源(尽管你可能想在你的设置中使用它一次)。
  • 在第一次读取之前至少等待 400 毫秒。
  • 如果要使用完整范围,请修复 2 的补码逻辑的数据转换。
  • 不要期望设备精确到 24 位。
  • 如果您仍想提高读数的准确性,您可能需要深入研究与硬件或时序相关的问题(数据sheet 和 these github issues 包含很多信息).