Digital Insulation Leakage Tester
Digital Insulation Leakage Tester merupakan sebuah sistem elektronik berbasis mikrokontroler ESP32 yang dirancang untuk memantau dan mengukur arus kebocoran (leakage current) pada suatu objek atau peralatan listrik. Sistem ini menggunakan sensor penguat sinyal AD620 untuk mengolah sinyal pengukuran arus yang sangat kecil. Hasil pengukuran kemudian diproses oleh ESP32 dan ditampilkan secara langsung melalui LCD I2C 20x4. Pengguna dapat memilih mode pengujian 500 VDC atau 1000 VDC melalui selektor. Sistem selanjutnya menampilkan nilai arus kebocoran dan menentukan kondisi isolasi berdasarkan batas arus yang telah ditetapkan.
1. Skema
2. Program Arduino IDE
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// =====================================
// ESP32 DIGITAL INSULATION LEAKAGE TESTER
// AD620 + LCD I2C 20x4
// =====================================
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// PIN ESP32
#define ADC_PIN 34
#define SELECT_500 25
#define SELECT_1000 26
// PARAMETER PENGUKURAN
const float R_SHUNT = 1000.0; // Ohm
const float RG = 33000.0; // Ohm
const float GAIN = 1.0 + (49400.0 / RG);
// Tegangan output AD620 ketika input diferensial nol.
// Ukur dengan multimeter, lalu sesuaikan nilai ini.
const float VZERO_MV = 1650.0;
// Batas arus kebocoran
const float LEAK_LIMIT_MA = 0.500;
// Jumlah sampel ADC
const int NUM_SAMPLES = 64;
// =====================================
// MEMBACA ADC RATA-RATA
// =====================================
float readAD620mV() {
uint32_t total = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
total += analogReadMilliVolts(ADC_PIN);
delay(2);
}
return (float)total / NUM_SAMPLES;
}
// =====================================
// MEMBACA SELEKTOR TEGANGAN
// Kontak bantu aktif LOW
// =====================================
String readVoltageSelection() {
bool select500 = (digitalRead(SELECT_500) == LOW);
bool select1000 = (digitalRead(SELECT_1000) == LOW);
if (select500 && !select1000) {
return "500 VDC";
}
if (select1000 && !select500) {
return "1000 VDC";
}
return "NOT SELECTED";
}
// =====================================
// TAMPILAN LCD
// =====================================
void printLine(int row, String message) {
lcd.setCursor(0, row);
lcd.print(" ");
lcd.setCursor(0, row);
lcd.print(message);
}
// =====================================
// SETUP
// =====================================
void setup() {
Serial.begin(115200);
pinMode(SELECT_500, INPUT_PULLUP);
pinMode(SELECT_1000, INPUT_PULLUP);
analogReadResolution(12);
analogSetPinAttenuation(ADC_PIN, ADC_11db);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" DIGITAL INSULATION");
lcd.setCursor(0, 1);
lcd.print(" LEAKAGE TESTER");
lcd.setCursor(0, 2);
lcd.print(" ESP32 + AD620");
lcd.setCursor(0, 3);
lcd.print(" Initializing...");
delay(2000);
lcd.clear();
}
// =====================================
// LOOP UTAMA
// =====================================
void loop() {
// Baca tegangan selektor
String voltage = readVoltageSelection();
// Tampilkan tegangan pengujian
printLine(0, "TEST: " + voltage);
if (voltage == "NOT SELECTED") {
printLine(1, "Select 500/1000 V");
printLine(2, "Leakage: --- mA");
printLine(3, "Status: STANDBY");
delay(500);
return;
}
// Baca output AD620
float output_mV = readAD620mV();
// Proteksi pembacaan ADC di luar rentang
if (output_mV >= 3200.0) {
printLine(1, "ADC OVER RANGE!");
printLine(2, "Check AD620 output");
printLine(3, "Status: ERROR");
Serial.println("ADC OVER RANGE");
delay(500);
return;
}
// Konversi output AD620 menjadi tegangan shunt
float vShunt =
(output_mV - VZERO_MV) / 1000.0 / GAIN;
// Konversi tegangan shunt menjadi arus (mA)
float leakage_mA =
(vShunt / R_SHUNT) * 1000.0;
// Koreksi noise negatif saat nol
if (leakage_mA < 0.0) {
leakage_mA = 0.0;
}
// Tentukan status kebocoran
bool leakageDetected =
(leakage_mA > LEAK_LIMIT_MA);
// =================================
// TAMPILKAN HASIL PADA LCD
// =================================
printLine(1, "Leak: " +
String(leakage_mA, 3) + " mA");
printLine(2, "Limit: 0.500 mA");
if (leakageDetected) {
printLine(3, "STATUS: BOCOR");
} else {
printLine(3, "STATUS: TIDAK BOCOR");
}
// =================================
// SERIAL MONITOR
// =================================
Serial.println("======================");
Serial.print("Voltage: ");
Serial.println(voltage);
Serial.print("AD620 Output: ");
Serial.print(output_mV);
Serial.println(" mV");
Serial.print("Leakage Current: ");
Serial.print(leakage_mA, 3);
Serial.println(" mA");
Serial.print("Status: ");
if (leakageDetected) {
Serial.println("BOCOR");
} else {
Serial.println("TIDAK BOCOR");
}
delay(300);
}
// =====================================
// ESP32 DIGITAL INSULATION LEAKAGE TESTER
// AD620 + LCD I2C 20x4
// =====================================
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// PIN ESP32
#define ADC_PIN 34
#define SELECT_500 25
#define SELECT_1000 26
// PARAMETER PENGUKURAN
const float R_SHUNT = 1000.0; // Ohm
const float RG = 33000.0; // Ohm
const float GAIN = 1.0 + (49400.0 / RG);
// Tegangan output AD620 ketika input diferensial nol.
// Ukur dengan multimeter, lalu sesuaikan nilai ini.
const float VZERO_MV = 1650.0;
// Batas arus kebocoran
const float LEAK_LIMIT_MA = 0.500;
// Jumlah sampel ADC
const int NUM_SAMPLES = 64;
// =====================================
// MEMBACA ADC RATA-RATA
// =====================================
float readAD620mV() {
uint32_t total = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
total += analogReadMilliVolts(ADC_PIN);
delay(2);
}
return (float)total / NUM_SAMPLES;
}
// =====================================
// MEMBACA SELEKTOR TEGANGAN
// Kontak bantu aktif LOW
// =====================================
String readVoltageSelection() {
bool select500 = (digitalRead(SELECT_500) == LOW);
bool select1000 = (digitalRead(SELECT_1000) == LOW);
if (select500 && !select1000) {
return "500 VDC";
}
if (select1000 && !select500) {
return "1000 VDC";
}
return "NOT SELECTED";
}
// =====================================
// TAMPILAN LCD
// =====================================
void printLine(int row, String message) {
lcd.setCursor(0, row);
lcd.print(" ");
lcd.setCursor(0, row);
lcd.print(message);
}
// =====================================
// SETUP
// =====================================
void setup() {
Serial.begin(115200);
pinMode(SELECT_500, INPUT_PULLUP);
pinMode(SELECT_1000, INPUT_PULLUP);
analogReadResolution(12);
analogSetPinAttenuation(ADC_PIN, ADC_11db);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" DIGITAL INSULATION");
lcd.setCursor(0, 1);
lcd.print(" LEAKAGE TESTER");
lcd.setCursor(0, 2);
lcd.print(" ESP32 + AD620");
lcd.setCursor(0, 3);
lcd.print(" Initializing...");
delay(2000);
lcd.clear();
}
// =====================================
// LOOP UTAMA
// =====================================
void loop() {
// Baca tegangan selektor
String voltage = readVoltageSelection();
// Tampilkan tegangan pengujian
printLine(0, "TEST: " + voltage);
if (voltage == "NOT SELECTED") {
printLine(1, "Select 500/1000 V");
printLine(2, "Leakage: --- mA");
printLine(3, "Status: STANDBY");
delay(500);
return;
}
// Baca output AD620
float output_mV = readAD620mV();
// Proteksi pembacaan ADC di luar rentang
if (output_mV >= 3200.0) {
printLine(1, "ADC OVER RANGE!");
printLine(2, "Check AD620 output");
printLine(3, "Status: ERROR");
Serial.println("ADC OVER RANGE");
delay(500);
return;
}
// Konversi output AD620 menjadi tegangan shunt
float vShunt =
(output_mV - VZERO_MV) / 1000.0 / GAIN;
// Konversi tegangan shunt menjadi arus (mA)
float leakage_mA =
(vShunt / R_SHUNT) * 1000.0;
// Koreksi noise negatif saat nol
if (leakage_mA < 0.0) {
leakage_mA = 0.0;
}
// Tentukan status kebocoran
bool leakageDetected =
(leakage_mA > LEAK_LIMIT_MA);
// =================================
// TAMPILKAN HASIL PADA LCD
// =================================
printLine(1, "Leak: " +
String(leakage_mA, 3) + " mA");
printLine(2, "Limit: 0.500 mA");
if (leakageDetected) {
printLine(3, "STATUS: BOCOR");
} else {
printLine(3, "STATUS: TIDAK BOCOR");
}
// =================================
// SERIAL MONITOR
// =================================
Serial.println("======================");
Serial.print("Voltage: ");
Serial.println(voltage);
Serial.print("AD620 Output: ");
Serial.print(output_mV);
Serial.println(" mV");
Serial.print("Leakage Current: ");
Serial.print(leakage_mA, 3);
Serial.println(" mA");
Serial.print("Status: ");
if (leakageDetected) {
Serial.println("BOCOR");
} else {
Serial.println("TIDAK BOCOR");
}
delay(300);
}
3. Gambar Instalasi di Lapangan



No comments:
Post a Comment