#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL628lbMvRc"
#define BLYNK_TEMPLATE_NAME "Smart Conveyor V1 2026"
#define BLYNK_AUTH_TOKEN "WN6KLqjDEa7ZA5nT_Vl8aeg8ceQFrxvF"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define BTN_IN 13
#define BTN_OUT 12
#define SERVO_PIN 25
#define RUNNING_SERVO_LED 26
#define ALARM_LED 27
Servo conveyorServo;
BlynkTimer timer;
unsigned long partCount = 0;
unsigned long startTime = 0;
bool conveyorRunning = false;
float cycleTime = 0;
float throughput = 0;
void sendData()
{
Blynk.virtualWrite(V0, partCount);
Blynk.virtualWrite(V1, cycleTime);
Blynk.virtualWrite(V2, throughput);
Blynk.virtualWrite(V3,
digitalRead(ALARM_LED));
Blynk.virtualWrite(V4,
digitalRead(RUNNING_SERVO_LED));
}
void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
pinMode(BTN_IN, INPUT); //INPUT_PULLUP
pinMode(BTN_OUT, INPUT); //INPUT_PULLUP
pinMode(ALARM_LED, OUTPUT);
pinMode(RUNNING_SERVO_LED, OUTPUT);
conveyorServo.attach(SERVO_PIN);
conveyorServo.write(0);
timer.setInterval(
2000L,
sendData);
}
void loop()
{
Blynk.run();
timer.run();
static bool oldIn = HIGH;
static bool oldOut = HIGH;
bool inState =
digitalRead(BTN_IN);
bool outState =
digitalRead(BTN_OUT);
// Produk masuk
if(oldIn == HIGH &&
inState == LOW)
{
startTime = millis();
conveyorRunning = true;
conveyorServo.write(90);
Serial.println(
"Part Enter");
}
// Produk keluar
if(oldOut == HIGH &&
outState == LOW)
{
if(conveyorRunning)
{
partCount++;
cycleTime =
(millis() -
startTime) / 1000.0;
throughput =
3600.0 /
cycleTime;
conveyorRunning =
false;
conveyorServo.write(0);
digitalWrite(
ALARM_LED,
LOW);
digitalWrite(
RUNNING_SERVO_LED,
HIGH);
Serial.println(
"Part Exit");
}
}
oldIn = inState;
oldOut = outState;
// Alarm macet
if(conveyorRunning &&
millis() - startTime >
10000)
{
digitalWrite(
ALARM_LED,
HIGH);
digitalWrite(
RUNNING_SERVO_LED,
LOW);
}
}