/*
DISPLAY PIN : 2,3,4,5,6,7 ;
KEYPAD PIN : 8,9,10,11,12,13,14,15 ;
SERVO PIN : 16,17,18,19 ;
LOADCELL PIN : 20,21,22,23 ;
POTENTIO PIN : A0,A1,A2 ;
MOTOR1 PIN : A3,A4 ;
MOTOR2 PIN : A5,A6 ;
*/
#include <LiquidCrystal.h> // DISPLAY
#include <Stepper.h> // MOTOR
#include <Keypad.h> // KEYPAD
#include <Servo.h> // SERVO
#include <HX711.h> // LOADCELL
#include <EEPROM.h> // DATABASE
/*INIT DISPLAY START*/
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
/*INIT DISPLAY END*/
/*INIT AccelStepper START*/
const int steps = 200;
Stepper myStepper1(steps, A3, A4);
Stepper myStepper2(steps, A5, A6);
/*INIT AccelStepper END*/
/*INIT EEPROM DATABASE START*/
/*INIT EEPROM DATABASE END*/
/*INIT POTENTIO START*/
byte potentio1;
byte potentio2;
byte potentio3;
int val1;
int val2;
/*INIT POTENTIO END*/
/*INIT KEYPAD START*/
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {8, 9, 10, 11};
byte colPins[COLS] = {12, 13, 14, 15};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
/*INIT KEYPAD END*/
/*INIT SERVO START*/
int pos = 0;
Servo servo;
/*INIT SERVO END*/
/*INIT LOADCELL START*/
// 1. HX711 circuit wiring
#define DOUT1 20
#define CLK1 21
#define DOUT2 22
#define CLK2 23
HX711 loadCell1;
HX711 loadCell2;
// Faktor kalibrasi untuk masing-masing load cell
// float calibration_factor = 420.22;
float calibration_factor = 0;
// Toleransi berat
float toleransi = 0.05;
float MG;
/*INIT LOADCELL END*/
/*INIT VAR START*/
char inisiasi;
enum {i0,i1, i2, i3, i4, i5};
String strAngkaPertama = "", strAngkaKedua="", CodeR="" , berat1="0" , berat2="";
int angkaPertama, angkaKedua ,beratTablet ,beratSerbuk;
float hasil;
char operasi;
// Sensor
int res = 0;
int target = 0;
int sensor = 0;
// Var Delay
int mDelayA = 10000;
int oDelay1 = 15;
int cDelay1 = 15;
int oDelay2 = 15;
int cDelay2 = 15;
int oDelay3 = 15;
int cDelay3 = 15;
/*INIT VAR END*/
void setup() {
// PIN MODE START
// pinMode(A3, OUTPUT);
// PIN MODE END
// Menginisialisasi load cell
loadCell1.begin(DOUT1, CLK1);
loadCell2.begin(DOUT2, CLK2);
// Set faktor kalibrasi
loadCell1.set_scale(calibration_factor);
loadCell2.set_scale(calibration_factor);
// Set tara
loadCell1.tare();
loadCell2.tare();
lcd.begin(16, 2);
lcd.print("= Wellcome To =");
lcd.setCursor(0,1);
lcd.print("EDS.Robotik");
delay(3000);
lcd.clear();
// MG = loadCell1.get_units(), 10;
// lcd.print(MG);
inisiasi = i0;
}
void loop() {
char BTN = customKeypad.getKey();
switch(inisiasi){
case i0:
MG = loadCell1.get_units(), 10;
// MG = MG * 1000;
lcd.setCursor(0,0);
lcd.print("Ready !");
lcd.setCursor(0,1);
lcd.print(MG);
lcd.setCursor(13,1);
lcd.print(".mg");
strAngkaPertama = MG;
if(BTN){
if(BTN == 'A'){
if(strAngkaPertama.toInt() <= 0 || strAngkaPertama==""){
lcd.setCursor(0,0);
lcd.print("Timbangan null !");
delay(2000);
lcd.clear();
}else{
inisiasi = i1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dibagi ?");
}
}
if(BTN == 'B'){
// PEMBERSIHAN
}
if(BTN == 'D'){
Reset();
}
}
break;
case i1:
if(BTN){
if(BTN == 'A'){
angkaPertama = strAngkaPertama.toInt();
angkaKedua = strAngkaKedua.toInt();
berat1 = angkaPertama/angkaKedua;
if(berat1.toInt() <= 0){
strAngkaKedua="";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Error ! Nilai.");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dibagi ?");
return;
}
berat2 = strAngkaPertama+" / "+strAngkaKedua+" = "+berat1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(berat2);
lcd.setCursor(0,1);
lcd.print("Tersisa : "+strAngkaKedua);
inisiasi = i2;
prosesStart();
}else if(BTN == 'C'){
strAngkaKedua="";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dibagi ?");
}else if(BTN == 'D'){
Reset();
}else{
strAngkaKedua+=BTN;
lcd.setCursor(0,1);
lcd.print(strAngkaKedua);
}
}
break;
case i2:
if(BTN){}
break;
case i3:
if(BTN){
if(BTN == 'A'){
Reset();
}
}
break;
}
}
void prosesStart(){
servo1go();
servo1back();
motor1on();
ProsesBagi();
}
void ProsesBagi(){
angkaKedua = strAngkaKedua.toInt();
if(angkaKedua<1){
finis();
}else{
servo2go();
motor2on(); // Ganti Proses Timbang serbuk
servo2back();
servo3go();
servo3back();
delay(3000); // Ganti proses Kemas.
angkaKedua -=1;
strAngkaKedua = angkaKedua;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(berat2);
lcd.setCursor(0,1);
lcd.print("Tersisa : "+strAngkaKedua);
ProsesBagi();
}
}
/*FUNCTION MOTOR START*/
void motor1on(){
val1 = analogRead(A0);
myStepper1.setSpeed(val1);
myStepper1.step(1000*100);
}
void motor1off(){
myStepper1.step(0);
}
void motor2on(){
val2 = analogRead(A1);
myStepper2.setSpeed(val2);
myStepper2.step(5000);
}
void motor2off(){
myStepper2.step(0);
}
/*FUNCTION MOTOR END*/
/*FUNCTION SERVO START*/
void servo1go(){
servo.attach(16);
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(oDelay1);
}
}
void servo1back(){
servo.attach(16);
for (pos = 180; pos >= 0; pos -= 1) {
servo.write(pos);
delay(cDelay1);
}
}
void servo2go(){
servo.attach(17);
for (pos = 0; pos <= 45; pos += 1) {
servo.write(pos);
delay(oDelay2);
}
}
void servo2back(){
servo.attach(17);
for (pos = 45; pos >= 0; pos -= 1) {
servo.write(pos);
delay(cDelay2);
}
}
void servo3go(){
servo.attach(18);
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(oDelay3);
}
}
void servo3back(){
servo.attach(18);
for (pos = 180; pos >= 0; pos -= 1) {
servo.write(pos);
delay(cDelay3);
}
}
/*FUNCTION SERVO END*/
/*FUNCTION POTENTIO START*/
void P1(){
val1 = analogRead(A0);
EEPROM.write(1, val1);
potentio1 = EEPROM.read(1);
}
void P2(){
int val2 = analogRead(A1) * 4;
EEPROM.write(2, val2);
potentio2 = EEPROM.read(2);
}
void P3(){
int val3 = analogRead(A2) * 4;
EEPROM.write(3, val3);
potentio3 = EEPROM.read(3);
}
/*FUNCTION POTENTIO END*/
void finis(){
strAngkaPertama="";
strAngkaKedua="";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("= Finis =");
lcd.setCursor(0,1);
lcd.print("Press OK");
inisiasi = i3;
pos = 0;
berat1 = "0";
berat2="";
}
void Reset(){
strAngkaPertama="";
strAngkaKedua="";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ready :");
inisiasi = i0;
pos = 0;
berat1 = "0";
berat2="";
}