#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <HX711.h>
#include <EEPROM.h>
const byte numRows = 4; // Jumlah baris keypad
const byte numCols = 4; // Jumlah kolom keypad
char keymap[numRows][numCols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'} // Ubah '*' menjadi '.'
};
byte rowPins[numRows] = {22,23,24,25}; // Hubungkan baris keypad ke pin 9, 8, 7, 6
byte colPins[numCols] = {26,27,28,29}; // Hubungkan kolom keypad ke pin 5, 4, 3, 2
Keypad keypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat LCD I2C: 0x27, 16 karakter, 2 baris
String inputNumber = ""; // Variabel untuk menyimpan angka yang dimasukkan
// Inisialisasi pin data dan clock HX711 untuk masing-masing load cell
const int loadCell1_data_pin = 2;
const int loadCell1_clock_pin = 3;
const int loadCell2_data_pin = 4;
const int loadCell2_clock_pin = 5;
const int loadCell3_data_pin = 6;
const int loadCell3_clock_pin = 7;
const int loadCell4_data_pin = 11;
const int loadCell4_clock_pin = 12;
// Objek HX711 untuk masing-masing load cell
HX711 loadCell1;
HX711 loadCell2;
HX711 loadCell3;
HX711 loadCell4;
// Faktor kalibrasi untuk masing-masing load cell
float loadCell1_calibration_factor = 420;
float loadCell2_calibration_factor = 420;
float loadCell3_calibration_factor = 420;
float loadCell4_calibration_factor = 420;
// Toleransi berat
float toleransi = 0.05;
// Standar Berat Objek
float enteredNumber = inputNumber.toFloat(); // Ubah ke tipe float
//LED dan buzzer
const int buzzerPin = 8; // pin buzzer dihubungkan ke pin digital 8 pada Arduino
const int redLedPin = 9; // Pin LED merah dihubungkan ke pin digital 9 pada Arduino
const int greenLedPin = 10; //Pin LED hijau dihubungkan ke pin digital 10 pada Arduino
//EEPROM
int nilai = 0;
int cekKalibrasi(){
lcd.setCursor(0, 0);
lcd.print("Cek tanda sudah kalibrasi pada eeprom");
lcd.setCursor(0, 1);
lcd.println("Baca EEPROM");
//int nilai = EEPROM.read(1); //baca EEPROM di alamat 1
delay(2000);
lcd.clear();
int status;
//jika nilai di EEPROM tidak sama 0, atau tidak kosong, maka status = 1
int bacaEEPROM = 0;
if(bacaEEPROM!=0){
status = 1; //sudah kalibrasi
}
else{
status = 0; //belum kalibrasi
}
return status;
}
void kalibrasi(){
lcd.setCursor(0, 0);
lcd.print("Mulai kalibrasi");
delay(2000);
lcd.clear();
kalibrasiPerKg(50);
kalibrasiPerKg(100);
kalibrasiPerKg(150);
//lcd.setCursor(0, 1);
//lcd.println("Baca EEPROM");
delay(2000);
lcd.clear();
}
void simpanEEPROM(){
lcd.setCursor(0, 0);
lcd.print("Simpan nilai CAL");//kalibrasi di eeprom");
lcd.setCursor(0, 1);
lcd.print("Beri tanda CAL");//sudah kalibrasi");
delay(2000);
lcd.clear();
}
void modeTimbang(){
//print("Masuk ke mode timbang")
//#return hasilTimbang
lcd.setCursor(0, 0);
lcd.print("Mode Timbang");
delay(2000);
lcd.clear();
//return hasilTimbang
}
void kalibrasiPerKg(int beban){
lcd.setCursor(0, 0);
lcd.print("Kalibrasi:");
lcd.setCursor(10,0);
lcd.print(beban);
lcd.setCursor(13,0);
lcd.print("Kg");
lcd.setCursor(0, 1);
lcd.print("Letakkan beban");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tunggu 5 detik"); //selama minimal 5 detik pembacaan raw data")
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DONE");
lcd.setCursor(0, 1);
lcd.print("Tekan tombol CAL 1 detik");// selama 1 detik untuk pindah ke mode CAL selanjutnya")
delay(2000);
lcd.clear();
}
void timbang(){
//baca sensor, hitung hasil timbang
float hasilTimbang;
hasilTimbang = 125;
lcd.setCursor(0, 0);
lcd.print("Berat :");
lcd.setCursor(8,0);
lcd.print(hasilTimbang);
lcd.setCursor(14,0);
lcd.print("Kg");
delay(2000);
lcd.clear();
//return hasilTimbang
}
void setup() {
Serial.begin(9600);
// Menginisialisasi load cell
loadCell1.begin(loadCell1_data_pin, loadCell1_clock_pin);
loadCell2.begin(loadCell2_data_pin, loadCell2_clock_pin);
loadCell3.begin(loadCell3_data_pin, loadCell3_clock_pin);
loadCell4.begin(loadCell4_data_pin, loadCell4_clock_pin);
// Set faktor kalibrasi
loadCell1.set_scale(loadCell1_calibration_factor);
loadCell2.set_scale(loadCell2_calibration_factor);
loadCell3.set_scale(loadCell3_calibration_factor);
loadCell4.set_scale(loadCell3_calibration_factor);
// Set tara
loadCell1.tare();
loadCell2.tare();
loadCell3.tare();
loadCell4.tare();
//setup awal lcd ketika running
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
//lcd.setCursor(1, 0);
//lcd.print("Pengujian Berat");
//lcd.setCursor(0, 1);
//lcd.println("Kendaraan Roda 4");
delay(2000);
lcd.clear();
//setup EEPROM
//tutorial: https://www.youtube.com/watch?app=desktop&v=McEwx_7SVCs
//nilai = 100;
//EEPROM.write(1, nilai);
//nilai = EEPROM.read(2);
}
void loop() {
//lcd.setCursor(0, 0);
//lcd.print("Standar Berat:");
//Cek sudah kalibrasi atau belum
int tandaKalibrasi = cekKalibrasi();
lcd.setCursor(0,0);
lcd.print("TandaKalibrasi: ");
lcd.setCursor(0,1);
lcd.print(tandaKalibrasi);
delay(2000);
lcd.clear();
//Lakukan kalibrasi jika tandaKalibrasi = 0
if(tandaKalibrasi==1)
{
//sudah kalibrasi
lcd.setCursor(0,0);
lcd.print("Sudah dikalibrasi");
delay(2000);
lcd.clear();
}
else{
//Lakukan kalibrasi
kalibrasi();
}
modeTimbang();
ulangi:
timbang();
//Kondisi ketika tombol kalibrasi dipencet untuk KALIBRASI ULANG
int tombolKalibrasi=0; //Jika tombol dipencet, nilainya akan berubah jadi 1
if(tombolKalibrasi==1){ // Jika tombol kalibrasi dipencet, maka lakukan kalibrasi ulang
lcd.setCursor(0,0);
lcd.print("Tombol kalibrasi");
lcd.setCursor(0,1);
lcd.print("telah diklik");
delay(2000);
lcd.clear();
kalibrasi();
}
goto ulangi;
//tes EEPROM
/*lcd.setCursor(0,0);
lcd.print(nilai);
delay(2000);
lcd.clear();*/
/*
char key = keypad.getKey();
if (key) {
if (key == 'B') {
// Ketika tombol 'B' (Enter) ditekan, proses angka yang dimasukkan
if (inputNumber.length() > 0) {
float enteredNumber = inputNumber.toFloat(); // Ubah ke tipe float
lcd.clear();
lcd.print("Standar : ");
lcd.print(enteredNumber, 2); // Tampilkan angka dengan 2 desimal
Serial.print("Standar Berat yang dimasukkan: ");
Serial.println(enteredNumber, 2);
}
inputNumber = ""; // Reset input setelah angka diproses
} else {
// Ketika tombol angka ditekan, tambahkan angka ke variabel inputNumber
if (isdigit(key) || key == '.') {
inputNumber += key;
lcd.setCursor(0, 1);
lcd.print(inputNumber);
}
}
}
*/
/* // Membaca nilai rata-rata dari masing-masing load cell
float nilai_loadCell1 = loadCell1.get_units(10);
float nilai_loadCell2 = loadCell2.get_units(10);
float nilai_loadCell3 = loadCell3.get_units(10);
float nilai_loadCell4 = loadCell4.get_units(10);
// Menghitung rata-rata beban
float average_load = ((nilai_loadCell1 + nilai_loadCell2+ nilai_loadCell3+ nilai_loadCell4) / 4);
// Menampilkan nilai rata-rata beban di Serial Monitor
Serial.print("Rata-rata beban: ");
Serial.println(average_load);
Serial.println(" kg");
// Tampilkan berat pada LCD dalam kg
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(average_load);
lcd.print(" kg");
delay(5000);
if (average_load < enteredNumber - toleransi){
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
lcd.setCursor(0, 3);
lcd.print("Berat Kurang");
delay(5000);
lcd.clear();
} else if (average_load > enteredNumber + toleransi){
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
lcd.setCursor(0, 3);
lcd.print("Berat Berlebih");
delay(5000);
lcd.clear();
} else {
digitalWrite(buzzerPin, LOW);
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
lcd.setCursor(0, 3);
lcd.print("Berat Sesuai");
delay(5000);
lcd.clear();
} */
/*
if (key == 'D') {
// Perform tare operation
loadCell1.tare();
loadCell2.tare();
loadCell3.tare();
loadCell4.tare();
// Display tare message on the LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tare Berhasil!");
delay(2000);
lcd.clear();
}*/
}
//}