Translate

ATS (Automatic Transfer Switch) berbasis ESP32 IOT Blynk

ATS (Automatic Transfer Switch) berbasis ESP32 IOT Blynk

    ATS (Automatic Transfer Switch) berbasis ESP32 merupakan prototipe sistem perpindahan sumber listrik secara otomatis dari PLN ke genset ketika pasokan listrik PLN mengalami gangguan atau pemadaman. Sistem ini menggunakan mikrokontroler ESP32 sebagai pusat kendali untuk membaca kondisi sumber listrik, mengatur proses penyalaan genset melalui driver, serta mengendalikan perpindahan sumber listrik menggunakan relay. Tujuan utamanya adalah menjaga agar beban atau instalasi listrik tetap mendapatkan suplai daya ketika sumber listrik utama mengalami pemadaman.

Sistem bekerja melalui beberapa tahapan:

  1. Kondisi normal: ESP32 mendeteksi bahwa listrik PLN tersedia. Sistem mempertahankan sumber PLN sebagai sumber utama.

  2. PLN padam: Jika listrik PLN tidak tersedia selama 1,5 detik, ESP32 mengonfirmasi terjadinya pemadaman.

  3. Genset dinyalakan: ESP32 mengirimkan perintah kepada driver starter untuk memulai proses penyalaan genset.

  4. Pemeriksaan genset: Sistem menunggu hingga sumber genset terdeteksi stabil selama 8 detik.

  5. Perpindahan sumber: Setelah genset stabil, sistem memberikan jeda perpindahan selama 1 detik sebelum mengaktifkan jalur genset.

  6. PLN kembali: Sistem menunggu hingga PLN stabil selama 20 detik sebelum memulai proses perpindahan kembali.

  7. Cooldown: Setelah kembali menggunakan PLN, sistem menjalankan waktu pendinginan genset selama 60 detik sebelum menyelesaikan proses.


1. Skema



2. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL67BudExxx"
#define BLYNK_TEMPLATE_NAME "monitor arus tegangan"
#define BLYNK_AUTH_TOKEN "a4sgOvXoyxVJ1LmTqXdl_oSL0WrZSXXX"
#define BLYNK_PRINT Serial  

#include <Wire.h>
#include <HardwareSerial.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PZEM004Tv30.h>
#include <LiquidCrystal_I2C.h> 
#define RXD2 16
#define TXD2 17

LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 20 chars and 4 line display
 
PZEM004Tv30 pzem(&Serial);  //(RX,TX) connect to TX,RX of PZEM
PZEM004Tv30 pzem2(&Serial2);  //(RX,TX) connect to TX,RX of PZEM

float voltage1;
float current1;
float power1;
int freq1;
int tanda;

float voltage2;
float current2;
float power2;
int freq2;

int relay1 = 33; //relay interlok
int relay2 = 32; //relay genset
int relay3 = 34; //relay interlok
int relay4 = 35; //relay genset

int buzzer = 14;

int led1 = 25;
int led2 = 26;
int led3 = 27;

BlynkTimer timer;

char ssid[] = "hotspothpku";
char pass[] = "123456789";

void sendSensor()
{
 Blynk.virtualWrite(V0, voltage1);
 Blynk.virtualWrite(V1, current1);
 Blynk.virtualWrite(V2, power1);
 Blynk.virtualWrite(V3, freq1);

 Blynk.virtualWrite(V4, voltage2);
 Blynk.virtualWrite(V5, current2);
 Blynk.virtualWrite(V6, power2);
 Blynk.virtualWrite(V7, freq2);
 
 delay(1000);
}

void setup() {

  Serial.begin(9600); 
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  
  lcd.begin();  
  lcd.clear();
  lcd.noCursor(); 

  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  
  pinMode(buzzer,OUTPUT);
  pinMode(relay1,OUTPUT);
  pinMode(relay2,OUTPUT);
  pinMode(relay3,OUTPUT);
  pinMode(relay4,OUTPUT);
  
  digitalWrite(relay1,HIGH);
  digitalWrite(relay2,HIGH);
  digitalWrite(relay3,HIGH);
  digitalWrite(relay4,HIGH);
  
  digitalWrite(led1,HIGH);
  digitalWrite(buzzer,LOW);
  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, sendSensor);
}

void loop() {

voltage1 = pzem.voltage();
current1 = pzem.current();
power1 = pzem.power();
freq1 = pzem.frequency();

voltage2 = pzem2.voltage();
current2 = pzem2.current();
power2 = pzem2.power();
freq2 = pzem2.frequency();

lcd.setCursor(0,0);
lcd.print(voltage1);
lcd.print("/");
lcd.print(voltage2);
lcd.print("  ");

//jika pln on awal
if((voltage1 > 100)&&(tanda == 0)){
lcd.setCursor(0,1);   
lcd.print("PLN ON ");  
digitalWrite(relay1,HIGH); // interlok off 
digitalWrite(relay2,HIGH); // genset off
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
}

//jika pln on kedua
if((voltage1 > 100)&&(tanda == 1)){
tanda = 0;  
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
lcd.setCursor(0,1);   
lcd.print("PLN ON ");  
digitalWrite(relay1,HIGH); // interlok off
delay(15000); 
digitalWrite(relay2,HIGH); // genset off
}

//jika pln padam maka genset on
if((voltage1 < 100)&&(tanda == 0)){
lcd.setCursor(0,1);   
lcd.print("PLN OFF");
digitalWrite(relay1,HIGH); // interlok off 
digitalWrite(relay2,LOW); // genset on
digitalWrite(led2,LOW); //indikator interlok
//digitalWrite(buzzer,HIGH);  
tanda = 1;
digitalWrite(led2,HIGH);
delay(10000);
}

//jika genset udah siap maka interlok on 
if(voltage2 > 200){
lcd.setCursor(8,1);   
lcd.print(" GEN ON ");
digitalWrite(relay1,LOW); // interlok on 
digitalWrite(relay2,LOW); // genset on  
digitalWrite(led3,HIGH);
}

if(voltage2 < 100){
lcd.setCursor(8,1);   
lcd.print(" GEN OFF");  
digitalWrite(relay1,HIGH); // interlok off 
digitalWrite(relay2,LOW); // genset on
digitalWrite(led3,LOW);
}

Blynk.run();
timer.run();  
delay(100);
}



3. Gambar Aplikasinya di Lapangan



No comments:

Post a Comment