152 lines
3.8 KiB
C++
152 lines
3.8 KiB
C++
#include <PZEM004Tv30.h>
|
|
#include <WiFi.h>
|
|
#include <PubSubClient.h>
|
|
#include <Wire.h>
|
|
|
|
#define RELAY_PIN1 2
|
|
#define RELAY_PIN2 15
|
|
#define MQTT_SERVER "192.168.100.77"
|
|
#define MQTT_PORT 1883
|
|
#define MQTT_TOPIC_BIAYA "home/biaya"
|
|
#define MQTT_TOPIC_PZEMOUT1 "pzemout1/voltage"
|
|
#define MQTT_TOPIC_PZEMOUT2 "pzemout2/current"
|
|
#define MQTT_TOPIC_PZEMOUT3 "pzemout3/power"
|
|
#define MQTT_TOPIC_PZEMOUT4 "pzemout4/energy"
|
|
#define WIFI_SSID "KOSAN KAMAR DEPAN"
|
|
#define WIFI_PASSWORD "ngoooook"
|
|
#define MQTT_TOPIC_RELAY1 "home/relay1"
|
|
#define MQTT_TOPIC_RELAY2 "home/relay2"
|
|
bool relayState1 = false;
|
|
bool relayState2 = false;
|
|
WiFiClient espClient;
|
|
PubSubClient client(espClient);
|
|
|
|
#if !defined(PZEM_RX_PIN) && !defined(PZEM_TX_PIN)
|
|
#define PZEM_RX_PIN 14
|
|
#define PZEM_TX_PIN 12
|
|
#endif
|
|
|
|
#if !defined(PZEM_SERIAL)
|
|
#define PZEM_SERIAL Serial2
|
|
#endif
|
|
|
|
#if defined(ESP32)
|
|
PZEM004Tv30 pzem(PZEM_SERIAL, PZEM_RX_PIN, PZEM_TX_PIN);
|
|
#elif defined(ESP8266)
|
|
#else
|
|
PZEM004Tv30 pzem(PZEM_SERIAL);
|
|
#endif
|
|
|
|
long time_1 = 0;
|
|
int interval = 500;
|
|
|
|
void callback(char* topic, byte* payload, unsigned int length) {
|
|
String message = "";
|
|
for (int i = 0; i < length; i++) {
|
|
message += (char)payload[i];
|
|
}
|
|
|
|
Serial.print("Message arrived [");
|
|
Serial.print(topic);
|
|
Serial.print("] ");
|
|
Serial.println(message);
|
|
if (strcmp(topic, MQTT_TOPIC_RELAY1) == 0) {
|
|
if (message == "ON") {
|
|
digitalWrite(RELAY_PIN1, LOW);
|
|
relayState1 = true;
|
|
} else if (message == "OFF") {
|
|
digitalWrite(RELAY_PIN1, HIGH);
|
|
relayState1 = false;
|
|
}
|
|
} else if (strcmp(topic, MQTT_TOPIC_RELAY2) == 0) {
|
|
if (message == "ON") {
|
|
digitalWrite(RELAY_PIN2, LOW);
|
|
relayState2 = true;
|
|
} else if (message == "OFF") {
|
|
digitalWrite(RELAY_PIN2, HIGH);
|
|
relayState2 = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
|
Serial.print("Connecting");
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
Serial.print(".");
|
|
delay(500);
|
|
}
|
|
Serial.println("\nConnected to WiFi");
|
|
|
|
pinMode(RELAY_PIN1, OUTPUT);
|
|
digitalWrite(RELAY_PIN1, HIGH);
|
|
pinMode(RELAY_PIN2, OUTPUT);
|
|
digitalWrite(RELAY_PIN2, HIGH);
|
|
|
|
client.setServer(MQTT_SERVER, MQTT_PORT);
|
|
client.setCallback(callback);
|
|
|
|
reconnect();
|
|
}
|
|
|
|
void loop() {
|
|
if (!client.connected()) {
|
|
reconnect();
|
|
}
|
|
client.loop();
|
|
kirimData();
|
|
}
|
|
|
|
void kirimData() {
|
|
if (millis() >= time_1 + interval) {
|
|
time_1 = millis();
|
|
Serial.print("Kamar :");
|
|
Serial.println(pzem.readAddress(), HEX);
|
|
|
|
float voltage = pzem.voltage();
|
|
float current = pzem.current();
|
|
float power = pzem.power();
|
|
float energy = pzem.energy();
|
|
float tarifPerKWh = 1444;
|
|
float biaya = (energy * tarifPerKWh);
|
|
|
|
client.publish(MQTT_TOPIC_PZEMOUT1, String(voltage).c_str());
|
|
client.publish(MQTT_TOPIC_PZEMOUT2, String(current).c_str());
|
|
client.publish(MQTT_TOPIC_PZEMOUT3, String(power).c_str());
|
|
client.publish(MQTT_TOPIC_PZEMOUT4, String(energy, 3).c_str());
|
|
client.publish(MQTT_TOPIC_BIAYA, String(biaya).c_str());
|
|
|
|
Serial.print("Voltage: ");
|
|
Serial.print(voltage);
|
|
Serial.println("V");
|
|
Serial.print("Current: ");
|
|
Serial.print(current);
|
|
Serial.println("A");
|
|
Serial.print("Power: ");
|
|
Serial.print(power);
|
|
Serial.println("W");
|
|
Serial.print("Energy: ");
|
|
Serial.print(energy, 3);
|
|
Serial.println("kWh");
|
|
Serial.print("Biaya: Rp. ");
|
|
Serial.println(biaya);
|
|
}
|
|
}
|
|
|
|
void reconnect() {
|
|
while (!client.connected()) {
|
|
Serial.print("Connecting to MQTT broker...");
|
|
if (client.connect("ESP321_Client")) {
|
|
Serial.println("connected");
|
|
client.subscribe(MQTT_TOPIC_RELAY1);
|
|
client.subscribe(MQTT_TOPIC_RELAY2);
|
|
} else {
|
|
Serial.print("failed, rc=");
|
|
Serial.print(client.state());
|
|
Serial.println(" retrying in 5 seconds");
|
|
delay(5000);
|
|
}
|
|
}
|
|
}
|