Anak Kendali
6 min readDec 10, 2022

--

Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT
Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT

Sistem kerja Monitoring Tegangan dan Arus Listrik AC 3 Phase

Tutorial Lengkap Monitoring Listrik AC 3 fase

Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT
Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT
Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT
Tutorial Arduino Monitoring Daya Listrik AC 3 Phase Berbasis Web IoT
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h" // Include Emon Library
EnergyMonitor emon1; // Create an instance

void setup()
{
Serial.begin(9600);

emon1.current(1, 111.1); // Current: input pin, calibration.
}

void loop()
{
double Irms = emon1.calcIrms(1480); // Calculate Irms only

Serial.print(Irms*230.0); // Apparent power
Serial.print(" ");
Serial.println(Irms); // Irms
}
float vAC(int pin) {
uint32_t periode = 1000000 / 50;
uint32_t t_start = micros();

uint32_t Vsum = 0, count = 0;
int32_t Vnow;

while (micros() - t_start < periode) {
Vnow = analogRead(pin) - 512;
Vsum += Vnow*Vnow;
count++;
}

float Vrms = sqrt(Vsum / count) / 1023 * 5.0;
Vrms = 589.7*Vrms - 23.59;

if (Vrms < 0) Vrms = 0;

return Vrms;
}
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
SoftwareSerial Serial_1(3, 2);

LiquidCrystal_I2C lcd(0x27, 16, 2);

#include "EmonLib.h"

EnergyMonitor Ar, As, At;

#define pinIR A0
#define pinIS A1
#define pinIT A2

#define pinVR A3
#define pinVS A6
#define pinVT A7

int zp_R, zp_S, zp_T;
int tegangan_R, tegangan_S, tegangan_T;
float arus_R, arus_S, arus_T; // ubah ke int jika tidak mau ada koma

boolean d = 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial_1.begin(9600);
lcd.begin();

Ar.current(pinIR, 45); // ubah untuk kalibrasi
As.current(pinIS, 40); // ubah untuk kalibrasi
At.current(pinIT, 45); // ubah untuk kalibrasi

lcd.setCursor (0, 0);
lcd.print("Monitoring VI");
lcd.setCursor (0, 1);
lcd.print("-Tunggu bentar-");
delay(2000);

}

void loop() {
// put your main code here, to run repeatedly:
lcd.clear();
tegangan_R = vAC(pinVR);
tegangan_S = vAC(pinVS);
tegangan_T = vAC(pinVT);
arus_R = Ar.calcIrms(1480);
arus_S = As.calcIrms(1480);
arus_T = At.calcIrms(1480);

send_esp();
display_serial();
display_lcd();
delay(500);
}

void display_lcd() {
if (d == 0) {
lcd.setCursor (0 + 1, 0);
lcd.print("V_R");
lcd.setCursor (0 + 1, 1);
lcd.print(tegangan_R);
lcd.setCursor (5 + 1, 0);
lcd.print("V_S");
lcd.setCursor (5 + 1, 1);
lcd.print(tegangan_S);
lcd.setCursor (10 + 1, 0);
lcd.print("V_T");
lcd.setCursor (10 + 1, 1);
lcd.print(tegangan_T);
d = 1;
}
else {
lcd.setCursor (0 + 1, 0);
lcd.print("I_R");
lcd.setCursor (0 + 1, 1);
lcd.print(arus_R);
lcd.setCursor (5 + 1, 0);
lcd.print("I_S");
lcd.setCursor (5 + 1, 1);
lcd.print(arus_S);
lcd.setCursor (10 + 1, 0);
lcd.print("I_T");
lcd.setCursor (10 + 1, 1);
lcd.print(arus_T);
d = 0;
}
}

void send_esp() {
Serial_1.print(tegangan_R);
Serial_1.print("|");
Serial_1.print(tegangan_S);
Serial_1.print("|");
Serial_1.print(tegangan_T);
Serial_1.print("|");
Serial_1.print(arus_R);
Serial_1.print("|");
Serial_1.print(arus_S);
Serial_1.print("|");
Serial_1.print(arus_T);
Serial_1.println();
}

void display_serial() {
Serial.print("Teg R : ");
Serial.print(tegangan_R);
Serial.print("\tTeg S : ");
Serial.print(tegangan_S);
Serial.print("\tTeg T : ");
Serial.print(tegangan_T);

Serial.print("\tArus R : ");
Serial.print(arus_R);
Serial.print("\tArus S : ");
Serial.print(arus_S);
Serial.print("\tArus T : ");
Serial.print(arus_T);
Serial.println();
}
#include <SoftwareSerial.h>
SoftwareSerial Serial2(D1, D2);
#include <ESP8266WiFi.h>
#include <ESP8266WiFiClient.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

const char *ssid = "BOLT! SUPER 4G-D8E1"; //Nama Wifi
const char *password = "B6D5D8E1"; // pass wifi

int index1, index2, index3, index4, index5;

int vR, vS, vT;
float iR, iS, iT;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial2.begin(9600); // gpio 17 dan 16
WiFi.mode(WIFI_STA);

WiFi.begin(ssid, password);
Serial.println("");

Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode (D4, OUTPUT);
digitalWrite(D4, 1);
}

void loop() {
// put your main code here, to run repeatedly:
String dd;
while (Serial2.available()) {
delay(10);
char c = Serial2.read();
dd += c;
}
if (dd.length() > 0) {
Serial.print(dd);
index1 = dd.indexOf('|');
index2 = dd.indexOf('|', index1 + 1);
index3 = dd.indexOf('|', index2 + 1);
index4 = dd.indexOf('|', index3 + 1);
index5 = dd.indexOf('|', index4 + 1);

vR = dd.substring (0, index1).toInt();
vS = dd.substring (index1 + 1, index2).toInt();
vT = dd.substring (index2 + 1, index3).toInt();

iR = dd.substring (index3 + 1, index4).toFloat();
iS = dd.substring (index4 + 1, index5).toFloat();
iT = dd.substring (index5 + 1).toFloat();
Serial.println(vR);
Serial.println(vS);
Serial.println(vT);
Serial.println(iR);
Serial.println(iS);
Serial.println(iT);
kirim_data(vR, vS, vT, iR, iS, iT);
}
}

void kirim_data(int r, int s, int t, float ir, float is, float it) {

String postData = (String)"vr=" + r + "&vs=" + s + "&vt=" + t +
"&ir=" + ir + "&is=" + is + "&it=" + it;
String url = "http://192.168.1.137/monitoringlistrik/api.php?";
url += postData;

HTTPClient http;
http.begin(url);
auto httpCode = http.GET();
String payload = http.getString();

Serial.println(url);
Serial.println(payload);
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();
int led = doc["lampu"];
digitalWrite(D4, !led);
Serial.println(led);
http.end();
}

Kesimpulan

--

--