#include <Keypad.h> //Keypad - By Mark Stanley, Alexander Brevig (Library Manager)
#include <Servo.h>
#include "HX711.h" //https://www.dropbox.com/s/152akzr8tkrqk5a/HX711-master.zip?dl=0
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C - By Frank de Brabander (Library Manager)
//Keypad 4x4
#define ROW_NUM 4
#define COLUMN_NUM 4
//Servo
#define PIN_SERVO_1 10
#define PIN_SERVO_2 11
#define SERVO1TUTUP 0
#define SERVO1BUKA 180
#define SERVO2TUTUP 0
#define SERVO2BUKA 180
Servo servo1;
Servo servo2;
//Load Cell
#define DOUT A0
#define CLK A1
HX711 scale(DOUT, CLK);
//Relay
#define PENGEPRES_1 12
#define PENGEPRES_2 13
#define MOTOR_DC_1 A2
#define MOTOR_DC_2 A3
//LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
char tombolPilihan, karakter;
float calibrationFactor = 344.10, //kalibrasikan dulu untuk mendapat nilai calibrationFactor
gram,
harga,
hargaAwal = 0,
setPoint;
String tombolNilai;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //pin baris ke
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //pin kolom
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
void setup() {
Serial.begin(9600);
//inisialisasi servo
servo1.attach(PIN_SERVO_1);
servo2.attach(PIN_SERVO_2);
servo1.write(0);
servo2.write(0);
//inisialisasi load cell
scale.set_scale();
scale.tare();
//inisialisasi Relay dan motor dc
pinMode(PENGEPRES_1, OUTPUT);
pinMode(PENGEPRES_2, OUTPUT);
pinMode(MOTOR_DC_1, OUTPUT);
pinMode(MOTOR_DC_2, OUTPUT);
//LCD
lcd.init();
}
void loop() {
lcd.clear();
tombolNilai = "";
karakter = "";
gram = 0;
harga = 0;
setPoint = 0;
servo2.write(SERVO2TUTUP);
//==START TAMPILKAN PILIHAN GRAM ATAU RUPIAH==//
lcd.setCursor(0, 0);
lcd.print("A -> Gram");
lcd.setCursor(0, 1);
lcd.print("B -> Rupiah");
Serial.println("A = GRAM | B = Rp");
//==END TAMPILKAN PILIHAN GRAM ATAU RUPIAH==//
//==START MENUNGGU USER MEMILIH A ATAU B==//
while (tombolPilihan == "" || tombolPilihan != 'A' || tombolPilihan != 'B') {
tombolPilihan = keypad.waitForKey();
Serial.println(tombolPilihan);
if (tombolPilihan == 'A' || tombolPilihan == 'B') {
break;
}
}
//==END MENUNGGU USER MEMILIH A ATAU B==//
//==START MENAMPILKAN BERAPA RUPIAH/GRAM==//
Serial.println(tombolPilihan);
lcd.clear();
lcd.setCursor(0, 0);
if (tombolPilihan == 'A') {
Serial.println("Berapa Rupiah Dalam 1000gr?");
lcd.print("Harga 1000gr?");
} else if (tombolPilihan == 'B') {
Serial.println("Berapa Gram Dalam Rp. 10.000?");
lcd.print("Berat Rp.10.000?");
}
//==END MENAMPILKAN BERAPA RUPIAH ATAU GRAM==//
//==START MEMASUKAN NILAI RUPIAH/GRAM==//
//Tekan * untuk menghapus, tekan # untuk selesai
lcd.setCursor(0, 1);
while (karakter != '#') {
karakter = keypad.waitForKey();
if (karakter == '*') {
tombolNilai = ""; // hapus inputan
Serial.println(tombolNilai);
lcd.setCursor(0, 1);
lcd.print(" ");
} else if (karakter != '#') {
tombolNilai += karakter; // masukan karakter ke variabel
Serial.println(tombolNilai);
lcd.setCursor(0, 1);
lcd.print(tombolNilai);
}
}
hargaAwal = tombolNilai.toInt();
Serial.print("Nilai: ");
Serial.println(hargaAwal);
if (tombolPilihan == 'A') {
harga = hargaAwal;
setPoint = (hargaAwal / 10000) * 1000;
} else if (tombolPilihan == 'B') {
setPoint = hargaAwal;
harga = (hargaAwal / 10000) * 1000;
}
//==END MEMASUKAN NILAI RUPIAH/GRAM==//
//==START MENAMPILKAN TOTAL HARGA PER 1000gr==//
Serial.println(harga);
Serial.print(setPoint);
Serial.print("gr");
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Rp. ");
lcd.setCursor(4, 1);
lcd.print(harga);
//==END MENAMPILKAN TOTAL HARGA PER 1000gr==//
//==START MENIMBANG BERAT SAMPAI 1000gr==//
lcd.setCursor(0, 0);
while (gram < setPoint) {
servo1.write(SERVO1BUKA);
scale.set_scale(calibrationFactor);
//gram = scale.get_units(), 4;
gram++;
Serial.print("Berat: ");
Serial.println(gram);
lcd.print("gr");
lcd.setCursor(0, 0);
lcd.print(gram);
}
servo1.write(SERVO1TUTUP);
delay(500);
servo2.write(SERVO2BUKA);
//==END MENINMBANG BERAT SAMPAI 1000gr==//
//==START PENGEMASAN==//
Serial.println("Dikemas");
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Mohon Tunggu");
pengepres(500); //pengepres dan motor dc on
lcd.setCursor(0, 1);
lcd.print("Proses Selesai");
lcd.setCursor(0, 0);
lcd.print("Rp. ");
lcd.setCursor(4, 0);
lcd.print(harga);
delay(3000); //jeda 3 detik sebelum mulai mengemas kembali
//==END PENGEMASAN==//
}
void pengepres(int delays) {
digitalWrite(PENGEPRES_1, HIGH);
delay(delays);
digitalWrite(PENGEPRES_1, LOW);
digitalWrite(MOTOR_DC_1, HIGH);
digitalWrite(MOTOR_DC_2, HIGH);
delay(delays);
digitalWrite(MOTOR_DC_1, LOW);
digitalWrite(MOTOR_DC_2, LOW);
digitalWrite(PENGEPRES_2, HIGH);
delay(delays);
digitalWrite(PENGEPRES_2, LOW);
}