#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi pin
const int produksiPin = 2;
const int startDowntimePin = 3;
const int stopDowntimePin = 4;
const int startProduksiPin = 5;
const int stopProduksiPin = 6;
const int rejectQualityPin = 7;
unsigned long cycleTime = 0;
unsigned long startCycleTime = 0;
unsigned long downtime = 0;
unsigned long startDowntime = 0;
unsigned long produksiCount = 0;
unsigned long rejectCount = 0;
unsigned long startProductionTime = 0;
unsigned long totalProductionTime = 0;
unsigned long targetProduksi = 100; // Target produksi
const float standarCycleTime = 9.0; // Cycle time standar dalam detik
bool produksiRunning = false;
bool produksiStopped = false;
bool downtimeRunning = false;
// Debouncing
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD I2C dengan alamat 0x27, 16 kolom dan 2 baris
void setup() {
pinMode(produksiPin, INPUT_PULLUP);
pinMode(startDowntimePin, INPUT_PULLUP);
pinMode(stopDowntimePin, INPUT_PULLUP);
pinMode(startProduksiPin, INPUT_PULLUP);
pinMode(stopProduksiPin, INPUT_PULLUP);
pinMode(rejectQualityPin, INPUT_PULLUP);
Serial.begin(9600);
lcd.begin(16, 2); // Inisialisasi LCD I2C dengan 16 kolom dan 2 baris
lcd.backlight();
}
void loop() {
int produksiButtonState = digitalRead(produksiPin);
// Debouncing produksi button
if (produksiButtonState == LOW && (millis() - lastDebounceTime) > debounceDelay) {
produksiCount++;
lastDebounceTime = millis();
delay(200); // Tambahan debounce untuk memastikan pembacaan yang stabil
}
if (digitalRead(startProduksiPin) == LOW && !produksiRunning && !produksiStopped) {
produksiRunning = true;
startCycleTime = millis();
startProductionTime = millis();
Serial.println("Produksi dimulai.");
lcd.setCursor(0, 0);
lcd.print("Produksi: ");
lcd.print(produksiCount);
delay(200); // Debounce
}
if (digitalRead(stopProduksiPin) == LOW && produksiRunning) {
produksiRunning = false;
produksiStopped = true;
cycleTime += millis() - startCycleTime;
totalProductionTime += millis() - startProductionTime;
Serial.println("Produksi berhenti.");
tampilkanOEE();
delay(200); // Debounce
}
if (digitalRead(startDowntimePin) == LOW && !downtimeRunning) {
downtimeRunning = true;
startDowntime = millis();
Serial.println("Downtime dimulai.");
delay(200); // Debounce
}
if (digitalRead(stopDowntimePin) == LOW && downtimeRunning) {
downtimeRunning = false;
downtime += millis() - startDowntime;
Serial.println("Downtime berhenti.");
delay(200); // Debounce
}
if (digitalRead(rejectQualityPin) == LOW) {
rejectCount++;
Serial.println("Reject Quality.");
delay(200); // Debounce
}
// Display data
if (millis() % 5000 < 50 && !produksiStopped) { // Setiap 5 detik
Serial.print("Produksi: ");
Serial.println(produksiCount);
Serial.print("Cycle Time: ");
Serial.println(cycleTime / 1000); // dalam detik
Serial.print("Downtime: ");
Serial.println(downtime / 1000); // dalam detik
// Hitung persentase target produksi
float persentasePencapaian = ((float)produksiCount / targetProduksi) * 100;
Serial.print("Pencapaian Target: ");
Serial.print(persentasePencapaian);
Serial.println("%");
// Update LCD
lcd.setCursor(0, 0);
lcd.print("Prod: ");
lcd.print(produksiCount);
lcd.print(" Tgt: ");
lcd.print(persentasePencapaian);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Down: ");
lcd.print(downtime / 1000);
lcd.print("s Rej: ");
lcd.print(rejectCount);
}
// Hitung OEE setiap 10 detik
if (millis() % 10000 < 50 && !produksiStopped) {
tampilkanOEE();
}
}
void tampilkanOEE() {
unsigned long totalTime = millis() / 1000; // dalam detik
if (totalTime > 0) {
float availability = ((float)(totalTime - downtime / 1000) / totalTime) * 100;
float performance = ((float)produksiCount / (totalTime / standarCycleTime)) * 100;
float quality = ((float)(produksiCount - rejectCount) / produksiCount) * 100;
float oee = (availability / 100) * (performance / 100) * (quality / 100) * 100;
Serial.print("Availability: ");
Serial.print(availability);
Serial.println("%");
Serial.print("Performance: ");
Serial.print(performance);
Serial.println("%");
Serial.print("Quality: ");
Serial.print(quality);
Serial.println("%");
Serial.print("OEE: ");
Serial.print(oee);
Serial.println("%");
// Update LCD
lcd.setCursor(0, 0);
lcd.print("Avail: ");
lcd.print(availability);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("OEE: ");
lcd.print(oee);
lcd.print("%");
}
}