#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <HX711.h>
// Definisi Pin
#define DT 2 // Pin DT untuk HX711
#define SCK 4 // Pin SCK untuk HX711
#define RED_LED 5 // LED Merah
#define YELLOW_LED 18 // LED Kuning
#define GREEN_LED 19 // LED Hijau
#define BUZZER 34 // Pin Buzzer
// Pengaturan Load Cell
HX711 scale;
float batasBawah = 300; // Default batas bawah berat dalam gram
float batasAtas = 1000; // Default batas atas berat dalam gram
String inputString = ""; // String untuk input angka
bool readyToWeigh = false;
float planoWeights[3]; // Array untuk menyimpan berat 3 plano
int currentPlanoIndex = 0; // Untuk mencatat index plano yang sedang didaftarkan
float rataRataBerat = 0; // Berat rata-rata plano untuk acuan
int jumlahIsiPlano = 0; // Jumlah isi atau buku dalam satu plano
// Pengaturan LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pengaturan Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 12, 14, 27};
byte colPins[COLS] = {26, 25, 33, 32};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Status sistem
void setup() {
Serial.begin(115200);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("Timbangan");
lcd.setCursor(4, 1);
lcd.print("Digital");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Daftarkan 3 Plano");
// Inisialisasi LED dan Buzzer
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Inisialisasi HX711
scale.begin(DT, SCK);
}
void loop() {
char key = keypad.getKey(); // Membaca input dari keypad
if (key) {
if (key == '#') { // # untuk konfirmasi input
if (currentPlanoIndex < 3) {
// Simpan berat plano yang ditimbang
float beratPlano = scale.get_units(10) / 420.00 * 1000; // Menghitung berat dalam gram
if (beratPlano < 0) beratPlano = 0; // Pastikan berat tidak negatif
planoWeights[currentPlanoIndex] = beratPlano; // Menyimpan berat plano
currentPlanoIndex++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Plano ke-" + String(currentPlanoIndex));
lcd.setCursor(0, 1);
lcd.print("Berat: " + String(beratPlano, 2) + " gr");
delay(2000); // Menunggu sebelum melanjutkan
if (currentPlanoIndex == 3) {
// Setelah 3 plano didaftarkan, hitung rata-rata
rataRataBerat = (planoWeights[0] + planoWeights[1] + planoWeights[2]) / 3;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Rata-rata: ");
lcd.setCursor(0, 1);
lcd.print(String(rataRataBerat, 2) + " gr");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pilih Isi Plano:");
}
}
}
else if (key == '*') { // * untuk mereset input
currentPlanoIndex = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Daftarkan 3 Plano");
}
else if (key == 'A') { // Tombol A untuk isi 30
jumlahIsiPlano = 30;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Isi Plano: ");
lcd.setCursor(0, 1);
lcd.print("30 Lembar");
readyToWeigh = true;
}
else if (key == 'B') { // Tombol B untuk isi 40
jumlahIsiPlano = 40;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Isi Plano: ");
lcd.setCursor(0, 1);
lcd.print("40 Lembar");
readyToWeigh = true;
}
else if (key == 'C') { // Tombol C untuk isi 50
jumlahIsiPlano = 50;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Isi Plano: ");
lcd.setCursor(0, 1);
lcd.print("50 Lembar");
readyToWeigh = true;
}
else if (key == 'D') { // Tombol D untuk isi 60
jumlahIsiPlano = 60;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Isi Plano: ");
lcd.setCursor(0, 1);
lcd.print("60 Lembar");
readyToWeigh = true;
}
}
if (readyToWeigh && scale.is_ready()) {
scale.set_scale(); // Set ulang faktor kalibrasi jika diperlukan
float berat = scale.get_units(10) / 420.00 * 1000; // Menghitung berat dalam gram
if (berat < 0) berat = 0; // Pastikan berat tidak negatif
// Hitung jumlah lembar berdasarkan berat rata-rata plano
float sheetCount = (berat / rataRataBerat) * jumlahIsiPlano;
// Tampilkan hasil
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(berat, 2); // Menampilkan berat
lcd.print(" gr");
lcd.setCursor(0, 1);
lcd.print("Lembar: ");
lcd.print(sheetCount, 0); // Tampilkan jumlah lembar
// Indikasi Status
if (berat < batasBawah) {
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, HIGH); // Buzzer menyala panjang
} else if (berat > batasAtas) {
digitalWrite(RED_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, HIGH); // Buzzer menyala panjang
} else {
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BUZZER, LOW); // Buzzer mati
}
}
}