dianartanto

baca_pzem

Feb 16th, 2026 (edited)
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 2.46 KB | Source Code | 0 0
  1. #include <PZEM004Tv30.h>
  2. #include <WiFi.h>
  3. #include <PubSubClient.h>
  4. #include <ArduinoJson.h>
  5. const char* ssid = ".............";      
  6. const char* password = "..............";  
  7. const char* mqtt_server = "................"; // Alamat IP Orange/RasPi
  8. WiFiClient espClient;
  9. PubSubClient client(espClient);
  10. PZEM004Tv30 pzem(Serial2, 16, 17);
  11. unsigned long saat_ini = 0;
  12. void setup_wifi() {
  13.   delay(10);
  14.   Serial.println();
  15.   Serial.print("Connecting to ");
  16.   Serial.println(ssid);
  17.   WiFi.begin(ssid, password);
  18.   while (WiFi.status() != WL_CONNECTED) {
  19.     delay(500);
  20.     Serial.print(".");
  21.   }
  22.   randomSeed(micros());
  23.   Serial.println("");
  24.   Serial.println("WiFi connected");
  25.   Serial.println("IP address: ");
  26.   Serial.println(WiFi.localIP());
  27. }
  28. void reconnect() {
  29.   while (!client.connected()) {
  30.     Serial.print("Attempting MQTT connection...");
  31.     String clientId = "ESP8266Client-";
  32.     clientId += String(random(0xffff), HEX);
  33.     if (client.connect(clientId.c_str())) {
  34.       Serial.println("connected");
  35.     } else {
  36.       Serial.print("failed, rc=");
  37.       Serial.print(client.state());
  38.       Serial.println(" try again in 5 seconds");
  39.       delay(5000);
  40.     }
  41.   }
  42. }
  43. void setup() {
  44.   Serial.begin(115200);
  45.   setup_wifi();
  46.   client.setServer(mqtt_server, 1883);
  47. }
  48. void loop() {
  49.   if (!client.connected()) {
  50.     reconnect();
  51.   }
  52.   client.loop();
  53.   if (millis() - saat_ini > 5000) {
  54.     // Baca nilai dari sensor PZEM
  55.     float tegangan = pzem.voltage();
  56.     float arus = pzem.current();
  57.     float daya = pzem.power();
  58.     float energi = pzem.energy();
  59.     // Periksa apakah pembacaan valid (tidak NaN)
  60.     if (isnan(tegangan) || isnan(arus) || isnan(daya) || isnan(energi)) {
  61.       Serial.println("Error reading PZEM");
  62.       saat_ini = millis();
  63.       return;
  64.     }
  65.     // Format angka menjadi string dengan 2 desimal
  66.     String teganganStr = String(tegangan, 2);
  67.     String arusStr = String(arus, 2);
  68.     String dayaStr = String(daya, 2);
  69.     String energiStr = String(energi, 2);
  70.     // Buat dokumen JSON dan gunakan serialized untuk mempertahankan format 2 desimal
  71.     StaticJsonDocument<128> doc;
  72.     doc["t"] = serialized(teganganStr);
  73.     doc["a"] = serialized(arusStr);
  74.     doc["d"] = serialized(dayaStr);
  75.     doc["e"] = serialized(energiStr);
  76.     char output[128];
  77.     serializeJson(doc, output);
  78.     Serial.println(output);
  79.     client.publish("/esp32/pzem", output); // Topik publisher
  80.     saat_ini = millis();
  81.   }
  82. }
Tags: ESP32 mqtt pzem
Add Comment
Please, Sign In to add comment