#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ENCODER_A 2
#define ENCODER_B 3
#define SigmaAuto 5
#define RelayOut 8
#define PPR 20 // Pulsa per putaran (Sesuaikan dengan PPR encoder)
#define WHEEL_CIRCUMFERENCE 100.0 // Keliling roda dalam mm (Sesuaikan dengan keliling roda encoder)
#define MAX_LENGTH 20000 // Batas panjang (Sesuaikan dengan nilai panjang pipa yang akan dibuang/Reject)
volatile long pulseCount = 0; // Penyimpanan jumlah pulsa encoder
bool isCounting = false; // Status penghitungan encoder
bool isLimitReached = false; // Status batas tercapai
bool lastSigmaAutoState = HIGH; // Menyimpan status terakhir SigmaAuto
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x27 dengan alamat I2C LCD Anda jika berbeda
void readEncoder() {
if (!isCounting || isLimitReached) return; // Hentikan jika SigmaAuto OFF atau batas tercapai
if (digitalRead(ENCODER_A) == HIGH) {
if (digitalRead(ENCODER_B) == HIGH) {
pulseCount++;
} else {
pulseCount--;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(ENCODER_A, INPUT);
pinMode(ENCODER_B, INPUT);
pinMode(SigmaAuto, INPUT);
pinMode(RelayOut, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_A), readEncoder, CHANGE);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Program Load...");
lcd.setCursor(0, 1);
lcd.print("by Jikun MTC SKF");
delay(3000);
Serial.println("Program dimulai...");
}
void loop() {
bool SigmaAutoState = digitalRead(SigmaAuto);
if (!SigmaAutoState && lastSigmaAutoState) {
Serial.println("SigmaAuto OFF: Reset panjang ke 0 mm");
pulseCount = 0; // Reset hitungan encoder
isLimitReached = false; // Reset batas tercapai
isCounting = false; // Matikan perhitungan
digitalWrite(RelayOut, LOW); // RelayOut mati saat reset
}
if (SigmaAutoState && !lastSigmaAutoState) {
Serial.println("SigmaAuto ON: Hitungan dimulai...");
isCounting = true;
}
lastSigmaAutoState = SigmaAutoState;
int length_mm = (int)((pulseCount / (float)PPR) * WHEEL_CIRCUMFERENCE);
if (length_mm >= MAX_LENGTH && !isLimitReached) {
isLimitReached = true;
isCounting = false;
digitalWrite(RelayOut, HIGH);
Serial.println("Mencapai 20 meter, RelayOut menyala!");
}
static long lastPrintTime = 0;
if (millis() - lastPrintTime > 500) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SigmaAuto: ");
lcd.print(SigmaAutoState ? "ON " : "OFF");
lcd.setCursor(0, 1);
lcd.print("P: ");
lcd.print(length_mm);
lcd.print(" mm");
Serial.print("SigmaAuto: ");
Serial.print(SigmaAutoState ? "ON" : "OFF");
Serial.print(" | Pulse Count: ");
Serial.print(pulseCount);
Serial.print(" | Panjang: ");
Serial.print(length_mm);
Serial.println(" mm");
lastPrintTime = millis();
}
delay(50);
}