#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <PZEM004Tv30.h>
// Definisi pin untuk TFT display dan relay
#define TFT_CS 5
#define TFT_DC 22
#define TFT_RST 21
#define RELAY_PIN 18
#define LAMP1_PIN 32
#define LAMP2_PIN 33
// Inisialisasi TFT display
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Inisialisasi PZEM-004T
PZEM004Tv30 pzem(Serial2, 16, 17); // Tentukan port serial dan pin yang digunakan untuk RX dan TX
void setup() {
// Inisialisasi Serial
Serial.begin(115200);
Serial2.begin(9600); // Inisialisasi Serial2 untuk PZEM-004T
// Inisialisasi TFT display
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
// Inisialisasi Relay
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Mulai dengan relay mati
// Inisialisasi Pin Lampu
pinMode(LAMP1_PIN, OUTPUT);
pinMode(LAMP2_PIN, OUTPUT);
digitalWrite(LAMP1_PIN, LOW);
digitalWrite(LAMP2_PIN, LOW);
// Inisialisasi PZEM-004T
pzem.setAddress(0x01);
}
void loop() {
// Membaca data dari PZEM-004T
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float energy = pzem.energy();
float frequency = pzem.frequency();
float pf = pzem.pf();
// Debug print untuk memverifikasi pembacaan sensor
Serial.print("Tegangan: ");
Serial.print(voltage);
Serial.println(" V");
Serial.print("Arus: ");
Serial.print(current);
Serial.println(" A");
Serial.print("Daya: ");
Serial.print(power);
Serial.println(" W");
Serial.print("Energi: ");
Serial.print(energy);
Serial.println(" Wh");
Serial.print("Frekuensi: ");
Serial.print(frequency);
Serial.println(" Hz");
Serial.print("PF: ");
Serial.println(pf);
// Perbarui tampilan TFT
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.print("Tegangan: ");
tft.print(voltage);
tft.println(" V");
tft.print("Arus: ");
tft.print(current);
tft.println(" A");
tft.print("Daya: ");
tft.print(power);
tft.println(" W");
tft.print("Energi: ");
tft.print(energy);
tft.println(" Wh");
tft.print("Frekuensi: ");
tft.print(frequency);
tft.println(" Hz");
tft.print("PF: ");
tft.print(pf);
// Logika kontrol relay dan lampu
if (voltage > 100) {
Serial.println("Tegangan di atas 230V, mengaktifkan relay dan lampu.");
digitalWrite(RELAY_PIN, HIGH); // Nyalakan relay
digitalWrite(LAMP1_PIN, HIGH); // Nyalakan Lampu 1
digitalWrite(LAMP2_PIN, HIGH); // Nyalakan Lampu 2
} else {
Serial.println("Tegangan di bawah 230V, mematikan relay dan lampu.");
digitalWrite(RELAY_PIN, LOW); // Matikan relay
digitalWrite(LAMP1_PIN, LOW); // Matikan Lampu 1
digitalWrite(LAMP2_PIN, LOW); // Matikan Lampu 2
}
delay(1000); // Perbarui setiap detik
}