Parçalar · 12 dk okuma

HX711 Arduino: Yük Hücresi ile Dijital Terazi ve Kalibrasyon

HX711 Arduino bağlantısı, yük hücresi kablo renkleri, 4 adet 50 kg hücre, dara ve kalibrasyon faktörü, titreyen okumaya çözüm; LCD, OLED, ESP32 ve Pico kodu.

HX711 Arduino ikilisi, bir yük hücresinin (load cell) ürettiği mikrovolt seviyesindeki sinyali okuyup gram cinsinden ağırlığa çevirmenin en yaygın ve en ucuz yoludur. Mutfak terazisi, kişi tartısı, arı kovanı tartısı, mama kabı takibi ya da motor itme kuvveti ölçümü gibi projelerin hepsi aynı temele dayanır: yük hücresi ağırlık altında gözle görülmeyecek kadar az esner, HX711 bu küçük değişimi 24 bitlik bir sayıya çevirir, Arduino da bu sayıyı kalibrasyon faktörüyle grama dönüştürür.

Bu rehberde yük hücresinin içindeki Wheatstone köprüsünün nasıl çalıştığını, kablo renklerini (E+, E-, A+, A-), banyo tartılarından çıkan 4 adet 50 kg'lık yarım köprü hücrenin nasıl bağlandığını, HX711 kütüphanesiyle dara (tare) almayı ve kalibrasyon faktörünü adım adım bulmayı öğreneceksin. Ardından ağırlığı LCD ekranda gösteren, dara butonlu bir dijital terazi kuracak, okumaların neden titrediğini ve nasıl sabitleneceğini görecek, son olarak aynı işi OLED ekranlı bir ESP32 ve Raspberry Pi Pico (MicroPython) ile yapacaksın.

HX711 yük hücresi amplifikatör modülü
HX711 modülü: bir kenarda yük hücresi için E+, E-, A-, A+ (ve ikinci kanal için B-, B+) uçları, diğer kenarda Arduino'ya giden GND, DT, SCK ve VCC pinleri bulunur.

Yük hücresi (load cell) nedir, nasıl çalışır?

Yük hücresi, alüminyum ya da çelikten yapılmış ve üzerine gerinim ölçerler (strain gauge) yapıştırılmış bir metal parçadır. Gerinim ölçer, ince bir folyo üzerine zikzak şeklinde işlenmiş bir dirençtir: metal gerildiğinde iz uzar ve incelir, direnci artar; sıkıştığında direnci azalır. Değişim inanılmaz küçüktür. Gerinim faktörü yaklaşık 2 olan bir ölçer, binde birlik bir uzamada direncini yalnızca yüzde 0,2 değiştirir; 1000 Ω'luk bir ölçer için bu 2 Ω demektir ve normal bir analogRead() ile asla fark edilemez.

Bu küçük değişimi ölçülebilir hale getirmek için dört gerinim ölçer bir Wheatstone köprüsü şeklinde bağlanır. Köprü, yan yana konmuş iki gerilim bölücüdür: E+ ile E- arasına besleme verilir, A+ ve A- ise iki bölücünün orta noktalarıdır. Yük yokken dört direnç eşit olduğundan iki orta nokta aynı gerilimdedir ve çıkış sıfırdır. Yük binince iki ölçer gerilir, ikisi sıkışır; bir orta nokta yükselirken diğeri düşer. Sol bölücünün üst ve alt dirençlerine R1 ve R2, sağdakilere R3 ve R4 dersek çıkış Vçıkış = Vbesleme × (R4/(R3+R4) − R2/(R1+R2)) olur ve ağırlıkla doğru orantılı büyür. Bölücü mantığını gerilim bölücü hesaplayıcısıyla deneyebilirsin.

Yük hücrelerinin etiketindeki 1 mV/V gibi bir değer duyarlılıktır: hücre tam kapasitesinde, besleme geriliminin her voltu için 1 mV çıkış verir. HX711 modülü köprüyü yaklaşık 4,3 V ile beslediğinden 5 kg'lık bir hücre 5 kg'da yalnızca 4,3 mV, 1 g'da ise 0,86 µV üretir. İşte bu yüzden 128 kat kazançlı, 24 bitlik özel bir ADC gerekir.

Yük (5 kg, 1 mV/V hücre)Köprü çıkışıHX711 ham değeri (kazanç 128)
0 g0 mV0 (dara sonrası)
100 g0,086 mV≈ 43.000
1 kg0,86 mV≈ 429.500
5 kg (tam kapasite)4,3 mV≈ 2.147.000

Tabloda dikkat çeken bir ayrıntı var: ham değer besleme geriliminden bağımsızdır. HX711, köprüyü besleyen gerilimi (AVDD) aynı zamanda ölçüm referansı olarak kullanır; besleme biraz düşerse köprü çıkışı da aynı oranda düşer ve sonuç değişmez. Buna oranlı (ratiometric) ölçüm denir. Kabaca hesap şöyle: 1 mV/V'luk bir hücrede tam kapasite yaklaşık 2.147.000 sayıya karşılık gelir. Bunu hücrenin kapasitesine (gram) bölersen yaklaşık kalibrasyon faktörünü bulursun: 1 kg için ≈ 2150, 5 kg için ≈ 430, 20 kg için ≈ 107.

HX711 modülü nedir? Teknik özellikler

HX711, Avia Semiconductor'ın tartı uygulamaları için ürettiği 24 bitlik bir sigma-delta ADC'dir. İçinde programlanabilir kazançlı bir yükselteç (PGA), köprüyü besleyen bir regülatör ve dahili osilatör bulunur; dışarıyla yalnızca iki kabloyla, kendine özgü basit bir seri protokolle konuşur. Bu protokol I2C değildir: DT (DOUT) hattı LOW olunca veri hazırdır, Arduino SCK hattına 25–27 darbe göndererek 24 biti tek tek okur. Gönderilen darbe sayısı bir sonraki ölçümün kanalını ve kazancını seçer: 25 darbe kanal A ve 128 kazanç, 26 darbe kanal B ve 32 kazanç, 27 darbe kanal A ve 64 kazanç.

ÖzellikDeğer
Çözünürlük24 bit, ikiye tümleyen (0x800000 – 0x7FFFFF)
Kanal AKazanç 128 (±20 mV) ya da 64 (±40 mV), 5 V AVDD ile
Kanal BSabit kazanç 32 (±80 mV)
Örnekleme hızı10 SPS (RATE = GND) ya da 80 SPS (RATE = VCC)
Besleme2,6–5,5 V
Akım1,5 mA'den az; uyku modunda 1 µA'den az
Köprü beslemesi (E+)Yaygın yeşil modülde 5 V girişte yaklaşık 4,3 V
Oturma süresiAçılış, uyanma ya da kazanç değişiminden sonra 400 ms (10 SPS)
Arayüz2 tel: DT (veri) ve SCK (saat + uyku kontrolü)

Ucuz yeşil modüllerin çoğunda RATE pini karta GND olarak bağlıdır, yani modül saniyede 10 ölçüm yapar. 10 SPS hem daha az gürültülüdür hem de 50/60 Hz şebeke parazitini bastırır; tartı için genellikle en iyi seçim budur. SCK hattı 60 µs'den uzun HIGH kalırsa HX711 uyku moduna geçer ve köprünün beslemesini de keser. Pille çalışan projelerde bu özellik power_down() ve power_up() fonksiyonlarıyla işine yarar.

Yük hücresi çeşitleri: hangi kapasiteyi seçmelisin?

1 kg bar tipi yük hücresi (load cell)
1 kg'lık bar (çubuk) tipi yük hücresi: ortadaki çift delikli ince bölge esner ve gerinim ölçerler bu bölgeye yapıştırılmıştır; etiketteki ok kuvvetin yönünü gösterir.
TipKapasiteTelTipik kullanımYaklaşık faktör (sayı/g)
Bar (çubuk), tam köprü1 kg4Takı, mektup, hassas mutfak terazisi≈ 2150
Bar (çubuk), tam köprü5 kg4Mutfak terazisi, mama kabı≈ 430
Bar (çubuk), tam köprü20 kg4Kargo, bavul, saksı tartısı≈ 107
Yarım köprü (banyo tartısı hücresi)50 kg (4 adetle 200 kg)3Kişi tartısı, arı kovanıÖlçerek bul
S tipi50 kg – 1 t4Asma terazi, çekme kuvvetiEtiketteki mV/V'ye göre

Kapasiteyi ölçeceğin en büyük yükün yaklaşık 1,5 katı seç. Gereğinden büyük hücre çözünürlüğü düşürür: 20 kg'lık hücreyle 50 g'lık bir mektubu tartabilirsin ama okuma, 5 kg'lık hücreye göre dört kat daha kaba olur. Küçük hücreye fazla yük binmesi ise daha tehlikelidir; bar tipi hücreler çoğunlukla kapasitenin yüzde 120'si kadar aşırı yükü güvenle taşır, yüzde 150'nin üzerinde metal kalıcı olarak eğilebilir ve hücre bir daha sıfıra dönmez. Toplam kapasite ağırlığın kaç hücreye dağıldığına da bağlıdır: dört köşeye konan 50 kg'lık hücreler birlikte 200 kg taşır.

Kablo renkleri ve HX711 bağlantısı

Yük hücresi teliHX711 ucuGörevi
KırmızıE+Köprü beslemesi (+)
SiyahE-Köprü beslemesi (−)
BeyazA-Sinyal (−)
YeşilA+Sinyal (+)
HX711 piniArduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT), pin 36
GNDGNDGNDGND, pin 38
DT (DOUT)D2GPIO 25GP15, pin 20
SCK (PD_SCK)D3GPIO 26GP14, pin 19
HX711 bir I2C cihazı değildir: DT ve SCK'yi A4/A5'e bağlamak zorunda değilsin ve I2C tarayıcı onu hiçbir zaman bulamaz. Bu iki hat herhangi iki dijital pine bağlanabilir, kodda doğru numarayı yazman yeterlidir. ESP32 ve Pico'da modülü mutlaka 3,3 V ile besle; yeşil modülde VCC aynı zamanda DT hattının sinyal seviyesini belirler ve 5 V ile beslenen modül, 3,3 V'luk girişlere 5 V uygular.

Renkler üreticiye göre değişebilir; bazı hücrelerde siyah yerine sarı, yeşil yerine mavi kullanılır ya da beyaz ile yeşilin görevi yer değiştirir. Emin olmak için multimetreyi ohm kademesine al: besleme çiftinin (E+, E-) ve sinyal çiftinin (A+, A-) iki ucu arasında genellikle 1000 Ω civarı, çapraz çiftlerde ise bunun yaklaşık dörtte üçü okunur. Sinyal tellerini ters bağlarsan hiçbir şey bozulmaz, yalnızca ağırlık eklendikçe değer azalır; tellerin yerini değiştirerek ya da kalibrasyon faktörünü eksi yaparak düzeltirsin. B+ ve B- ikinci kanal içindir ve tek hücreli projelerde boş kalır.

4 adet 50 kg yarım köprü hücre bağlantısı (kişi tartısı)

Banyo tartılarından çıkan, ortası E harfine benzeyen 50 kg'lık hücrelerde yalnızca iki gerinim ölçer ve 3 tel vardır; yani her biri köprünün yarısıdır. Teller çoğunlukla kırmızı, beyaz ve siyahtır ama hangisinin orta uç olduğunu mutlaka ölçerek bul: iki dış tel arası yaklaşık 2 kΩ, orta tel ile her bir dış tel arası yaklaşık 1 kΩ okur. Çoğu hücrede orta uç kırmızıdır. Dört hücreyi bir halka gibi birbirine bağladığında tam bir Wheatstone köprüsü elde edersin.

  1. Hücreleri platformun dört köşesine yerleştir ve köşeleri 1 (sol ön), 2 (sağ ön), 3 (sağ arka), 4 (sol arka) diye numaralandır.
  2. Komşu hücrelerin aynı renkli dış tellerini birleştir: 1 ile 2'nin beyazları, 2 ile 3'ün siyahları, 3 ile 4'ün beyazları, 4 ile 1'in siyahları.
  3. Çaprazdaki 1 ve 3 numaralı hücrelerin kırmızı tellerini E+ ve E- uçlarına bağla.
  4. Diğer çaprazdaki 2 ve 4 numaralı hücrelerin kırmızı tellerini A+ ve A- uçlarına bağla.
  5. Lehimden önce ölç: E+ ile E- arası ve A+ ile A- arası yaklaşık 2 kΩ olmalı. Değer çok farklıysa bir birleşim yanlıştır.
  6. Ağırlık eklenince değer azalıyorsa A+ ile A- tellerini yer değiştir ya da faktörü eksi kullan.
Hücre (köşe)Beyaz teliSiyah teliKırmızı tel
1 – sol ön2'nin beyazına4'ün siyahınaE+
2 – sağ ön1'in beyazına3'ün siyahınaA+
3 – sağ arka4'ün beyazına2'nin siyahınaE-
4 – sol arka3'ün beyazına1'in siyahınaA-
İki hücreyle de terazi kurulabilir: 1'in beyazını 2'nin siyahıyla, 1'in siyahını 2'nin beyazıyla birleştir; bu iki birleşim noktası E+ ve E-'ye, iki kırmızı tel de A+ ve A-'ya gider. Tek hücrede ise köprüyü iki adet 1 kΩ dirençle tamamlarsın: dış teller E+ ve E-'ye, kırmızı tel A+'ya, seri bağlı iki direncin orta noktası A-'ya bağlanır. Dirençleri multimetreyle seçip birbirine en yakın ikisini kullan; fark büyürse HX711 doyuma gider. Hücre sayısı azaldıkça sıcaklık kayması da artar.

HX711 kütüphanesini kurmak

  1. Arduino IDE'de Araçlar > Kütüphaneleri Yönet menüsünü aç ve arama kutusuna HX711 yaz.
  2. Bogdan Necula'nın HX711 Arduino Library kütüphanesini kur. Kütüphane kurmayı ilk kez yapıyorsan Arduino kütüphane ekleme rehberine göz at.
  3. Kurulumdan sonra Dosya > Örnekler > HX711 Arduino Library altında HX711_basic_example ve HX711_full_example örneklerini görürsün; aşağıdaki kodlar aynı fonksiyonları kullanır.
FonksiyonNe yapar?
begin(dt, sck, kazanç)Pinleri ayarlar; kazanç varsayılan olarak 128 (kanal A)
is_ready() / wait_ready_timeout(ms)Yeni ölçüm hazır mı? Zaman aşımlı sürüm, modül yoksa programı kilitlemez
read() / read_average(n)Ham 24 bit değeri ya da n ölçümün ortalamasını verir
tare(n)n ölçümün ortalamasını sıfır noktası (offset) olarak kaydeder
get_value(n)Ortalama eksi offset: dara düşülmüş ham değer
set_scale(faktör) / get_units(n)Faktörü ayarlar; get_units ağırlığı (get_value / faktör) döndürür
set_offset() / get_offset()Dara değerini elle yazar ya da okur (kaydetmek için)
power_down() / power_up()HX711'i ve köprüyü uyutur, yeniden uyandırır
set_gain(128, 64 ya da 32)Kanal ve kazanç seçer (32 = kanal B)

Dara (tare) ve kalibrasyon faktörü nasıl bulunur?

HX711 sana gram değil, ham bir sayı verir. Bu sayıyı ağırlığa çevirmek için iki değer gerekir: boş terazinin okuduğu offset (dara) ve gram başına düşen sayı, yani kalibrasyon faktörü. Formül basittir: ağırlık = (ham değer − offset) / faktör. tare() fonksiyonu offset'i bulur; faktörü ise bir kez, ağırlığını bildiğin bir cisimle hesaplarsın. Örneğin boş terazi 84.120 okurken üzerine 500 g'lık bir ağırlık konunca değer 298.870 olduysa fark 214.750 ve faktör 214.750 / 500 = 429,5 olur.

  1. Hücreyi platforma sağlam şekilde monte et; kalibrasyon terazinin son hâliyle yapılmalıdır.
  2. Aşağıdaki kodu yükle, Seri Monitör'ü 9600 baud'da aç ve terazi boşken dara alınmasını bekle.
  3. Ağırlığını bildiğin bir cismi ortaya koy. Ağırlığı başka bir terazide ölçülmüş bir su şişesi de iş görür; kapasitenin yarısı civarındaki bir ağırlık en iyi sonucu verir.
  4. Seri Monitör'e cismin gramını yaz (ör. 500) ve Enter'a bas. Kod faktörü hesaplayıp yazar ve hemen bir kontrol ölçümü yapar.
  5. Bulduğun faktörü not al ve terazi koduna yaz. Farklı ağırlıklarla birkaç kez tekrarlayıp ortalamasını almak doğruluğu artırır.
Arduino (C++)
1#include "HX711.h"
2
3const int DT_PIN = 2;                      // HX711 DT (DOUT)
4const int SCK_PIN = 3;                     // HX711 SCK (PD_SCK)
5
6HX711 scale;
7
8void setup() {
9  Serial.begin(9600);
10  scale.begin(DT_PIN, SCK_PIN);            // kanal A, kazanç 128 / channel A, gain 128
11  if (!scale.wait_ready_timeout(1000)) {   // modül cevap vermiyor / module not answering
12    Serial.println("HX711 bulunamadi / HX711 not found");
13    while (true) {}
14  }
15  scale.set_scale();                       // faktör 1: ham sayı / factor 1: raw counts
16  Serial.println("Tarti bos olsun, dara aliniyor... / Keep it empty, taring...");
17  delay(2000);
18  scale.tare(20);                          // 20 ölçümün ortalaması sıfır / average of 20 readings = zero
19  Serial.println("Bilinen agirligi koy, gramini yaz (or. 500) / Place a known weight, type its grams (e.g. 500)");
20}
21
22void loop() {
23  if (Serial.available()) {
24    float bilinen = Serial.parseFloat();   // Seri Monitör'den gram / grams from Serial Monitor
25    if (bilinen > 0) {
26      double fark = scale.get_value(20);   // dara düşülmüş ham fark / tared raw difference
27      float faktor = fark / bilinen;
28      Serial.print("Ham fark / raw difference: ");
29      Serial.println(fark, 0);
30      Serial.print("Kalibrasyon faktoru / calibration factor: ");
31      Serial.println(faktor, 2);
32      scale.set_scale(faktor);             // hemen kontrol et / check right away
33      Serial.print("Kontrol / check: ");
34      Serial.print(scale.get_units(10), 1);
35      Serial.println(" g");
36    }
37  }
38}

Kod, tare(20) ile 20 ölçümün ortalamasını sıfır kabul eder; 10 SPS'te bu yaklaşık 2 saniye sürer. Ağırlık konunca get_value(20) dara düşülmüş ham farkı verir, bunu bilinen grama bölmek faktörü bulur. Faktör eksi çıkarsa endişelenme: sinyal telleri ters bağlı demektir ve eksi faktörle ölçüm yine doğru çalışır. Faktörü her açılışta yeniden girmemek için EEPROM.put() ile Arduino'nun kalıcı belleğine yazıp EEPROM.get() ile okuyabilirsin; ayrıntılar Arduino EEPROM yazısında.

Arduino dijital terazi: LCD'de gram gösterme ve dara butonu

Şimdi bulduğun faktörle gerçek bir terazi yapalım. Ağırlık 16x2 I2C LCD'de gösterilecek, D4'e bağlı bir buton da istediğin an dara alacak; böylece önce kabı koyup dara alır, sonra yalnızca içindekini tartarsın. LCD, A4 (SDA) ve A5 (SCL) pinlerine bağlanır; ayrıntılar için I2C LCD ekran yazısına, butonun dahili pull-up ile bağlanması için buton bağlantısı yazısına bakabilirsin.

Arduino (C++)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3#include "HX711.h"
4
5const int DT_PIN = 2;                      // HX711 DT
6const int SCK_PIN = 3;                     // HX711 SCK
7const int DARA_BUTON = 4;                  // dara butonu, diğer ucu GND / tare button, other leg to GND
8const float FAKTOR = 429.5;                // kendi faktörünü yaz / use your own factor
9
10HX711 scale;
11LiquidCrystal_I2C lcd(0x27, 16, 2);       // adres, sütun, satır / address, columns, rows
12float filtreli = 0;                        // filtrelenmiş ağırlık / filtered weight
13
14void setup() {
15  pinMode(DARA_BUTON, INPUT_PULLUP);
16  lcd.init();
17  lcd.backlight();
18  lcd.print("Dara aliniyor...");
19  scale.begin(DT_PIN, SCK_PIN);
20  scale.set_scale(FAKTOR);
21  scale.tare(20);                          // açılışta terazi boş olmalı / scale must be empty at start
22  lcd.clear();
23  lcd.print("Agirlik:");
24}
25
26void loop() {
27  if (digitalRead(DARA_BUTON) == LOW) {    // butona basıldı / button pressed
28    lcd.setCursor(0, 1);
29    lcd.print("Dara...         ");
30    scale.tare(20);
31    filtreli = 0;
32    while (digitalRead(DARA_BUTON) == LOW) {}   // bırakılmasını bekle / wait for release
33    delay(50);                             // kontak sıçramasını atla / skip contact bounce
34  }
35
36  if (scale.is_ready()) {
37    float w = scale.get_units(4);          // 4 ölçümün ortalaması / average of 4 readings
38    if (fabs(w - filtreli) > 5.0) {
39      filtreli = w;                        // büyük değişim: filtreyi atla / big change: skip the filter
40    } else {
41      filtreli = 0.7 * filtreli + 0.3 * w; // üstel ortalama (EMA) / exponential moving average
42    }
43    float goster = filtreli;
44    if (fabs(goster) < 0.5) goster = 0;    // sıfırdaki titremeyi gizle / hide jitter around zero
45
46    char yazi[12];
47    dtostrf(goster, 8, 1, yazi);           // 8 karakter, 1 ondalık / 8 chars, 1 decimal
48    lcd.setCursor(0, 1);
49    lcd.print(yazi);
50    lcd.print(" g");
51  }
52}

Kodda üç küçük hile var. Birincisi üstel hareketli ortalama (EMA): her yeni ölçüm sonuca yalnızca yüzde 30 oranında katılır, böylece titreme yumuşar. İkincisi, ağırlık bir anda 5 g'dan fazla değişirse filtre atlanır ve ekran hemen yeni değere geçer; filtre yalnızca sabit yükte devreye girer. Üçüncüsü ölü bant: ±0,5 g'ın altındaki değerler 0 gösterilir, böylece boş terazide 0.3, -0.2, 0.1 gibi dans eden rakamlar kaybolur. get_units(4) her çağrıda dört ölçüm beklediği için 10 SPS'te ekran saniyede yaklaşık 2,5 kez yenilenir.

Kararsız okumalar: titreme, kayma ve çözümleri

HX711 projelerindeki sorunların çoğu koddan değil mekanikten gelir. Bar tipi hücre bir konsol kiriş gibi çalışır: bir ucu tabana, diğer ucu üst tablaya vidalanır ve iki uçta da birkaç milimetrelik ara parça (pul ya da 3D baskı blok) bulunur. Böylece hücre Z şeklinde durur ve ortası serbestçe esneyebilir. Hücrenin ortası tabana ya da tablaya değerse, vidalar aşırı sıkılırsa veya tabla eğilirse okumalar sürekli kayar. Üzerindeki okun kuvvet yönünü (aşağıyı) gösterdiğinden emin ol ve gerinim ölçerlerin bulunduğu orta bölgeye hiçbir şeyin değmesine izin verme.

  • Sağlam taban: Taban ve tabla esnememeli; kalın kontrplak, MDF ya da alüminyum levha kullan. Masanın titreşimi de okumaya yansır.
  • Kısa ve sabit kablolar: Hücre tellerini kısa tut, birbirine bük ve sabitle. Sallanan kablo hücreye kuvvet uygular ve değeri değiştirir.
  • Temiz besleme: Dizüstü bilgisayarın USB'si gürültülü olabilir. Modülün VCC ve GND uçlarına 100 nF ve 10 µF kondansatör eklemek, motor, röle ve Wi-Fi anteninden uzak durmak yardımcı olur.
  • Isınma süresi: Açılıştan sonraki ilk birkaç dakika hücre ve modül ısınırken sıfır noktası birkaç gram kayabilir; hassas ölçümden önce bekle, sonra dara al.
  • Ortalama al: get_units(10) gürültüyü yaklaşık üç kat azaltır ama 10 SPS'te 1 saniye sürer. Hız ile kararlılık arasında denge kur; farklı filtre yöntemleri için sensör verisi filtreleme yazısına bak.
  • Sürünme (creep): Uzun süre üzerinde duran yükte değer dakikalar içinde birkaç gram değişebilir. Bu hücrenin doğasıdır ve ucuz hücrelerde daha belirgindir.
  • Gerçekçi beklenti: İyi monte edilmiş 5 kg'lık bir hücreyle 0,5–1 g, dört adet 50 kg'lık hücreyle kurulan kişi tartısında ise 50–100 g kararlılık iyi bir sonuçtur.
Bazı ucuz yeşil HX711 kartlarında üretim hatası nedeniyle E- ucu GND'ye bağlı değildir ve okumalar sürekli kayar. Multimetreyle E- ile GND pini arasındaki direnci ölç: 0 Ω'a yakın değilse iki ucu kısa bir kabloyla lehimleyerek birleştir. Bu küçük düzeltme, açıklanamayan kaymaların sık görülen bir sebebini ortadan kaldırır.

ESP32 ile terazi: OLED ekran ve kalıcı kalibrasyon

ESP32'de aynı kütüphane değişmeden çalışır. Aşağıdaki örnek ağırlığı 0,96 inç SSD1306 OLED ekranda büyük rakamlarla gösterir, GPIO 27'deki butonla dara alır ve kalibrasyon faktörünü Preferences kütüphanesiyle flash belleğe kaydeder. Seri Monitör'e bilinen ağırlığın gramını yazman, yeni faktörün hesaplanıp kalıcı olarak saklanması için yeterlidir. OLED'in bağlantısı (SDA GPIO 21, SCL GPIO 22) ve kütüphaneleri için OLED ekran yazısına bakabilirsin.

Arduino (C++)
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4#include <Preferences.h>
5#include "HX711.h"
6
7const int DT_PIN = 25;                     // HX711 DT
8const int SCK_PIN = 26;                    // HX711 SCK
9const int DARA_BUTON = 27;                 // dara butonu, diğer ucu GND / tare button, other leg to GND
10
11HX711 scale;
12Adafruit_SSD1306 display(128, 64, &Wire, -1);
13Preferences ayar;
14float faktor;
15
16void agirlikGoster(float g) {
17  display.clearDisplay();
18  display.setTextSize(1);
19  display.setCursor(0, 0);
20  display.print(F("BlueGrays Terazi"));
21  display.setTextSize(2);                  // büyük rakamlar / big digits
22  display.setCursor(0, 28);
23  if (fabs(g) < 1000) {
24    display.print(g, 1);
25    display.print(F(" g"));
26  } else {
27    display.print(g / 1000.0, 3);          // 1 kg üstü kilogram / kilograms above 1 kg
28    display.print(F(" kg"));
29  }
30  display.display();
31}
32
33void setup() {
34  Serial.begin(115200);
35  pinMode(DARA_BUTON, INPUT_PULLUP);
36  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // SDA 21, SCL 22
37  display.setTextColor(SSD1306_WHITE);
38
39  ayar.begin("terazi", false);             // flash'ta ayar alanı / settings namespace in flash
40  faktor = ayar.getFloat("faktor", 429.5); // kayıt yoksa varsayılan / default if nothing saved
41
42  scale.begin(DT_PIN, SCK_PIN);
43  scale.set_scale(faktor);
44  scale.tare(20);
45  Serial.println("Kalibrasyon: agirligi koy, gramini yaz / Calibrate: place a weight, type its grams");
46}
47
48void loop() {
49  if (digitalRead(DARA_BUTON) == LOW) {
50    scale.tare(20);
51    while (digitalRead(DARA_BUTON) == LOW) delay(10);   // bırakılmasını bekle / wait for release
52    delay(50);                             // kontak sıçramasını atla / skip contact bounce
53  }
54
55  if (Serial.available()) {
56    float bilinen = Serial.parseFloat();
57    if (bilinen > 0) {
58      faktor = scale.get_value(20) / bilinen;  // yeni faktör / new factor
59      scale.set_scale(faktor);
60      ayar.putFloat("faktor", faktor);     // elektrik kesilse de kalır / survives power loss
61      Serial.printf("Yeni faktor / new factor: %.2f\n", faktor);
62    }
63  }
64
65  if (scale.wait_ready_timeout(200)) {
66    agirlikGoster(scale.get_units(5));
67  }
68}

HX711'i ESP32'nin 3V3 pininden beslediğinde modülün regülatörü 4,3 V'a çıkamaz ve köprü 3,3 V'un biraz altında bir gerilimle beslenir. Ölçüm oranlı olduğu için faktör pek değişmez, yalnızca gürültü biraz artar. ESP32 Wi-Fi'ye de hazırdır: ağırlığı bir web sayfasında göstermek ya da mama kabı boşalınca telefona bildirim göndermek birkaç satırlık eklentidir. İlk adımlar için ESP32 nedir? yazısından başlayabilirsin. Pille çalışan bir kovan tartısında ölçümler arasında HX711'i scale.power_down() ile, ESP32'yi de deep sleep ile uyutursun. Uyku boyunca SCK pininin HIGH kalması için pini gpio_hold_en() ile sabitle; yoksa pin boşta kalır ve HX711 kendiliğinden uyanabilir. Uyandıktan sonraki ilk 400 ms'nin ölçümlerini atmayı da unutma.

Raspberry Pi Pico ile HX711 (MicroPython)

MicroPython'da HX711 için hazır bir modül gelmez ama protokol o kadar basittir ki sürücüyü birkaç satırda kendin yazabilirsin. Aşağıdaki sınıf DT hattının LOW olmasını bekler, SCK'ye 24 darbe göndererek veriyi okur, kazancı seçmek için 1–3 ek darbe verir ve sonucu ikiye tümleyen biçiminden işaretli sayıya çevirir. Okuma sırasında kesmeler kısa süreliğine kapatılır; böylece SCK hattı hiçbir zaman 60 µs'den uzun HIGH kalmaz ve HX711 yanlışlıkla uykuya geçmez. MicroPython kurulumu için Raspberry Pi Pico nedir? yazısına bakabilirsin.

MicroPython
1from machine import Pin
2import machine
3import time
4
5class HX711:
6    def __init__(self, dt, sck, gain=128):
7        self.dt = Pin(dt, Pin.IN)
8        self.sck = Pin(sck, Pin.OUT, value=0)
9        self.extra = {128: 1, 64: 3, 32: 2}[gain]   # toplam 25, 27, 26 darbe / 25, 27, 26 pulses in total
10        self.offset = 0
11        self.scale = 1.0
12        self.read()                                 # kazancı ayarla / set the gain
13
14    def read(self, timeout_ms=1000):
15        start = time.ticks_ms()
16        while self.dt.value() == 1:                 # DT LOW ise veri hazır / data ready when DT is LOW
17            if time.ticks_diff(time.ticks_ms(), start) > timeout_ms:
18                raise OSError("HX711 yanit vermiyor / not responding")
19        irq = machine.disable_irq()                 # SCK 60 µs'den uzun HIGH kalmasın / keep SCK HIGH under 60 µs
20        value = 0
21        for _ in range(24):
22            self.sck.value(1)
23            value = (value << 1) | self.dt.value()
24            self.sck.value(0)
25        for _ in range(self.extra):                 # sonraki ölçümün kanalı ve kazancı / next channel and gain
26            self.sck.value(1)
27            self.sck.value(0)
28        machine.enable_irq(irq)
29        if value & 0x800000:                        # ikiye tümleyen / two's complement
30            value -= 0x1000000
31        return value
32
33    def read_average(self, times=10):
34        return sum(self.read() for _ in range(times)) / times
35
36    def tare(self, times=15):
37        self.offset = self.read_average(times)
38
39    def get_units(self, times=5):
40        return (self.read_average(times) - self.offset) / self.scale
41
42
43hx = HX711(dt=15, sck=14)                           # DT -> GP15, SCK -> GP14
44print("Tarti bos, dara aliniyor... / Scale empty, taring...")
45hx.tare()
46hx.scale = 429.5                                    # kendi faktörün / your own factor
47
48while True:
49    print("{:.1f} g".format(hx.get_units()))
50    time.sleep_ms(200)

Kalibrasyon mantığı Arduino'dakiyle aynıdır: hx.scale = 1.0 iken bilinen ağırlığı koyup get_units() sonucunu ağırlığın gramına bölersen faktörü bulursun. Pico'da da HX711'i 3V3(OUT) pininden besle. Ağırlığı ekranda göstermek istersen ssd1306.py sürücüsüyle bir OLED ekleyip değeri oled.text() ile yazdırman yeterlidir.

HX711 ve yük hücresi ile proje fikirleri

  • Mutfak terazisi: 5 kg'lık hücre, dara butonu ve OLED ekran ile 1 g hassasiyetli tartı.
  • Kişi tartısı: Eski bir banyo tartısının 4 hücresi, HX711 ve I2C LCD ile kilogram göstergesi.
  • Akıllı mama kabı: Kabın ağırlığı belirli bir değerin altına düşünce ESP32 bildirim gönderir, bir servo motor kapağı açıp mama bırakır.
  • Saksı tartısı: Saksının ağırlığı azaldıkça su ihtiyacını hesapla ve sonucu bir toprak nem sensörüyle karşılaştır.
  • Arı kovanı takibi: Kovanın altına 4 hücre koy, bal akımını günlük ağırlık artışından izle ve verileri Wi-Fi ile kaydet.
  • Parça sayıcı: Tek bir vidanın ağırlığını öğret, kutudaki toplam ağırlıktan kaç vida olduğunu hesapla.
  • Veri kaydı: Ölçümleri seri porttan bilgisayara aktar ve Excel'e veri aktarma yöntemiyle grafiğe dök.

Sık yapılan hatalar ve çözümleri

BelirtiOlası nedenÇözüm
Program read() satırında donuyorDT ya da SCK bağlı değil, kodda pin numarası yanlışKabloları kontrol et, wait_ready_timeout() kullan
Değer hep 8388607 ya da -8388608Giriş doyumda: A+/A- kopuk ya da E ve A telleri karışıkKablo renklerini multimetreyle doğrula
Değer hep 0DT hattı sürekli LOW, modül beslenmiyorVCC, GND ve DT bağlantısını ölç
Ağırlık eklenince değer azalıyorA+ ile A- ters bağlıTelleri değiştir ya da faktörü eksi kullan
Okuma yavaşça sürekli kayıyorIsınma, sürünme, E- ile GND bağlantı hatası, gergin montajIsınmayı bekle, E- ile GND'yi ölç, montajı düzelt
Değerler birkaç gram zıplıyorUzun kablo, gürültülü besleme, esneyen tablaKabloları kısalt, kondansatör ekle, ortalama al
Ağırlık konuma göre farklı çıkıyorTabla esniyor ya da 4 hücreden biri yük taşımıyorTablayı rijit yap, hücreleri aynı yüksekliğe getir
Küçük ağırlık doğru, büyük ağırlık hatalıFaktör çok küçük bir ağırlıkla bulunmuşKapasitenin yarısı civarında bir ağırlıkla yeniden kalibre et
Hata ararken önce read() ile ham değeri Seri Monitör'e yazdır ve parmağınla hücreye hafifçe bastır. Ham sayı binlerce değişiyorsa elektronik sağlamdır ve sorun kalibrasyonda ya da mekaniktedir; hiç değişmiyorsa bağlantıyı, doyuma gidiyorsa kablo renklerini kontrol et.

HX711 ile yük hücresi bir kez doğru monte edilip kalibre edildiğinde, ucuz parçalarla gram hassasiyetinde ölçüm yapan bir cihaz elde edersin. Kalibrasyon faktörünü kaydet, mekaniği sağlam kur ve filtreyi projenin hızına göre ayarla; gerisi senin hayal gücüne kalmış. Ölçüm yapmayı daha geniş bir açıdan görmek için Arduino sensörleri rehberine göz at. BlueGrays uygulamasında sensör okuma, LCD ve OLED ekranda değer gösterme ve ESP32 ile veri kaydetme projelerini adım adım devre şeması ve kodlarıyla bulabilir, teraziyi bu projelerle birleştirebilirsin.

Sıkça sorulan sorular

HX711 kaç kg ölçer?

HX711'in kendisinin bir kilogram sınırı yoktur; ölçebileceğin en büyük ağırlığı yük hücresinin kapasitesi belirler. 1 kg'lık bir hücreyle 1 kg, dört adet 50 kg'lık hücreyle 200 kg ölçebilirsin. HX711 yalnızca köprünün mikrovolt seviyesindeki çıkışını 24 bitlik bir sayıya çevirir.

HX711 kalibrasyon faktörü nasıl hesaplanır?

Önce boş terazide tare() ile dara al, sonra ağırlığını bildiğin bir cismi koyup get_value() ile dara düşülmüş ham değeri oku. Bu değeri cismin gramına bölersen faktörü bulursun; örneğin 500 g için 214.750 okunduysa faktör 429,5'tir. Faktörü set_scale() ile verdiğinde get_units() doğrudan gram döndürür.

HX711 değerleri neden sürekli değişiyor?

En sık sebepler esneyen ya da yanlış monte edilmiş tabla, uzun ve sallanan kablolar, gürültülü USB beslemesi ve ısınmadır. Hücrenin ortası serbest kalacak şekilde ara parçalarla monte et, kabloları kısalt, birkaç dakika ısınmasını bekle ve ortalama ya da yazılımsal filtre kullan. Bazı ucuz kartlarda E- ucunun GND'ye bağlı olmaması da sürekli kaymaya yol açar.

Yük hücresi kabloları hangi renk nereye bağlanır?

Yaygın bar tipi hücrelerde kırmızı E+, siyah E-, beyaz A- ve yeşil A+ ucuna bağlanır. Renkler üreticiye göre değişebildiği için multimetreyle ölçmek en güvenlisidir: besleme çiftinin ve sinyal çiftinin uçları arasında ayrı ayrı yaklaşık 1000 Ω okunur. Ağırlık eklenince değer azalıyorsa A+ ile A- tellerinin yerini değiştirmen yeterlidir.

HX711 3,3 V ile çalışır mı?

Evet, HX711 2,6–5,5 V arasında çalışır ve ESP32 ile Pico'da modülü 3,3 V ile beslemen gerekir; aksi halde DT hattı 5 V seviyesinde olur. 3,3 V'ta köprü daha düşük gerilimle beslenir ama ölçüm oranlı olduğu için kalibrasyon faktörü pek değişmez, yalnızca gürültü biraz artar.

Tek bir 50 kg yük hücresi HX711 ile kullanılabilir mi?

Kullanılabilir ama 3 telli yarım köprü hücreyi tam köprüye tamamlamak için değerleri birbirine çok yakın iki adet 1 kΩ direnç gerekir. Dış teller E+ ve E-'ye, orta tel A+'ya, iki direncin orta noktası A-'ya bağlanır. Daha kararlı sonuç için iki ya da dört hücreyi birlikte kullanmak daha iyidir.

Tüm projeleri gör
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

HC-SR04 Mesafe Ölçme (Serial Ekran)

Yarasalar karanlıkta yollarını nasıl buluyorsa HC-SR04 sensörü de öyle çalışır: duyamadığın bir ses gönderir, yankısını dinler ve önündeki cismin ne kadar uzakta olduğunu ölçer. Arduino bu mesafeyi sa

4.6(45)
68
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

4.7(47)
64
LCD Ekran ile Dijital Voltmetre
#56Orta
Premium

LCD Ekran ile Dijital Voltmetre

Pilin ya da adaptörün ne kadar gerilim verdiğini kendi yaptığın ölçü aletiyle öğren. İki dirençten oluşan bir bölücü yüksek gerilimi kartın okuyabileceği seviyeye indirir, Arduino da gerçek değeri hes

4.5(27)
36
I2C İle LCD Ekran Kullanımı
#32Başlangıç
Premium

I2C İle LCD Ekran Kullanımı

Arduino'ya kendi ekranını kazandır ve ilk mesajını yazdır. İki satırlık LCD ekran yalnızca birkaç kabloyla bağlanır; önce üst satıra bir selam, ardından alt satıra ikinci bir yazı gelir, ekran temizle

4.8(53)
70
Boy Ölçüm Projesi
#33Orta
Premium

Boy Ölçüm Projesi

Kapı kasasına asılan ve altında duranın boyunu santimetre olarak söyleyen bir boy ölçer. Önce altında kimse yokken birinci butona basarsın, mesafe sensörü yere olan uzaklığı ölçer; sonra biri altına g

4.5(25)
34
NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü
#44Başlangıç
Premium

NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü

Ortamın sıcaklığını küçük bir boncuk gibi görünen sensörle ölç. NTC adlı bu parça ısındıkça elektriği daha kolay geçirir; Arduino bu değişimi okuyup bir formülle santigrat dereceye çevirir ve iki satı

4.5(33)
44
ESP32 I2C LCD Ekran (16x2)
#119Orta
Premium

ESP32 I2C LCD Ekran (16x2)

Bu projede 16x2 karakter LCD ekranı I2C protokolü üzerinden ESP32'ye bağlayarak metin görüntülüyoruz. I2C sayesinde sadece 2 data pini (SDA ve SCL) ile ekranı kontrol edebiliyoruz; klasik paralel bağlantıdaki 6+ pin israfı ortadan kalkıyor. Kod ilk satıra sabit bir mesaj, ikinci satıra ise her saniye artan bir sayaç yazdırıyor. Ayrıca başlangıçta I2C tarayıcı çalıştırarak ekranın adresini Serial Monitor'a yazdırıyoruz (genelde 0x27 veya 0x3F).

4.9(23)
40
ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
#144İleri
Premium

ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)

ESP32 ile zamanlı sıcaklık ve nem kayıt sistemi kur! Bu projede DHT22 sensörü ile dakikada bir sıcaklık/nem okuyup DS1307 RTC modülünden aldığın gerçek zaman etiketiyle microSD karta CSV formatında kaydediyoruz. OLED ekranda büyük font ile son sıcaklık değeri, nem yüzdesi, timestamp ve toplam kayıt sayısı canlı gösterilir. SD kart üzerindeki `/temp_log.csv` dosyası Excel/Google Sheets/Python pandas ile açılıp analiz edilebilir — sera monitörü, ev/oda sıcaklık takibi, laboratuvar veri toplama,

4.7(7)
12