76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
#include "HX711.h"
|
|
|
|
// PIN HX711 ke ESP32
|
|
#define DT_PIN 32
|
|
#define SCK_PIN 33
|
|
|
|
HX711 scale;
|
|
|
|
// ⚠️ Mode Kalibrasi Multi-Titik (Piecewise Linear)
|
|
// Rumus tunggal diganti dengan pemetaan khusus agar 1.1, 1.8, dan 3.65 akurat semua.
|
|
|
|
// Batas nol (anti noise)
|
|
float zero_threshold = 0.2;
|
|
|
|
// Fungsi Kalibrasi Multi-Titik untuk menyelaraskan semua beban
|
|
float hitung_berat_akurat(float raw) {
|
|
float r0 = 0.0, w0 = 0.0;
|
|
float r1 = 20185.0, w1 = 1.1;
|
|
float r2 = 30154.0, w2 = 1.8;
|
|
float r3 = 62972.0, w3 = 3.65;
|
|
|
|
if (raw <= r0) return 0.0;
|
|
if (raw <= r1) return w0 + (raw - r0) * (w1 - w0) / (r1 - r0);
|
|
if (raw <= r2) return w1 + (raw - r1) * (w2 - w1) / (r2 - r1);
|
|
if (raw <= r3) return w2 + (raw - r2) * (w3 - w2) / (r3 - r2);
|
|
|
|
// Ekstrapolasi untuk beban lebih dari 3.65kg (Pukulan)
|
|
return w3 + (raw - r3) * (w3 - w2) / (r3 - r2);
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
delay(1000);
|
|
|
|
scale.begin(DT_PIN, SCK_PIN);
|
|
|
|
Serial.println("=== LOADCELL START ===");
|
|
Serial.println("Pastikan TIDAK ADA BEBAN di timbangan");
|
|
delay(3000);
|
|
|
|
// Set kalibrasi ke 1 karena kita menghitung manual berdasarkan nilai mentah (raw)
|
|
scale.set_scale(1.0);
|
|
|
|
// Jadikan posisi sekarang = 0
|
|
scale.tare();
|
|
|
|
Serial.println("Timbangan SIAP!");
|
|
}
|
|
|
|
void loop() {
|
|
// Gunakan 1 kali bacaan nilai mentah (raw value) tanpa jeda
|
|
float raw = scale.get_value(1);
|
|
|
|
// Hitung berat menggunakan pemetaan multi-titik
|
|
float berat = hitung_berat_akurat(raw);
|
|
|
|
// =========================
|
|
// FILTER AGAR 0 BERSIH
|
|
// =========================
|
|
// Jika sering tidak kembali ke 0 (nyangkut di 0.3 atau 0.4), naikkan zero_threshold di atas!
|
|
if (abs(berat) < zero_threshold) {
|
|
berat = 0;
|
|
} else if (berat < 0) {
|
|
berat = 0; // Abaikan kalau minus
|
|
}
|
|
|
|
// =========================
|
|
// TAMPILKAN HASIL
|
|
// =========================
|
|
Serial.print("Berat: ");
|
|
Serial.print(berat, 2);
|
|
Serial.println(" kg");
|
|
|
|
delay(100); // Dipercepat agar kembalinya ke 0 terlihat seketika
|
|
}
|