#define BLYNK_TEMPLATE_ID "TMPL6ZFmQVMWc"
#define BLYNK_TEMPLATE_NAME "MONITORING DHT22"
#define BLYNK_AUTH_TOKEN "3ogYwUwNSrZCkAcKkTVAVNQjhDe_tgj5"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PZEM004Tv30.h>
// ================= WIFI =================
char ssid[] = "wokwi-GUEST";
char pass[] = "e06122004";
// ================= DHT22 =================
#define DHTPIN1 15
#define DHTPIN2 16
#define DHTTYPE DHT22
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
// ================= DS18B20 =================
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// ================= PZEM =================
PZEM004Tv30 pzem(Serial2, 26, 27);
// ================= RELAY =================
#define RELAY_PIN 5
// ================= LCD =================
LiquidCrystal_I2C lcd(0x27, 20, 4);
// ================= VARIABEL =================
float t1=0, t2=0, t3=0, t4=0;
float dhtTemp1=0, dhtHum1=0;
float dhtTemp2=0, dhtHum2=0;
float voltage=0, current=0, power=0, energy=0;
// backup nilai terakhir (anti error)
float last_t1, last_t2, last_t3, last_t4;
float last_dhtTemp1, last_dhtHum1, last_dhtTemp2, last_dhtHum2;
float last_voltage, last_current, last_power, last_energy;
int displayMode = 0;
unsigned long lastSwitch = 0;
// relay protection
unsigned long lastRelayChange = 0;
int relayState = 0;
// ================= BLYNK RELAY =================
BLYNK_WRITE(V0) {
int state = param.asInt();
// proteksi 1 detik
if (millis() - lastRelayChange > 1000) {
relayState = state;
digitalWrite(RELAY_PIN, relayState);
lastRelayChange = millis();
}
}
// ================= SETUP =================
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
dht1.begin();
dht2.begin();
sensors.begin();
lcd.init();
lcd.backlight();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}
// ================= LOOP =================
void loop() {
Blynk.run();
bacaSensor();
tampilLCD();
kirimBlynk();
}
// ================= BACA SENSOR =================
void bacaSensor() {
// ===== DHT22 =====
float tA = dht1.readTemperature();
float hA = dht1.readHumidity();
float tB = dht2.readTemperature();
float hB = dht2.readHumidity();
if (!isnan(tA)) { dhtTemp1 = tA; last_dhtTemp1 = tA; }
else dhtTemp1 = last_dhtTemp1;
if (!isnan(hA)) { dhtHum1 = hA; last_dhtHum1 = hA; }
else dhtHum1 = last_dhtHum1;
if (!isnan(tB)) { dhtTemp2 = tB; last_dhtTemp2 = tB; }
else dhtTemp2 = last_dhtTemp2;
if (!isnan(hB)) { dhtHum2 = hB; last_dhtHum2 = hB; }
else dhtHum2 = last_dhtHum2;
// ===== DS18B20 =====
sensors.requestTemperatures();
float temp0 = sensors.getTempCByIndex(0);
float temp1 = sensors.getTempCByIndex(1);
float temp2 = sensors.getTempCByIndex(2);
float temp3 = sensors.getTempCByIndex(3);
if (temp0 != DEVICE_DISCONNECTED_C) { t1 = temp0; last_t1 = temp0; }
else t1 = last_t1;
if (temp1 != DEVICE_DISCONNECTED_C) { t2 = temp1; last_t2 = temp1; }
else t2 = last_t2;
if (temp2 != DEVICE_DISCONNECTED_C) { t3 = temp2; last_t3 = temp2; }
else t3 = last_t3;
if (temp3 != DEVICE_DISCONNECTED_C) { t4 = temp3; last_t4 = temp3; }
else t4 = last_t4;
// ===== PZEM =====
float v = pzem.voltage();
float c = pzem.current();
float p = pzem.power();
float e = pzem.energy();
if (!isnan(v)) { voltage = v; last_voltage = v; }
else voltage = last_voltage;
if (!isnan(c)) { current = c; last_current = c; }
else current = last_current;
if (!isnan(p)) { power = p; last_power = p; }
else power = last_power;
if (!isnan(e)) { energy = e; last_energy = e; }
else energy = last_energy;
}
// ================= LCD =================
void tampilLCD() {
if (millis() - lastSwitch > 4000) {
displayMode++;
if (displayMode > 2) displayMode = 0;
lcd.clear();
lastSwitch = millis();
}
switch (displayMode) {
case 0:
lcd.setCursor(0, 0);
lcd.print("DHT22 SENSOR");
lcd.setCursor(0, 1);
lcd.printf("T1:%.1fC H1:%.1f", dhtTemp1, dhtHum1);
lcd.setCursor(0, 2);
lcd.printf("T2:%.1fC H2:%.1f", dhtTemp2, dhtHum2);
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("DS18B20 TEMP");
lcd.setCursor(0, 1);
lcd.printf("T1:%.1f T2:%.1f", t1, t2);
lcd.setCursor(0, 2);
lcd.printf("T3:%.1f T4:%.1f", t3, t4);
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("ENERGY METER");
lcd.setCursor(0, 1);
lcd.printf("V:%.1f I:%.2f", voltage, current);
lcd.setCursor(0, 2);
lcd.printf("P:%.1fW", power);
lcd.setCursor(0, 3);
lcd.printf("E:%.2fkWh", energy);
break;
}
}
// ================= BLYNK =================
void kirimBlynk() {
Blynk.virtualWrite(V1, dhtTemp1);
Blynk.virtualWrite(V2, dhtHum1);
Blynk.virtualWrite(V3, dhtTemp2);
Blynk.virtualWrite(V4, dhtHum2);
Blynk.virtualWrite(V5, t1);
Blynk.virtualWrite(V6, t2);
Blynk.virtualWrite(V7, t3);
Blynk.virtualWrite(V8, t4);
Blynk.virtualWrite(V9, voltage);
Blynk.virtualWrite(V10, current);
Blynk.virtualWrite(V11, power);
Blynk.virtualWrite(V12, energy);
}