ESP32 - PZEM004Tv30 read data

#include <Arduino.h>
#include <PZEM004Tv30.h>
#include <SPIFFS.h>
#include <FS.h>
#include <WiFi.h>
#include <WebServer.h>

#define RX_PIN 16   // กำหนดพิน Rx สำหรับการเชื่อมต่อกับ PZEM
#define TX_PIN 17   // กำหนดพิน Tx สำหรับการเชื่อมต่อกับ PZEM
#define INTERVAL 10000 // เก็บข้อมูลทุก 5 วินาที

// PZEM instance
PZEM004Tv30 pzem(Serial2, RX_PIN, TX_PIN);

// WiFi Hotspot credentials
const char *ssid = "ESP32-AP";  // ตั้งค่า SSID สำหรับ Hotspot
const char *password = "123456789";  // ตั้งค่ารหัสผ่าน

WebServer server(80);  // Web server บนพอร์ต 80

unsigned long previousMillis = 0;

void handleDownload() {
  File file = SPIFFS.open("/data.csv", FILE_READ);
  if(file){
    server.sendHeader("Content-Type", "text/csv");
    server.sendHeader("Content-Disposition", "attachment; filename=data.csv");
    server.streamFile(file, "application/octet-stream");
    file.close();
  } else {
    server.send(404, "text/plain", "File not found");
  }
}

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

  // ตั้งค่า Hotspot (Access Point)
  WiFi.softAP(ssid, password);
  Serial.println("Access Point Started");
  Serial.print("IP Address: ");
  Serial.println(WiFi.softAPIP());

  // เริ่มต้น SPIFFS
  if(!SPIFFS.begin(true)){
    Serial.println("SPIFFS Mount Failed");
    return;
  }

  // สร้างไฟล์ CSV หากยังไม่มี
  if(!SPIFFS.exists("/data.csv")){
    File file = SPIFFS.open("/data.csv", FILE_WRITE);
    if(file){
      file.println("Time,Voltage,Current,Power,Energy"); // หัวตาราง CSV
      file.close();
    }
  }
  
  // ตั้งค่าการส่งออกไฟล์ CSV ผ่านเว็บเซิร์ฟเวอร์
  server.on("/download", handleDownload);
  server.begin();
  Serial.println("HTTP server started");

  Serial.println("Setup complete");
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= INTERVAL) {
    previousMillis = currentMillis;

    // อ่านค่าจาก PZEM
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();

    // แสดงค่าที่อ่านได้ผ่าน Serial
    Serial.print("Voltage: "); Serial.print(voltage); Serial.print("V, ");
    Serial.print("Current: "); Serial.print(current); Serial.print("A, ");
    Serial.print("Power: "); Serial.print(power); Serial.print("W, ");
    Serial.print("Energy: "); Serial.println(energy);

    // เขียนข้อมูลลงในไฟล์ CSV
    File file = SPIFFS.open("/data.csv", FILE_APPEND);
    if(file){
      String data = String(millis()/1000) + "," + String(voltage) + "," + String(current) + "," + String(power) + "," + String(energy);
      file.println(data);
      file.close();
    } else {
      Serial.println("Failed to open file for appending");
    }
  }

  // จัดการกับเว็บเซิร์ฟเวอร์
  server.handleClient();

  // จัดการคำสั่งผ่าน Serial
  if(Serial.available()){
    String command = Serial.readStringUntil('\n');
    command.trim();
    
    if(command == "delete csv"){
      SPIFFS.remove("/data.csv");
      Serial.println("CSV file deleted");
    }
    else if(command == "get csv"){
      File file = SPIFFS.open("/data.csv", FILE_READ);
      if(file){
        while(file.available()){
          Serial.write(file.read());
        }
        file.close();
      } else {
        Serial.println("Failed to open CSV file");
      }
    }
  }
}

Last updated