#include <EEPROM.h>
int address = 0;
int address1 = 1;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Arduino.h>
#include "HX711.h"
const int LOADCELL_DOUT_PIN = 3;
const int LOADCELL_SCK_PIN = 2;
HX711 scale;
#define pinSet 4
#define pinUp 5
#define pinDown 6
#define pinTare 7
#define Set digitalRead(pinSet)
#define Up digitalRead(pinUp)
#define Down digitalRead(pinDown)
#define Tare digitalRead(pinTare)
bool lockSet = 0;
bool lockUp = 0;
bool lockDown = 0;
bool lockTare = 0;
int dis = 0;
int saveResult, result, cFactor, mode, knownWeight, saveKnownWeight;
long reading;
float kg, sHargaSatuan, totalHarga;
const long interval = 2000;
unsigned long previousMillis = 0;
const long interval1 = 120000;
unsigned long previousMillis1 = 0;
int saveRibuan, inRibuan, saveRatusan, inRatusan, totalTransaksi, totalTimbang, totalPendapatan;
int sReset = 0;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.init();
lcd.backlight();
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
pinMode(pinSet, INPUT_PULLUP);
pinMode(pinUp, INPUT_PULLUP);
pinMode(pinDown, INPUT_PULLUP);
pinMode(pinTare, INPUT_PULLUP);
lcd.setCursor(4, 0);
lcd.print("Skripsi 2024");
lcd.setCursor(1, 1);
lcd.print("Timbangan Digital");
lcd.setCursor(1, 2);
lcd.print("Dengan Datalogger");
lcd.setCursor(2, 3);
lcd.print("M. Khanif Musofa");
EEPROM.get(address, cFactor);
EEPROM.get(address1, sHargaSatuan);
scale.set_scale(cFactor);
scale.tare();
delay(3000);
lcd.clear();
}
void loop() {
SettingMenu();
}
float read_cell() {
scale.set_scale(cFactor);
result = scale.get_units(), 5;
if (result < 0) {
result == 0;
}
return result;
}
void SettingMenu() {
if (dis == 0) {
//----------------------------------------------------------Tampilan Utama
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
kg = read_cell() / 1000.0;
totalHarga = sHargaSatuan * kg;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("TOKO KHANIF");
lcd.setCursor(0, 1);
lcd.print("Berat: " + String(kg, 1) + " kg");
lcd.setCursor(0, 2);
lcd.print("Harga: Rp " + String(sHargaSatuan, 1));
lcd.setCursor(0, 3);
lcd.print("Total: Rp " + String(totalHarga, 1));
}
}
//----------------------------------------------------------Fungsi Tare
if (Tare == 0 && lockTare == 0) {
lockTare = 1;
}
if (Tare != 0 && lockTare == 1) {
lockTare = 0;
scale.tare();
}
//----------------------------------------------------------Fungsi Masuk Menu
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1 && dis == 0) {
lockSet = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Menu");
for (int i = 0; i < 8; i++) {
int kolom = 8 + i;
lcd.setCursor(kolom, 0);
lcd.print(".");
delay(500);
}
lcd.clear();
dis = 1;
}
//----------------------------------------------------------Fungsi Hold
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1 && dis == 0) {
lockUp = 0;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("TOKO KHANIF");
lcd.setCursor(0, 1);
lcd.print("Berat: " + String(kg, 1) + " kg");
lcd.setCursor(0, 2);
lcd.print("Harga: Rp " + String(sHargaSatuan, 1));
lcd.setCursor(0, 3);
lcd.print("Total: Rp " + String(totalHarga, 1));
Serial.write((uint8_t*)&kg, sizeof(float));
Serial.write((uint8_t*)&totalHarga, sizeof(float));
delay(15000);
lcd.clear();
dis = 0;
}
//----------------------------------------------------------Fungsi Daftar Menu
if (dis == 1) {
lcd.setCursor(4, 0);
lcd.print("Menu Setting");
lcd.setCursor(1, 1);
lcd.print("Kalibrasi");
lcd.setCursor(1, 2);
lcd.print("Setting Harga");
lcd.setCursor(1, 3);
lcd.print("Reset Sistem");
if ((Up == 0 && lockUp == 0) && (Set == 0 && lockSet == 0) && dis == 1) {
lockUp = 1;
lockSet = 1;
}
if ((Up != 0 && lockUp == 1) && (Set != 0 && lockSet == 1 && dis == 1)) {
lcd.clear();
lockUp = 0;
lockSet = 0;
dis = 0;
}
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
mode++;
if (mode > 2) {
mode = 0;
}
}
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
mode--;
if (mode < 0) {
mode = 2;
}
}
switch (mode) {
case 0:
lcd.setCursor(0, 1);
lcd.print(">");
break;
case 1:
lcd.setCursor(0, 2);
lcd.print(">");
break;
case 2:
lcd.setCursor(0, 3);
lcd.print(">");
break;
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1 && mode == 0) { //masuk Set kalibrasi
lockSet = 0;
mode = 0;
lcd.clear();
dis = 2;
}
if (Set != 0 && lockSet == 1 && mode == 1) { //masuk Set harga
lockSet = 0;
mode = 0;
lcd.clear();
dis = 3;
}
if (Set != 0 && lockSet == 1 && mode == 2) { //masuk Set Reset
lockSet = 0;
mode = 0;
lcd.clear();
dis = 4;
}
}
//----------------------------------------------------------Fungsi Kalibrasi
if (dis == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Starting");
lcd.setCursor(0, 1);
lcd.print("Callibration");
delay(1000);
lcd.clear();
dis = 5;
}
//----------------------------------------------------------Fungsi Setup Harga
if (dis == 3) {
lcd.setCursor(5, 0);
lcd.print("Menu Harga");
lcd.setCursor(1, 1);
lcd.print("Now: Rp " + String(sHargaSatuan));
lcd.setCursor(1, 2);
lcd.print("Set Ribuan");
lcd.setCursor(1, 3);
lcd.print("Set Ratusan");
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
mode++;
if (mode > 1) {
mode = 0;
}
}
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
mode--;
if (mode < 0) {
mode = 1;
}
}
switch (mode) {
case 0:
lcd.setCursor(0, 2);
lcd.print(">");
break;
case 1:
lcd.setCursor(0, 3);
lcd.print(">");
break;
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1 && mode == 0) { //masuk Set Ribuan
lockSet = 0;
mode = 0;
lcd.clear();
dis = 8;
}
if (Set != 0 && lockSet == 1 && mode == 1) { //masuk Set Ratusan
lockSet = 0;
mode = 0;
lcd.clear();
dis = 9;
}
}
if (dis == 5) {
lcd.setCursor(0, 0);
lcd.print("Set Weight:");
lcd.setCursor(0, 1);
lcd.print(String(knownWeight) + " gram");
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
knownWeight = knownWeight + 100;
if (knownWeight > 2000) {
knownWeight = 0;
}
}
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
knownWeight = knownWeight - 100;
if (knownWeight < 0) {
knownWeight = 2000;
}
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1) {
lockSet = 0;
saveKnownWeight = knownWeight;
dis = 6;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Known Weight:");
lcd.setCursor(0, 1);
lcd.print(saveKnownWeight);
delay(1000);
}
}
if (dis == 6) {
if (scale.is_ready()) {
scale.set_scale();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tare");
for (int i = 0; i < 10; i++) {
int kolom = 5 + i;
lcd.setCursor(kolom, 0);
lcd.print(".");
delay(500);
}
scale.tare();
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Tare done..");
lcd.setCursor(2, 1);
lcd.print("Taruh barang!");
delay(5000);
reading = scale.get_units(10);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Reading:");
lcd.setCursor(2, 1);
lcd.print(reading);
} else {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Not Found!");
}
delay(2000);
dis = 7;
}
if (dis == 7) {
cFactor = reading / saveKnownWeight;
EEPROM.put(address, cFactor);
delay(1000);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("cFactor:");
lcd.setCursor(2, 1);
lcd.print(cFactor);
delay(3000);
dis = 0;
previousMillis = 0;
}
if (dis == 8) {
lcd.setCursor(0, 0);
lcd.print("Set Ribuan:");
lcd.setCursor(0, 1);
lcd.print(inRibuan);
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
inRibuan = inRibuan + 1000;
if (mode > 900000) {
inRibuan = 0;
}
}
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
inRibuan = inRibuan - 1000;
if (inRibuan < 0) {
inRibuan = 900000;
}
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1) {
lockSet = 0;
saveRibuan = inRibuan;
dis = 3;
mode = 1;
lcd.clear();
}
}
if (dis == 9) {
lcd.setCursor(0, 0);
lcd.print("Set Ratusan:");
lcd.setCursor(0, 1);
lcd.print(inRatusan);
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
inRatusan = inRatusan + 100;
if (mode > 900) {
inRibuan = 0;
}
}
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
inRatusan = inRatusan - 1000;
if (inRatusan < 0) {
inRatusan = 900;
}
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1) {
lockSet = 0;
saveRatusan = inRatusan;
delay(100);
sHargaSatuan = saveRibuan + saveRatusan;
EEPROM.put(address1, sHargaSatuan);
dis = 1;
mode = 0;
lcd.clear();
}
}
if (dis == 4) {
lcd.setCursor(0, 0);
lcd.print("Mau reset sistem?");
if (sReset == 0) {
lcd.setCursor(0, 1);
lcd.print("NO ");
}
if (sReset == 1) {
lcd.setCursor(0, 1);
lcd.print("YES");
}
if (Up == 0 && lockUp == 0) {
lockUp = 1;
}
if (Up != 0 && lockUp == 1) {
lcd.clear();
lockUp = 0;
sReset++;
if (sReset > 1) {
sReset = 0;
}
}
if (Down == 0 && lockDown == 0) {
lockDown = 1;
}
if (Down != 0 && lockDown == 1) {
lcd.clear();
lockDown = 0;
sReset--;
if (sReset < 0) {
sReset = 1;
}
}
if (Set == 0 && lockSet == 0) {
lockSet = 1;
}
if (Set != 0 && lockSet == 1 && sReset == 0) {
lockSet = 0;
dis = 0;
previousMillis = 0;
mode = 0;
lcd.clear();
}
if (Set != 0 && lockSet == 1 && sReset == 1) {
lockSet = 0;
dis = 10;
mode = 0;
lcd.clear();
}
}
if (dis == 10) {
sReset = 0;
dis = 0;
saveResult = 0;
result = 0;
cFactor = 0;
mode = 0;
knownWeight = 0;
saveKnownWeight = 0;
reading = 0;
kg = 0;
sHargaSatuan = 0;
totalHarga = 0;
saveRibuan = 0;
inRibuan = 0;
saveRatusan = 0;
inRatusan = 0;
totalTransaksi = 0;
totalTimbang = 0;
totalPendapatan = 0;
EEPROM.put(address, cFactor);
EEPROM.put(address1, sHargaSatuan);
lcd.setCursor(0, 0);
lcd.print("Reset");
for (int i = 0; i < 9; i++) {
int kolom = 6 + i;
lcd.setCursor(kolom, 0);
lcd.print(".");
delay(500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Done!");
delay(1000);
dis = 0;
lcd.clear();
}
}