HS-S46P Waagesensor

HS-S46P Waagesensor

1、Einführung

Der Hx711-Waagesensor ist ein Gerät, das mechanische Größen (wie Gewicht, Druck) in elektrische Signale umwandelt, der häufigste Typ, der durch die Deformation eines elastischen Körpers und die Änderung des Widerstands der auf ihn geklebten Widerstandsverspannungen verursacht wird, indem der Widerstandsverlauf in einen Spannungssignal umgewandelt wird, das durch einen Wheatstone-Brücke, dann durch Verstärkung und Analog-Digital-Wandlung in ein digitales Signal umgewandelt wird.

2、Schemazeichnung

Gewichtssensormodul-HS-S46P SchemaKlicken Sie zum Anzeigen

3、Modulparameter

Pinbezeichnung

Beschreibung

G

GND(Spannungsversorgungsminus)

V

VCC(Spannungsversorgungsplus)

D

Datenpin

S

Zeitpin

  • Spannungsversorgung: 3.3V-5V

  • Verbindungsmethode: PH2.0 4P Steckerkabel

  • Montageart: Schraubenfestigung

4, Platinegröße

5、Arduino IDE Beispielprogramm

Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
Anleitung zum Herunterladen und Importieren der Bibliotheksdateien für das Arduino IDE:
Klicken Sie zum Anzeigen

Beispielprogramm (UNO-Entwicklerboard):

#include <Hx711.h>

Hx711 scale6_5(6,5);

void setup(){
  scale6_5.setOffset(scale6_5.getAverageValue(30));
  scale6_5.setScale(363.47);
  Serial.begin(9600);
}

void loop(){
  Serial.println(scale6_5.getWeight(10));

}

6、ESP32 Python Beispiel (für Mixly IDE /米思齐)

Entwicklungsboard auswählen Python ESP32 [ESP32 Generic(4MB)] auf den Code-Modus umschalten und hochladen

Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE ESP32库文件下载及导入教程:
Klicken Sie zum Anzeigen

示例程序(ESP32-Python):

from machine import Pin
from utime import sleep_us, sleep_ms, time
import ujson
from micropython import const

class HX711Exception(Exception):
    pass

class InvalidMode(HX711Exception):
    pass

class DeviceIsNotReady(HX711Exception):
    pass

class HX711:
    CHANNEL_A_128 = const(1)
    CHANNEL_A_64 = const(3)
    CHANNEL_B_32 = const(2)

    DATA_BITS = const(24)
    MAX_VALUE = const(0x7fffff)
    MIN_VALUE = const(0x800000)
    READY_TIMEOUT_SEC = const(5)
    SLEEP_DELAY_USEC = const(80)

    def __init__(self, d_out: int, pd_sck: int, channel: int = CHANNEL_A_128, config_file="hx711setting.json"):
        self.d_out_pin = Pin(d_out, Pin.IN)
        self.pd_sck_pin = Pin(pd_sck, Pin.OUT, value=0)
        self._channel = channel
        self.offset = 0
        self.scale = 1.0
        self.config_file = config_file
        self.load_offset_scale()

    def _convert_from_twos_complement(self, value: int) -> int:
        if value & (1 << (self.DATA_BITS - 1)):
            value -= 1 << self.DATA_BITS
        return value

    def _set_channel(self):
        for i in range(self._channel):
            self.pd_sck_pin.value(1)
            self.pd_sck_pin.value(0)

    def _wait(self):
        t0 = time()
        while not self.is_ready():
            if time() - t0 > self.READY_TIMEOUT_SEC:
                raise DeviceIsNotReady()

    @property
    def channel(self) -> tuple:
        if self._channel == self.CHANNEL_A_128:
            return 'A', 128
        if self._channel == self.CHANNEL_A_64:
            return 'A', 64
        if self._channel == self.CHANNEL_B_32:
            return 'B', 32

    @channel.setter
    def channel(self, value):
        if value not in (self.CHANNEL_A_128, self.CHANNEL_A_64, self.CHANNEL_B_32):
            raise InvalidMode('Gain should be one of HX711.CHANNEL_A_128, HX711.CHANNEL_A_64, HX711.CHANNEL_B_32')
        self._channel = value
        if not self.is_ready():
            self._wait()
        for i in range(self.DATA_BITS):
            self.pd_sck_pin.value(1)
            self.pd_sck_pin.value(0)
        self._set_channel()

    def is_ready(self) -> bool:
        return self.d_out_pin.value() == 0

    def power_off(self):
        self.pd_sck_pin.value(0)
        self.pd_sck_pin.value(1)
        sleep_us(self.SLEEP_DELAY_USEC)

    def power_on(self):
        self.pd_sck_pin.value(0)
        self.channel = self._channel

    def read_raw(self):
        if not self.is_ready():
            self._wait()
        raw_data = 0
        for i in range(self.DATA_BITS):
            self.pd_sck_pin.value(1)
            self.pd_sck_pin.value(0)
            raw_data = (raw_data << 1) | self.d_out_pin.value()
        self._set_channel()
        return self._convert_from_twos_complement(raw_data)

    def tare(self, samples=50):
        total = sum(self.read_raw() for _ in range(samples))
        self.offset = total / samples
        return self.offset

    def set_scale(self, known_weight, samples=50):
        raw_total = sum(self.read_raw() for _ in range(samples))
        raw_avg = raw_total / samples
        self.scale = (raw_avg - self.offset) / known_weight
        if self.scale == 0:
            self.scale = 1
        return self.scale

    def get_weight(self, samples=25, filter_type="mean"):
        values = [self.read_raw() for _ in range(samples)]
        if filter_type == "median":
            values.sort()
            raw = values[len(values)//2]
        else:
            raw = sum(values)/len(values)
        return (raw - self.offset)/self.scale

    def save_offset_scale(self):
        with open(self.config_file, "w") as f:
            ujson.dump({'offset': self.offset, 'scale': self.scale}, f)

    def load_offset_scale(self):
        try:
            with open(self.config_file, "r") as f:
                data = ujson.load(f)
                self.offset = data.get("offset", 0)
                self.scale = data.get("scale", 1.0)
        except:
            self.offset = 0
            self.scale = 1.0
hx = HX711(d_out=17, pd_sck=16)


print("=== HX711 自动校准程序 ===")
print("1. 请确保秤上没有物体...")
sleep_ms(3000)
hx.tare()
print("去皮完成,offset =", hx.offset)

known_weight = 199
print("2. 请放入 %.2f g 重量的物品..." % known_weight)
sleep_ms(5000)
scale = hx.set_scale(known_weight)
print("校准完成,scale =", scale)

hx.save_offset_scale()
print("参数已保存,可以直接开始测量。")




while True:
    print(hx.get_weight(samples=50, filter_type="mean"))

7、米思齐 Mixly 示例程序(图形化语言) in Deutsch

Beispielprogramm (UNO-Board):2、第二步将UNO开发板的库文件下载后解压在桌面。
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE Arduino库文件下载及导入教程:Klicken Sie zum Anzeigen

Beispielprogramm (ESP32-Entwicklungsboard):2、第二步将UNO开发板的库文件下载后解压在桌面。
Achtung: Wenn beim Hochladen des Programms eine Fehlermeldung bezüglich der Bibliotheksdateien angezeigt wird, laden Sie bitte zuerst die Bibliotheksdateien herunter!
米思齐(Mixly)IDE ESP32库文件下载及导入教程:
Klicken Sie zum Anzeigen

8、Testumgebung Einrichtung

Testumgebung für Arduino UNO einrichten

Vorbereiten Sie die Komponenten:

  • UNO-R3 Entwicklungsboard *1

  • UNO-R3 EXP-Erweiterungsplatte *1

  • USB type-c Datenkabel *1

  • HS-S46P Gewichtssensor*1

  • PH2.0 4P-Doppelkopfsteckerleitung *1

Schaltplan der Leitung:

ESP32 Testumgebung einrichten

Vorbereiten Sie die Komponenten:Wird aktualisiert...

Schaltplan der Leitung:Wird aktualisiert...

9、Video-Tutorial

Arduino UNO Videoanleitung:Klicken Sie zum Anzeigen

ESP32 Python Videoanleitung:Klicken Sie zum Anzeigen

10、Testergebnis

Arduino UNO Testergebnis:

Eingeben Sie den Code, legen Sie das Objekt dann auf die Induktionswaage und Sie können das Gewicht über den Computer-Serialport lesen.

ESP32 Testergebnis:

Wird aktualisiert...