
1、介紹
Hx711稱重感應器是一種將力學量(如重量、壓力)轉換為電信號輸出的裝置,最常見類型,利用彈性體受力變形,粘貼其上的電阻應變片隨形變改變電阻值,通過惠斯登電橋將電阻變化轉化為電壓信號,再經放大、模數轉換輸出數字信號。
2、原理圖

3、模組參數
引腳名稱 | 描述 |
|---|---|
G | GND(電源輸入負極) |
V | VCC(電源輸入正極) |
D | 數據引腳 |
S | 時鐘引腳 |
供電電壓: 3.3V-5V
連接方式:PH2.0 4P端子線
安裝方式:積木固定
4、電路板尺寸

5、添加Arduino庫文件
不會使用庫文件的參考這裡:庫文件安裝使用
庫文件下載:點擊下載
6、加入MicroPython環境庫檔案
不會安裝庫文件的請點擊這裡:參考連結
7、Arduino IDE範例程式
範例程式(UNO開發板):點擊下載
#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));
}示例程序(ESP32開發板—基於Python語言,不能用Arduino IDE上傳代碼):
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"))
8、米思齊 Mixly 示例程式(圖形化語言)
示例程式(UNO開發板):點擊下載

示例程序(ESP32開發板):點擊下載

9、測試環境搭建
Arduino UNO 測試環境搭建
準備配件:
UNO-R3 開發板 *1
UNO-R3 EXP 開放板 *1
USB type-c 資料線 *1
HS-S46-L 調重感應器*1
PH2.0 4P雙頭端子線 *1
電路接線圖:

ESP32 Python 測試環境搭建
10、視頻教學
Arduino UNO視頻教學:按鈕查看
ESP32 Python視頻教學:
11、測試結論
Arduino UNO測試結論:
下載代碼,之後將物體放在感應秤上,通過電腦串口即可讀出物體重量。

