Medidas eléctricas para 6 canales (hardware)


El medidor de energía ESP32 de 6 canales expandible puede leer 6 canales de corriente y 2 canales de voltaje a la vez. Utiliza transformadores de corriente y un transformador de CA para medir el voltaje y alimentar la(s) placa(s)/ESP32. La placa principal incluye un convertidor reductor para alimentar la electrónica y la placa de desarrollo ESP32, que se conecta directamente a la placa. Se pueden apilar hasta 6 placas adicionales encima de la placa principal para permitirle monitorear hasta 42 canales actuales en resolución de 16 bits, en tiempo real, ¡todo a la vez!

El uso de esta placa puede ser bien Monofásico (Split norteamericano monofásico 120V/240V 60Hz – red y/o circuitos individuales o Monofásico europeo 240V 50Hz debiéndose proporcionar transformador AC-AC 9V o 12V con al menos 500mA de salida) o Trifásico: se recomienda medir los 3 voltajes con 3 transformadores de voltaje. Esto se puede hacer usando una placa principal con 1 placa adicional pudiendose usar un solo medidor para medir trifásico, pero la potencia (vataje) no se calculará correctamente. La potencia se puede calcular en el software, pero el factor de potencia deberá estimarse ((voltaje*corriente)*power_factor)).

Características:

  • Muestras de 6 canales de corriente y 1 canal de voltaje (ampliable a 2 voltajes)
  • Las placas complementarias (hasta 6) pueden expandir el medidor hasta 42 canales de corriente y 8 canales de voltaje
  • Utiliza 2  Microchip ATM90E32AS – 3 canales de corriente y 1 voltaje por IC
  • Para cada canal, el medidor también puede calcular lo siguiente:
    • Poder activo
    • Poder reactivo
    • Poder aparente
    • Factor de potencia
    • Frecuencia
    • La temperatura
  • Utiliza abrazaderas de transformador de corriente estándar para probar la corriente
  • Resistencias de carga de 22 ohmios por canal de corriente
  • Incluye convertidor reductor incorporado para alimentar ESP32 y electrónica
  • 2 interrupciones IRQ y 1 salida de advertencia conectada a ESP32
  • Salidas de cruce por cero
  • Salidas de pulso de energía por IC (4 por IC x2)
  • Interfaz SPI
  • Error de medición IC: 0,1%
  • Rango dinámico IC: 6000:1
  • Selección de ganancia actual: hasta 4x
  • Deriva de referencia de voltaje típica (ppm/°C): 6
  • Resolución ADC (bits): 16

Lo que necesitará:

  • Transformadores de corriente (cualquier combinación de los siguientes, o cualquier transformador de corriente que no supere los 720 mV RMS o la salida de 33 mA)
    • SCT-006 20A/25mA Micro (apertura de 6 mm – conectores de 3,5 mm)
    • SCT-010 80A/26.6mA Mini (apertura 10mm – conectores 3.5mm)
    • SCT-013-000 100A/50mA (apertura 13mm – conectores 3.5mm)
    • SCT-016 120A/40mA (apertura 16mm – conectores 3.5mm)
    • Magnelab SCT-0750-100 (conectores de tornillo: debe cortar la conexión de la resistencia de carga en la parte posterior de la placa, ya que tienen una resistencia de carga incorporada).
    • SCT-024 200A/100mA (apertura 24mm – salida terminal)
    • También se pueden usar otros, siempre que estén clasificados para la cantidad de energía que desea medir y tengan una salida de corriente de no más de 720 mV RMS, o 33 mA en la salida máxima.
  • Transformador de CA (NO CC):
    • América del Norte: Jameco Reliapro 120V a 9V AC-AC o 12v. El pin positivo debe ser de 2,5 mm (algunos son de 2,1)
    • Europa: 240 V a 9 V o 12 V CA-CA al menos 500 mA
  • ESP32 (elija uno):
    • NodoMCU 32s
    • Espressif DevKitC
    • DevKitC-32U si necesita una mejor recepción wifi (no olvide la antena )
    • Cualquier otra cosa con los mismos pines que el anterior, que generalmente son 19 pines por lado con 3v3 en la parte superior izquierda y CLK en la parte inferior derecha
  • Software (elija uno):

Configuración del medidor

Diagrama del medidor de energía ESP32 de 6 canales expandible
Diagrama posterior del medidor de energía ESP32 de 6 canales expandible

Conectando el ESP32

El medidor de energía ESP32 de 6 canales expandible está hecho para que una placa de desarrollo ESP32 se pueda conectar directamente al medidor. Consulte la lista anterior para conocer las placas de desarrollo ESP32 compatibles. Siempre inserte el ESP32 con el pin 3V3 en la parte superior izquierda del medidor . Los pines inferiores se utilizan para conectar la señal de voltaje (del enchufe de alimentación) a las placas adicionales. Si el ESP32 se inserta en los pines inferiores, lo más probable es que haga un cortocircuito en el ESP32.

Comunicarse con el ESP32

El medidor de energía ESP32 de 6 canales expandible utiliza SPI para comunicarse con el ESP32. Cada placa utiliza 2 pines CS.

La placa principal utiliza los siguientes pines SPI:

  • CLK – 18
  • miso – 19
  • MOSI – 23
  • CS1 – 5 (CT1-CT3 y voltaje 1)
  • CS2 – 4 (CT4-CT6 y voltaje 2)

Placas complementarios

Las placas adicionales (hasta 6) pueden expandir el medidor de energía principal hasta 42 canales de corriente y 8 canales de voltaje. Las placas complementarias se conectan directamente a la placa principal como se ve aquí.

La placa adicional permite seleccionar el pin CS en función de la configuración del puente en la parte inferior de la placa. Esto es para que se puedan usar varias placas complementarias, hasta un máximo de 6. NO seleccione más de un pin CS por banco. Los pines CS pueden ser:

  • CT1-CT3 (CS):
    • Para v1.3 y anteriores:
      • 0
      • 2 (*asegúrese de que no se utilice un LED integrado para IO2 en el ESP32)
      • 12 (*hará que ESP32 no arranque si se usa)
      • 13
      • 14
      • 15
    • Para v1.4 y superior:
      • 0
      • 27
      • 35 (no usar, no funcionará correctamente)
      • 13
      • 14
      • 15
    • Para v1.4 rev1 y superior:
      • 35 se cambia a 2 (puede evitar que se programe el ESP32; si es así, desconecte el puente)
  • CT4-CT6 (CS2):
    • dieciséis
    • 17
    • 21
    • 22
    • 25
    • 26

Calibración de sensores de corriente y voltaje (transformador de CA)

Valores de calibración comunes
  • Transformadores de corriente:
    • 20A/25mA SCT-006: 11143
    • 30A/1V SCT-013-030: 8650
    • 50A/1V SCT-013-050: 15420
    • 80A/26,6mA SCT-010: 41660
    • 100A/50mA SCT-013-000: 27518
    • 120A/40mA: SCT-016: 41787
    • 200A/100mA SCT-024: 27518
  • Transformadores de CA
    • Transformador Jameco 9VAC 157041:
      • Para versiones de contador:
        • v1.3 o superior: 7305
        • v1.2: 42620

Medición de potencia y otros valores de medición

El medidor de energía ESP32 de 6 canales expandible utiliza 2 circuitos integrados ATM90E32AS. Cada IC tiene 3 canales de voltaje y 3 canales de corriente. Para que los datos de medición de potencia se calculen internamente, cada canal de corriente debe tener un voltaje de referencia. Si el voltaje está desfasado con la corriente, entonces la corriente y la potencia se leerán como negativas, lo que afectará el factor de potencia y los cálculos de potencia. Si tiene una configuración dividida monofásica o bifásica, la solución es dar la vuelta al transformador de corriente en el cable.

v1.1 del medidor usó 1 de los canales de voltaje para cada IC. Esto significa que los datos de potencia y medición tendrían que calcularse en el software, o los canales de voltaje tendrían que mapearse a través de registros cambiantes en el IC para obtener datos de potencia y medición de CT2, CT3, CT5, CT6.

v1.2 y v1.3 tienen JP8-JP11 en la parte posterior de la placa, lo que permitiría conectar todos los canales de voltaje, lo que permitiría calcular la potencia y otros valores de medición. La mayor parte de v1.3 vino soldada.

v1.4 eliminó JP8-JP11 y tiene canales de voltaje conectados internamente en la pcb.

Medición de circuitos de dos polos (240 V)

Para aplicaciones monofásicas divididas, los circuitos de dos polos tienen 2 cables activos que totalizan 240 V (generalmente rojo y negro en los edificios más nuevos). En la mayoría de los casos, ambos polos se usan por igual, pero en otros puede haber componentes electrónicos en el aparato que usan solo 1 polo. Hay 3 opciones diferentes para medir estos circuitos:

  • Monitoree 1 fase con 1 CT y duplique la salida de corriente en el software (menos preciso) Vea los detalles sobre cómo hacer esto en ESPHome aquí .
  • Use 2 CT para monitorear cada cable vivo en el circuito (si está monitoreando 1 voltaje, deben estar en direcciones opuestas entre sí)
  • Si tiene suficiente cable y el CT es lo suficientemente grande, pase ambos cables calientes a través de 1 CT en direcciones opuestas

Medición de un segundo voltaje

Los orificios etiquetados como VA2 al lado del enchufe de alimentación en la placa principal del medidor y en la parte inferior derecha de la placa adicional son para medir un segundo voltaje. Para hacer esto debes:

  • Corte (con un cuchillo) JP12 y JP13 en la parte posterior de la placa para v1.3+, o JP7 para versiones anteriores
  • Use un segundo transformador de CA, idealmente uno idéntico al primario
  • Enchufe el segundo transformador de CA a un tomacorriente en la fase opuesta al primario
  • Suelde en un cabezal de clavija, un conector de tornillo de 3,5 mm (2,54 mm para v1.3 y anteriores) o un conector flexible estilo CC en VA2+ y VA2- (junto al conector principal de alimentación/voltaje)

Cuando se cortan los puentes de voltaje, la referencia de voltaje para CT4-CT6 será de VA2. Esto significa que los transformadores de corriente para CT4-CT6 deben conectarse a circuitos que estén en la misma fase que VA2, y CT1-CT3 deben conectarse a circuitos que estén en fase con el voltaje primario. Si un CT no está en fase con el voltaje, sus lecturas de corriente y potencia serán negativas. Si, por ejemplo, tiene 4 circuitos en fase con el primario y 2 en fase con VA2, puede invertir el transformador de corriente en el cable para ponerlo en fase con el voltaje (suponiendo que se divide en monofásico o bifásico)

Para tableros complementarios, el voltaje principal provendrá del tablero principal. La medición de voltaje secundario opcional (también pines VA2), estará en fase con CT4-CT6.

Medición de electricidad trifásica

Lo que necesitará para medir las 3 fases correctamente:

  • Placa principal de 6 canales (v1.4 y superior)
  • Tablero adicional de 6 canales
  • 3 transformadores de tensión, uno para cada fase. Estos pueden ser de pared, de tipo enchufable (si tiene un tomacorriente conectado a cada fase) o transformadores independientes conectados directamente a los disyuntores. Deben bajar el voltaje a entre 9 y 14 V CA. El primero que se conecta a la placa principal también alimenta el ESP32 y la electrónica, por lo que debe generar al menos 500 mA.
  • Cabeceras soldadas a los terminales VA2 en la placa principal y la placa complementaria
  • JP12 y JP13 cortados en la placa principal y las placas complementarias Similar a lo anterior para medir un segundo voltaje, una vez que se cortan JP12 y JP13:
  • CT1-CT3 en la placa principal y CT1-CT3 en la placa adicional estarán en fase con la primera fase
  • CT3-CT4 en el tablero principal con la 2da fase
  • CT3-CT4 en la placa adicional con la 3.ª fase.

Los transformadores deben calibrarse individualmente para una mayor precisión.

Como alternativa, puede utilizar 2 placas complementarias y conectar 1 transformador a cada placa:

  • Ubique los pines más inferiores (es decir, aquellos en los que el ESP32 no se conecta), marcados como «VA-» y «VA+» para cada placa adicional. Estos normalmente proporcionan la referencia de voltaje a la placa adicional desde la placa principal.
  • Corta estos alfileres
  • Suelde un conector, o los cables de un transformador, en los orificios inferiores derechos marcados como «VA2» en las placas complementarias. La polaridad no importa (si obtiene lecturas de corriente negativas, invierta el CT en el cable)
  • No corte JP12 y JP13

En los sistemas trifásicos, un transformador de corriente que está conectado a una fase que no está en fase con la referencia de voltaje siempre dará como resultado una potencia activa y un factor de potencia cercanos a cero.

A continuación podemos ver un video que resume tanto la electrónica necesaria como las opciones de configuración posibles que veremos en un segundo post.


Fuente: https://github.com/CircuitSetup/Expandable-6-Channel-ESP32-Energy-Meter

Monitor de energía de precisión con pantalla y salida de datos


En este interesante proyecto de radiopench , utilizaremos un Arduino NANO, un medidor PZEM004T v3 y una pantalla OLED de 0.96 pulgadas , y dos pulsadores de operación, que son lo más pequeños posibles.

El esquema de conexiones podemos resumirlo del siguiente modo:

  • Pin 10 : select.
  • Pin 9 :enter.
  • Pin 11 Rx (conectado a Tx pin en el PZEM).
  • Pin 12 Tx (conectado a Rx pin en the PZEM).
  • Pin 4 a SDA de la pantalla amoled.
  • Pin5a SCL de la pantalla amoled.

En este blog se ha tratado en un articulo anterior el modulo medidor PZEM004T v3 (ver PZEM-004Tv3 del fabricante Peacefair
). Esta vez leeremos el resultado de la medición del Arduino pero además lo mostraremos en una pequeña pantalla amoled de 6 líneas. Además, como no es interesante solo mostrarlo, dejaremos que el resultado fluya hacia el puerto serial como un registro pues de esta manera podemos recibir datos en una PC, etc. y crear gráficos fácilmente.

Asimismo al incluir dos pulsadores podemos variar el periodo de muestreo o resetear los resultados.

En este esquema podemos ver más en detalle todas las conexiones (la fuente se puede suprimir en caso de que lo conectemos permanentemente a un ordenador vía USB)

Hay dos pulsadores de seleccionar e ingresar en la parte superior izquierda. El Arduino NANO (compatible) se puede reemplazar por cualquier variante de la familia Arduino (incluido el ESP32) y la pantalla OLED de 0.96 pulgadas no deberían costar demasiado

Descripción de la funcionalidad de la operación

La operación es simple y el resultado de la medición de potencia se muestra en el OLED a intervalos de 1 segundo. Además, el resultado de la medición se envía al puerto serie (salida de registro) en el intervalo especificado.

Vamos a ver el significado de cada línea mostrada en el panel amoled (el orden es el correspondiente a empezar desde la parte superior de la pantalla hacia abajo):

  • Línea 1: El valor de la potencia activa se muestra como un carácter con un cuadrado doble (unidad W). El borde derecho de la primera línea es el tiempo restante hasta la salida del registro. Cuando llega a 0, el registro se genera y, al mismo tiempo, el registro se muestra en la parte superior derecha de la pantalla.
  • Línea 2: Muestra los valores de tensión y corriente (unidades V, A). El valor es un valor efectivo
  • Línea 3: Mostrar el valor de la potencia aparente (unidad VA)
  • Línea 4: Mostrar la cantidad de electricidad (energy) (unidad: kWh)
  • Línea 5: Frecuencia (unidad Hz)
  • Línea 6: Muestra el valor del factor de potencia (unidad %), y además como un gráfico de barras.

Puede ser difícil de leer porque está lleno de información en una pantalla pequeña. Sin embargo, dado que la potencia activa más importante se muestra en letras grandes en la fila superior y el factor de potencia también se muestra en el gráfico de barras en la parte inferior, debería ser relativamente fácil de ver incluso desde la distancia.

Al restablecer mientras presiona el botón de configuración del ciclo de grabación, ingresará a la pantalla de configuración del ciclo de grabación. El período de medición se puede cambiar presionando el botón SELECT y se puede especificar como 1, 2, 5, 10, 30, 60, 120, 300 segundos. El valor se confirma presionando el botón Enter y se inicia el modo de medición normal. Además, el valor establecido se registra en la EEPROM, por lo que se recuerda incluso si la alimentación está apagada.

Al presionar el botón Enter durante la operación de restablecimiento de energía, el valor de potencia integrado (valor de kWh) se puede borrar a cero. Para indicar que se ha aceptado la operación del botón, la pantalla se apaga una vez .

Dado que se emite en formato CSV separado por comas, puede leerlo tal como está en Excel. Los datos son desde el principio hasta el segundo, en el siguiente orden: segundo, voltaje (V), corriente (A), potencia aparente (VA), potencia activa (W), factor de potencia, consumo de energía (kWh) y frecuencia (Hz).
Además, se inserta la coma inicial para aclarar el delimitador porque si se inserta una cadena de marca de tiempo en el software del terminal, se puede perder el límite con el segundo valor.

A continuación podemos ver el código completo para gestionar la pantalla , los dos pulsadores y el monitor PZEM.

/* AC power meter with text log
  Measuring instrument:PZEM-004T v3.0
  Display 0.96 inch OLED (SSD1306, 128x64)

   Pin 10 energy clear button
   Pin 11 Rx (Connects to the Tx pin on the PZEM)
   Pin 12 Tx (Connects to the Rx pin on the PZEM)
  
*/

#include <EEPROM.h>
#include <PZEM004Tv30.h>                     // PZEM004Tv3 library
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>                // 0.96inch OLED
#include <MsTimer2.h>

#define vCal 1.006                           // voltage calibration coefficient(dafault=1.0)
#define iCal 0.9205                          // current calibration coefficient(dafault=1.0)

#define entPin   9                           // enter button
#define selPin  10                           // select button
#define pzemRX  11                           // recieve data (connect to PZEM TX)
#define pzemTX  12                           // send data    (connect to PZEM RX)

Adafruit_SSD1306 oled(128, 64, &Wire, 4);    // OLED setup
PZEM004Tv30 pzem(pzemRX, pzemTX);            // Pin11 to TX, Pin12 to RX

unsigned int rangeTable[8] = {1, 2, 5, 10, 30, 60, 120, 300}; // time Inerval Table
int rangeNumber;
int timeToLog;                               // remaining time to output log

float Vx, Ax, VAx, Wx, kWhx, PFx, Hzx, VARx; // measured value
char buff[8];                                // character format buffer
unsigned int logInterval;                    // log interval
volatile boolean t2Flag = false;             // timing sync variable

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);    // set OLED I2C Address 0x3C or 0x3D
  Serial.begin(115200);
  pinMode(entPin, INPUT_PULLUP);             // enter button
  pinMode(selPin, INPUT_PULLUP);             // select button

  rangeNumber = EEPROM.read(0);
  if (rangeNumber > 7) {                     // abnormal range number will be
    rangeNumber = 0;                         // set to 0
  }
  logInterval = rangeTable[rangeNumber];

  oled.clearDisplay();
  oled.display();
  oled.setTextColor(WHITE);                  // write with white character

  if (digitalRead(entPin) == LOW) {
    recIntervalSet();
  }

  startScreen();                             // show start screen
  Serial.println();                          // start message
  Serial.println(F(" , PZEM-004V3 Power meter start V0.5"));
  Serial.println(F(" , sec, V(rms), I(rms), VA, W, PF, kWh, Hz"));
  Serial.flush();

  timeToLog = logInterval;                   // set interval
  measure();                                 // get value from PZEM-004Tv3
  logPrint();                                // data out serial port
  oledDisplay();                             // display data on OLED

  MsTimer2::set(1000, timer2IRQ);            // IRQ interval 1sec
  MsTimer2::start();
}

void loop() {
  if (digitalRead(selPin) == LOW) {          // if select button pushed during running
    resetKWh();                              // clear the energy value
  }
  while (t2Flag == false) {                  // wait MsTimer2 IRQ
  }
  t2Flag = false;

  measure();                                 // get value from PZEM-004Tv3
  timeToLog --;                              // decrement log timer
  oledDisplay();                             // display present data to OLED
  if (timeToLog == 0 ) {                     // if log interval time is up,
    logPrint();                              // output log data to serial port
    timeToLog = logInterval;                 // set value for next cycle
  }
}            // end of loop

void measure() {                             // read values from PZEM-004T v3
  Vx = vCal * pzem.voltage();                // voltage(apply calibration correction)
  Ax = iCal * pzem.current();                // current(apply calibration correction)
  VAx = Vx * Ax;                             // calculate apparent power
  Wx = vCal * iCal * pzem.power();           // effective power(Use the value after calibration correction)
  PFx = pzem.pf();                           // power factor
  kWhx = vCal * iCal * pzem.energy();        // sum of energy(Use the value after calibration correction)
  Hzx = pzem.frequency();                    // line frequency
}

void logPrint() {                               // serial out for log
  static long t = 0;
  Serial.print(F(" , "));                       // this for the separator for terminal software timestamp text
  Serial.print(t); Serial.print(F(", "));       // time in second
  Serial.print(Vx, 1); Serial.print(F(", "));   // voltage
  Serial.print(Ax, 3); Serial.print(F(", "));   // current amps
  Serial.print(VAx, 2); Serial.print(F(", "));  // VA value
  Serial.print(Wx, 1); Serial.print(F(", "));   // wattage
  Serial.print(PFx, 2); Serial.print(F(", "));  // powewr factor
  Serial.print(kWhx, 3); Serial.print(F(", ")); // totall energy
  Serial.print(Hzx, 1);                         // frequency
  Serial.println();
  t += logInterval;                             // increment accumurate time
}

void oledDisplay() {                                // display information on OLED
  oled.clearDisplay();                              // clear display buffer
  oled.setTextSize(2);                              // double size character

  dtostrf(Wx, 6, 1, buff);                          // format nnnn.n
  oled.setCursor(0, 0);
  oled.print(buff); oled.print(F("W"));             // display power value

  oled.setTextSize(1);                              // standerd size character
  oled.setCursor(110, 8);
  sprintf(buff, "%3d", timeToLog);                  // format decimal 3-digit
  oled.print(buff);                                 // remainig time display
  if (timeToLog == 0) {                             // if time up
    oled.setCursor(110, 0); oled.print(F("Log"));   // display "Log" at top right
  }

  dtostrf(Vx, 5, 1, buff); oled.setCursor(0, 16); oled.print(F("V:"));
  oled.print(buff); oled.print(F("V"));             // voltage nnn.n

  dtostrf(Ax, 6, 3, buff); oled.setCursor(56, 16); oled.print(F("I: "));
  oled.print(buff); oled.print(F("A"));             // amps nn.nnn

  dtostrf(VAx, 7, 2, buff); oled.setCursor(0, 26); oled.print(F("Pappa:"));
  oled.print(buff); oled.print(F(" VA"));           // volt amps nnnn.nn

  dtostrf(kWhx, 7, 3, buff); oled.setCursor(0, 36); oled.print("Energ");
  oled.print(buff); oled.print(F(" kWh"));          // watt hours nnn.nnn


  dtostrf(Hzx, 4, 1, buff); oled.setCursor(0, 46); oled.print(F("Freq :   "));
  oled.print(buff); oled.print(F(" Hz"));           // fequency nn.n

  dtostrf(PFx * 100.0, 3, 0, buff); oled.setCursor(0, 56); oled.print(F("PF:"));
  oled.print(buff); oled.print(F("% Y    Y    Y")); // power factor nnn
  oled.fillRect(50, 61, (60 * PFx) + 1, 3, WHITE);  // Power factor bar

  oled.display();                                   // actual display will be done at here
}

void recIntervalSet() {                             // Log interval time setting by button swith
  while (digitalRead(entPin) == LOW) {              // wait till the enter button is released
    oled.clearDisplay(); oled.setCursor(0, 0);
    oled.print(F("Log interval setting"));          // start message
    oled.display();
  }
  delay(30);

  while (digitalRead(entPin) == HIGH) {
    oled.clearDisplay();
    oled.setTextSize(2);                            // double size character
    oled.setCursor(0, 0);
    oled.println(F("Set Int."));                    // display set interaval value

    oled.setCursor(35, 30);
    oled.print(logInterval); oled.print(F("sec"));  // display the value
    oled.display();

    if (digitalRead(selPin) == LOW) {
      rangeNumber ++;                               // increment range number
      if (rangeNumber > 7) {                        // if beyond upper limit
        rangeNumber = 0;                            // circulate the number
      }
      logInterval = rangeTable[rangeNumber];        // set interval time from table
    }
    while (digitalRead(selPin) == LOW) {            // wait select botton relesed
    }
    delay(30);
  }

  EEPROM.write(0, rangeNumber);                     // save value to EEPROM
}

void startScreen() {                                // start message
  oled.clearDisplay(); oled.setTextSize(2);         // double size character
  oled.setCursor(0, 0);
  oled.println(F("PZEM-004T"));
  oled.println();
  oled.print(F("int.="));
  oled.print(logInterval); oled.print(F("s"));      // display log interval
  oled.display();
  delay(2000);
}

void resetKWh() {                   // clear accumulated energy value
  Serial.println(F("Reset kWh"));   // write message on the log
  pzem.resetEnergy();               // reset value
  oled.clearDisplay();              // erase disp. to show command accepted
  oled.display();
  delay(50);
}

void timer2IRQ() {                  // MsTimer2 IRQ
  t2Flag = true;                    // set flag for loop
}

Se ha omitido la descripción del programa, pues no hay nada complicado. Sin embargo, dado que el coeficiente de corrección se define a continuación y corrige el resultado de la medición de voltaje y corriente, es mejor ajustarlo para cada dispositivo.

Si no conoce el valor de corrección, está bien establecerlo en 1.0.

  • define vCal 1.006 // coeficiente de calibración de voltaje(dafault=1.0)
  • define iCal 0.9205 // coeficiente de calibración de corriente(dafault=1.0)

En el siguiente video podemos ver una demostración práctica del dispositivo:

Video del proyecto en inglés

Fuente :El diagrama de circuito y el código del programa están disponibles en el siguiente siguiente sitio escrito en japonés http://radiopench.blog96.fc2.com/blog-entry-995.html