#include <LiquidCrystal_I2C.h> //librar lcd i2c
#include <Servo.h> //library servo
#define step 10 //pin stepper
#define dir 11 //pin stepper
#define servo 9 //pin servo
#define buka 90 //setting servo
#define tutup 0 //setting servo
#define kiri 2 //tombol back
#define kanan 3 //tombol next
#define atas 4 //tombol plus
#define bawah 5 //tombol minus
LiquidCrystal_I2C lcd(0x27,16,2); //inisial / alamat lcd
Servo potong; //nama servo
unsigned int panjang = 0;
unsigned int jumlah = 0;
int state = 0;
int speed = 1;
int panjangnya = 0;
int jumlahnya = 0;
float perstep = 0.18096;
void setup() {
lcd.begin(16,2);
pinMode(atas, INPUT_PULLUP);
pinMode(bawah, INPUT_PULLUP);
pinMode(kiri, INPUT_PULLUP);
pinMode(kanan, INPUT_PULLUP);
pinMode(dir, INPUT_PULLUP);
pinMode(step, INPUT_PULLUP);
potong.attach(servo);
potong.write(buka);
delay(1000);
}
void loop() {
if(!digitalRead(kanan)){
if(state == 5){
state = 0;
}
else{
state +=1;
}
delay(200);
lcd.clear();
}
if(!digitalRead(kiri) && state > 0 && state < 4){
state -=1;
delay(200);
lcd.clear();
}
switch(state){
case 0:
menu();
break;
case 1:
pilihpanjang();
break;
case 2:
pilihjumlah();
break;
case 3:
pasti();
break;
case 4:
sedangpotong();
break;
case 5:
selesai();
break;
}
}
void menu(){
lcd.setCursor(0,0);
lcd.print("ARNO'S CUTTER");
lcd.setCursor(9,1);
lcd.print("NEXT>>>");
}
void pilihpanjang(){
panjang = changeValue(panjang);
if(panjangnya != panjang){
lcd.clear();
panjangnya = panjang;
}
lcd.setCursor(0,0);
lcd.print("Panjang :" + (String)panjang + "cm");
displayNavigation();
}
void pilihjumlah(){
jumlah = changeValue(jumlah);
if(jumlahnya != jumlah){
lcd.clear();
jumlahnya = jumlah;
}
lcd.setCursor(0,0);
lcd.print("Jumlah :" + (String)jumlah + "pcs");
displayNavigation();
}
void pasti(){
lcd.setCursor(0,0);
lcd.print((String)panjang + "cm x " + (String)jumlah + "pcs");
lcd.setCursor(0,1);
lcd.print("<<<BACK");
lcd.setCursor(9,1);
lcd.print("START>>>");
delay(100);
}
void sedangpotong(){
lcd.setCursor(0,0);
lcd.print((String)0 + "/" + (String)jumlah);
lcd.setCursor(0,1);
lcd.print("???s");
int stepsToTake = (int)panjang/perstep;
for(int i = 0; i < jumlah; i ++){
unsigned long timeForOneCycle = millis();
digitalWrite(dir, HIGH);
for(int x = 0; x < stepsToTake; x ++){
digitalWrite(step, HIGH);
delayMicroseconds(300);
digitalWrite(step, LOW);
delayMicroseconds(300);
}
lcd.setCursor(0,0);
lcd.print((String)(i+1) + "/" + (String)jumlah);
potong.write(tutup);
delay(400);
potong.write(buka);
delay(400);
lcd.setCursor(0,1);
unsigned long sisawaktu = ((millis() - timeForOneCycle)*(panjang - (i+1)))/1000;
lcd.print((String)sisawaktu + "s");
}
panjang = 0;
jumlah = 0;
state = 5;
}
void selesai(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SELESAI");
lcd.setCursor(9,1);
lcd.print("NEXT>>>");
delay(100);
}
int changeValue(int currentValue){
if(!digitalRead(atas)){
currentValue += speed;
speed ++;
}
if(!digitalRead(bawah)){
if(currentValue - speed >= 0){
currentValue -= speed;
speed ++;
}
else{
currentValue = 0;
}
}
if(digitalRead(bawah) && digitalRead(atas)){
speed = 1;
}
return currentValue;
}
void displayNavigation(){
lcd.setCursor(0,1);
lcd.print("<<<BACK");
lcd.setCursor(9,1);
lcd.print("NEXT>>>");
delay(100);
}