#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Keypad.h"
#include <HX711.h>
#include <Servo.h>
#define CALIBRATION_FACTOR 456.89 // ganti (413.00) dengan hasil yang didapat dari kalibrasi tadi
#define berat1 5
char Data1[berat1];
char berat_100[berat1] = "100#";
char berat_250[berat1] = "250#";
char berat_500[berat1] = "500#";
char berat_1000[berat1] = "1000";
float Tare = '#';
byte pinDt = 12; // DOUT
byte pinSck = 13; // SCK
HX711 scale;
byte data_count = 0;
const byte ROWS = 4; //empat rows
const byte COLS = 4; //empat columns
char hexaKeys[ROWS][COLS] =
{ {'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //hubungkan ke row pinout keypad
byte colPins[COLS] = {5,4,3,2}; //hubungkan ke column pinout keypad
Servo motor;
int pos = 0;
int count = 0;
int grains = 0;
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x27, 16,2); // Set the LCD I2C address for mjkdz I2C module
char key;
void setup()
{
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(2,0);
lcd.print("GRAIN PACKING");
delay(1500);
lcd.clear();
motor.attach(10);
scale.begin(pinDt, pinSck);
scale.set_scale(CALIBRATION_FACTOR); // this value is obtained by calibrating the scale with known weights;
scale.tare();
scale.get_units();
}
void loop()
{
key = customKeypad.getKey();
{
if (key){
Data1[data_count] = key;
lcd.setCursor(data_count,1);
lcd.print(Data1[data_count]);
data_count++;
}
if (key == '*') // scale tare ke 0
{
lcd.print("Calibration");
count = 0;
scale.tare();
}
if(key == 'A'){
packing_1();
}
if(key == 'B'){
packing_2();
}
if(key == 'C'){
packing_3();
}
if(key == 'D'){
packing_4();
}
if(data_count == berat1-1){
lcd.clear();
if(!strcmp(Data1, berat_100)){
packing_1();
}
else if(!strcmp(Data1, berat_250)){
packing_2();
}
else if(!strcmp(Data1, berat_500)){
packing_3();
}
else if(!strcmp(Data1, berat_1000)){
packing_4();
}
else{
lcd.print("BERAT SALAH");
delay(1000);
}
lcd.clear();
clearData();
}
}
{
lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");
}
}
void clearData(){
while(data_count !=0){
Data1[data_count--] = 0;
}
return;
}
void packing_1(){
{lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");}
key = customKeypad.getKey();
lcd.setCursor(0,0);
lcd.print("INPUT 100gr");
delay(1500);
lcd.clear();
if (Data1,berat_100) // mengontrol servo jika berat sudah sesuai dengan input keypad
{ lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");
for (pos = 0; pos <= 90; pos += 1) { // servo brputar dari 0 derajat ke 90 derajat
// in steps of 1 degree
motor.write(pos);
delay(3000);//sesuaikan dengan lama waktu mengisi packing 100gr
for (pos=0; pos<=180; pos += 1)
motor.write(pos);
lcd.setCursor(0,0);
lcd.print("PROSES SELESAI ");
lcd.setCursor(0, 1);
lcd.print("TERIMA KASIH ");
delay(3000);
lcd.clear();
}
}
}
void packing_2(){
{ lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");}
key = customKeypad.getKey();
lcd.setCursor(0,0);
lcd.print("INPUT 250gr");
delay(1500);
lcd.clear();
if (Data1,berat_250) // mengontrol servo jika berat sudah sesuai dengan input keypad
{ lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");
for (pos = 0; pos <= 90; pos += 1) { // servo brputar dari 0 derajat ke 90 derajat
// in steps of 1 degree
motor.write(pos);
delay(3500);//sesuaikan dengan lama waktu mengisi packing 250gr
for (pos=0; pos<=180; pos += 1)
motor.write(pos);
lcd.setCursor(0,0);
lcd.print("PROSES SELESAI ");
lcd.setCursor(0, 1);
lcd.print("TERIMA KASIH ");
delay(3000);
lcd.clear();
}
}
}
void packing_3(){
{lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");}
key = customKeypad.getKey();
lcd.setCursor(0,0);
lcd.print("INPUT 500gr");
delay(1500);
lcd.clear();
if (Data1,berat_500) // mengontrol servo jika berat sudah sesuai dengan input keypad
{ lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");
for (pos = 0; pos <= 90; pos += 1) { // servo brputar dari 0 derajat ke 90 derajat
// in steps of 1 degree
motor.write(pos);
delay(4400);//sesuaikan dengan lama waktu mengisi packing 500gr
for (pos=0; pos<=180; pos += 1)
motor.write(pos);
lcd.setCursor(0,0);
lcd.print("PROSES SELESAI ");
lcd.setCursor(0, 1);
lcd.print("TERIMA KASIH ");
delay(3000);
lcd.clear();
}
}
}
void packing_4(){
{lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");}
key = customKeypad.getKey();
lcd.setCursor(0,0);
lcd.print("INPUT 1000gr");
delay(1500);
lcd.clear();
if (Data1,berat_1000) // mengontrol servo jika berat sudah sesuai dengan input keypad
{ lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(scale.get_units(2),0);
lcd.print(" Gram");
lcd.print(" ");
for (pos = 0; pos <= 90; pos += 1) { // servo brputar dari 0 derajat ke 90 derajat
// in steps of 1 degree
motor.write(pos);
delay(5000);//sesuaikan dengan lama waktu mengisi packing 1000gr
for (pos=0; pos<=180; pos += 1)
motor.write(pos);
lcd.setCursor(0,0);
lcd.print("PROSES SELESAI");
lcd.setCursor(0, 1);
lcd.print("TERIMA KASIH");
delay(3000);
lcd.clear();
}
}
}