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.

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 g | 0 mV | 0 (dara sonrası) |
| 100 g | 0,086 mV | ≈ 43.000 |
| 1 kg | 0,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ç.
| Özellik | Değer |
|---|---|
| Çözünürlük | 24 bit, ikiye tümleyen (0x800000 – 0x7FFFFF) |
| Kanal A | Kazanç 128 (±20 mV) ya da 64 (±40 mV), 5 V AVDD ile |
| Kanal B | Sabit kazanç 32 (±80 mV) |
| Örnekleme hızı | 10 SPS (RATE = GND) ya da 80 SPS (RATE = VCC) |
| Besleme | 2,6–5,5 V |
| Akım | 1,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üresi | Açılış, uyanma ya da kazanç değişiminden sonra 400 ms (10 SPS) |
| Arayüz | 2 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?

| Tip | Kapasite | Tel | Tipik kullanım | Yaklaşık faktör (sayı/g) |
|---|---|---|---|---|
| Bar (çubuk), tam köprü | 1 kg | 4 | Takı, mektup, hassas mutfak terazisi | ≈ 2150 |
| Bar (çubuk), tam köprü | 5 kg | 4 | Mutfak terazisi, mama kabı | ≈ 430 |
| Bar (çubuk), tam köprü | 20 kg | 4 | Kargo, bavul, saksı tartısı | ≈ 107 |
| Yarım köprü (banyo tartısı hücresi) | 50 kg (4 adetle 200 kg) | 3 | Kişi tartısı, arı kovanı | Ölçerek bul |
| S tipi | 50 kg – 1 t | 4 | Asma terazi, çekme kuvveti | Etiketteki 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 teli | HX711 ucu | Görevi |
|---|---|---|
| Kırmızı | E+ | Köprü beslemesi (+) |
| Siyah | E- | Köprü beslemesi (−) |
| Beyaz | A- | Sinyal (−) |
| Yeşil | A+ | Sinyal (+) |
| HX711 pini | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT), pin 36 |
| GND | GND | GND | GND, pin 38 |
| DT (DOUT) | D2 | GPIO 25 | GP15, pin 20 |
| SCK (PD_SCK) | D3 | GPIO 26 | GP14, pin 19 |
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.
- 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.
- 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ı.
- Çaprazdaki 1 ve 3 numaralı hücrelerin kırmızı tellerini E+ ve E- uçlarına bağla.
- Diğer çaprazdaki 2 ve 4 numaralı hücrelerin kırmızı tellerini A+ ve A- uçlarına bağla.
- 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.
- 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 teli | Siyah teli | Kırmızı tel |
|---|---|---|---|
| 1 – sol ön | 2'nin beyazına | 4'ün siyahına | E+ |
| 2 – sağ ön | 1'in beyazına | 3'ün siyahına | A+ |
| 3 – sağ arka | 4'ün beyazına | 2'nin siyahına | E- |
| 4 – sol arka | 3'ün beyazına | 1'in siyahına | A- |
HX711 kütüphanesini kurmak
- Arduino IDE'de Araçlar > Kütüphaneleri Yönet menüsünü aç ve arama kutusuna HX711 yaz.
- 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.
- 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.
| Fonksiyon | Ne 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.
- Hücreyi platforma sağlam şekilde monte et; kalibrasyon terazinin son hâliyle yapılmalıdır.
- Aşağıdaki kodu yükle, Seri Monitör'ü 9600 baud'da aç ve terazi boşken dara alınmasını bekle.
- 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.
- 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.
- 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.
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.
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.
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.
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.
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
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Program read() satırında donuyor | DT ya da SCK bağlı değil, kodda pin numarası yanlış | Kabloları kontrol et, wait_ready_timeout() kullan |
| Değer hep 8388607 ya da -8388608 | Giriş doyumda: A+/A- kopuk ya da E ve A telleri karışık | Kablo renklerini multimetreyle doğrula |
| Değer hep 0 | DT hattı sürekli LOW, modül beslenmiyor | VCC, GND ve DT bağlantısını ölç |
| Ağırlık eklenince değer azalıyor | A+ ile A- ters bağlı | Telleri değiştir ya da faktörü eksi kullan |
| Okuma yavaşça sürekli kayıyor | Isınma, sürünme, E- ile GND bağlantı hatası, gergin montaj | Isınmayı bekle, E- ile GND'yi ölç, montajı düzelt |
| Değerler birkaç gram zıplıyor | Uzun kablo, gürültülü besleme, esneyen tabla | Kabloları kısalt, kondansatör ekle, ortalama al |
| Ağırlık konuma göre farklı çıkıyor | Tabla esniyor ya da 4 hücreden biri yük taşımıyor | Tablayı 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 |
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.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
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

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

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

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

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

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ı

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).

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,
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 160'tan fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

