#include <HX711.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
// ================== PIN ==================
#define HX_DOUT 4
#define HX_SCK 5
#define ENC_CLK 32
#define ENC_DT 33
#define BUTTON_PIN 25
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// ================== OBJECT ==================
HX711 scale;
Encoder myEnc(ENC_CLK, ENC_DT);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ================== VARIABLE ==================
float calibration_factor = -7050; // GANTI sesuai hasil kalibrasi
long encoderValue = 0;
int mode = 0;
// 0 = Timbangan
// 1 = Pengukur Tinggi
bool lastButtonState = HIGH;
// Konversi encoder ke cm
float cm_per_pulse = 0.1;
// GANTI sesuai mekanik (misal 1 putaran = berapa cm)
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// HX711
scale.begin(HX_DOUT, HX_SCK);
scale.set_scale(calibration_factor);
scale.tare();
// OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED gagal!");
while(true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.display();
Serial.println("Sistem Siap");
}
void loop() {
// ================= BUTTON MODE =================
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH) {
mode++;
if (mode > 1) mode = 0;
delay(300); // debounce
}
lastButtonState = buttonState;
display.clearDisplay();
display.setCursor(0,0);
// ================= MODE TIMBANGAN =================
if (mode == 0) {
float berat = scale.get_units(10);
display.setTextSize(1);
display.println("MODE: TIMBANGAN");
display.setTextSize(2);
display.setCursor(0,25);
display.print(berat, 2);
display.println(" kg");
Serial.print("Berat: ");
Serial.println(berat,2);
}
// ================= MODE PENGUKUR TINGGI =================
else if (mode == 1) {
encoderValue = myEnc.read();
float tinggi = encoderValue * cm_per_pulse;
display.setTextSize(1);
display.println("MODE: UKUR TINGGI");
display.setTextSize(2);
display.setCursor(0,25);
display.print(tinggi, 1);
display.println(" cm");
Serial.print("Tinggi: ");
Serial.println(tinggi,1);
}
display.display();
}