Medida intensidad con SCT-013 y ADS1115

Buenas tardes. Deseo controlar el consumo de una línea AC de 230 V. Para ello utilizo un Arduino Mega 256, un ADS1115 y un transformador YMDC SCT-013 10A/1V.

El circuito es el siguiente:

ADS1115

Conexión SCT-013 y ADS1115 :

Pines A0 y A1 del ADS1115.

Conexión ADS1115 con Arduino Mega 256:

Vdd -> 5V

GND -> GND

SCL -> SCL (21)

SDA -> SDA (20)

ADDR -> GND

Y el sketch:

// ADS1115_Dif_Vpp

#include <Wire.h>

#include <Adafruit_ADS1X15.h>

Adafruit_ADS1115 ads; // Crear una instancia del ADS1115

const float FACTOR = 10; //10A/1V

const float multiplier = 0.000125F; // GAIN_ONE => intervalo ADC: ±4,096V => 1 bit = 0,1250mV

float Irms;

float Prms;

void setup()

{

Serial.begin(9600);

ads.setGain(GAIN_ONE); // ±4,096V 1 bit = 0,1250mV

ads.begin(); // Inicializa el ADS1115 en la dirección predeterminada (0x48) como esclavo en el protocolo I2C

}

void printMeasure(String prefix, float value, String postfix) // Define la función printMeasure

{

Serial.print(prefix);

Serial.print(value, 4);

Serial.println(postfix);

}

void loop()

{

Irms=getCorriente();

printMeasure("Irms: ", Irms, "A");

Prms=Irms*230;

printMeasure("Prms: ", Prms, "W");

Serial.println(".");

delay(1000);

}

float getCorriente()

{

int adc0=0;

int Vpp = 0; // Voltage pico positivo

int Vpn = 0; // Voltage pico negativo

float voltage;

float corriente;

long tiempo = millis();

while (millis() - tiempo < 10000)

{

voltage = ads.readADC_Differential_0_1();

if (voltage > Vpp) {

Vpp = voltage;

}

if (voltage < Vpn) {

Vpn = voltage;

}

}

voltage = (Vpp + abs(Vpn))/2; // Voltage pico

voltage = voltage * multiplier;

corriente = voltage * FACTOR;

corriente = corriente / sqrt(2);

return(corriente);

}

He obtenido los siguientes resultados:

Potencia teórica equipo = 0 W
I1 Int. téster (A) -
Pot. = I1 x 230 V -
I2 Int. Arduino = 0,0009 A
I1/I2 -

Potencia teórica equipo = 76 W
I1 Int. téster = 0,33 A
Pot. = I1 x 230 V = 76,13 W
I2 Int. Arduino = 0,08139 A
I1/I2 = 4,07
- - - -
Potencia teórica equipo = desconocida
I1 Int. téster = 4,14 A
Pot. = I1 x 230 V = 952,2 W
I2 Int. Arduino = 1,0359 A
I1/I2 = 4

Potencia teórica equipo = 2.000 W
I1 Int. téster = 8,13 A
Pot. = I1 x 230 V = 1.869,9 W
I2 Int. Arduino = 1,9781 A
I1/I2 = 4,11

Potencia teórica equipo = desconocida
I1 Int. téster = 6,32 A
Pot. = I1 x 230 V = 1.453,6 W
I2 Int. Arduino = 1,5486 A
I1/I2 = 4,08

Ignoro por qué hay un factor de 4 entre la intensidad real medida con el téster y la medida mediante el circuito. He revisado el programa y las conexiones un montón de veces y a mi me parece correcto.

¿Podríais echarle un vistazo?

Gracias,

El transformador de corriente SCT-013 10A/1V produce una señal de salida que va de 0 a 1V para una corriente de 0 a 10A. Asegúrate de que el sensor esté conectado correctamente y de que el lado de carga esté debidamente conectado para obtener mediciones precisas.

He realizado la medición con dos cargas.

Iarduino = 1,98 A

Itester = 8,15 A

Itester/Iarduino = 4,10

Vsalida SCT-013 = 0,799 Vac => 7,99 A

Iarduino = 1,0368 A

Itester = 4,22 A

Itester/Iarduino = 4,07

Vsalida SCT-013 = 0,415 Vac => 4,15 A

Parece que el transformador funciona.

Varias cosas.

  1. Presenta un código debidamente formateado, lo que has presentado es difícil de leer con tantos espacios y todo pegado a la izquierda. Dirás que somos "quejosos" pero identar un código es muy importante para evaluar como fluye el mismo.
    Sigue esta versión de acá en mas por favor
// ADS1115_Dif_Vpp

#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads;  // Crear una instancia del ADS1115
const float FACTOR = 10;  //10A/1V
const float multiplier = 0.000125F;  // GAIN_ONE => intervalo ADC: ±4,096V => 1 bit = 0,1250mV
float Irms;
float Prms;

void setup(){
  Serial.begin(9600);
  ads.setGain(GAIN_ONE);  // ±4,096V 1 bit = 0,1250mV
  ads.begin();  // Inicializa el ADS1115 en la dirección predeterminada (0x48) como esclavo en el protocolo I2C
}

void printMeasure(String prefix, float value, String postfix) { // Define la función printMeasure
  Serial.print(prefix);
  Serial.print(value, 4);
  Serial.println(postfix);
}

void loop(){
  Irms = getCorriente();
  printMeasure("Irms: ", Irms, "A");
  Prms = Irms * 230;
  printMeasure("Prms: ", Prms, "W");
  Serial.println(".");
  delay(1000);
}

float getCorriente() {

  int adc0 = 0;
  int Vpp = 0;  // Voltage pico positivo
  int Vpn = 0;  // Voltage pico negativo

  float voltage;
  float corriente;
  long tiempo = millis();

  while (millis() - tiempo < 10000)  {
    voltage = ads.readADC_Differential_0_1();
    if (voltage > Vpp) {
      Vpp = voltage;
    }
    if (voltage < Vpn) {
      Vpn = voltage;
    }
  }

  voltage = (Vpp + abs(Vpn)) / 2;  // Voltage pico
  voltage = voltage * multiplier;
  corriente = voltage * FACTOR;
  corriente = corriente / sqrt(2);
  return (corriente);
}

NOTA:
Y me he tomado el trabajo linea por linea de corregirlo porque el formateador por alguna razón no pudo, hacerlo automáticamente.

Bien, ahora este link dice como leer debidamente tu sensor de corriente. Lo usas mal.

http://www.diverteka.com/?p=1966

Comienza probando este código a ver si las lecturas de intensidad ahora se corresponden con tu tester

// ===================================================
//  ** PowerCheck - DIVERTEKA (J.C.G.P.) **    v. 1.0
// ===================================================
//
// -- variables and pins definition ------------------
const int analogInPin = A0;        // analog input pin 
int retardo = 2 ;    // (tiempo (s.) entre visionados)
float lectura,ff,pKW,iA,vV,vS,S_Ratio;

// -- initialize serial comm & parameters ------------
void setup() {
  Serial.begin(9600); 
  S_Ratio = 36.5;      // Sensor/ratio (mV/mA ) : 36.5
  vV = 230;            // valor de tension a computar
  ff = 5; // freq. factor / (50Hz -> 5 / 60Hz -> 4.15)       
}

// -- smooth read routine ----------------------------
float smoothread(float fc){   // fc (factor corrector)
  int ni = 35;          // n. de iteraciones => smooth
  //  (ni) => rango 10 a 50 mejor promedio [smoothing]
  float retorno = 0.0;
  for (int x = 0; x< ni; x++){
  do {                         // espero paso por cero  
      delayMicroseconds(100); 
      } while (analogRead(0) != 0) ;
      delay (ff);            // espera centro de ciclo
      delay (10);            // estabilizacion CAD
      retorno = retorno +(analogRead(0)*fc); 
    }
  return retorno / ni; 
}

// -- main loop --------------------------------------
void loop() { 
  lectura = smoothread (1) / 1.41;    // lectura (rms)   
  vS = (lectura * 0.0048);          // valor de C.A.D.
  iA = (lectura * S_Ratio)/1000;     // Intensidad (A)
  pKW = (vV * iA)/1000;               // Potencia (kW)

  Serial.print("\n" );
  Serial.print("\n================================" );
  Serial.print("\n *** PowerCheck - DIVERTEKA *** " );
  Serial.print("\n================================\n" );
  Serial.print("\n- Tension predefinida  [V] --> " );
  Serial.print(vV,0);    
  Serial.print("\n- Lectura del sensor   [V] --> " );
  Serial.print(vS,3);    
  Serial.print("\n- Intensidad calculada [A] --> " );
  Serial.print(iA,3);  
  Serial.print("\n- Potencia calculada  [kW] --> " );
  Serial.print(pKW,3);  
  Serial.print("\n-------------------------------\n" );
  delay(retardo * 1000);                     
}

Pero acá tenemos el agregado de usar la placa ADS1115 asi que adaptalo.
Si vas a leer 1V usa una ganancia mas adecuada que 4V con GAIN_ONE
La opción * GAIN_FOUR te da un rango +/-1.024V pero si tienes temor usa la intermedia GAIN_TWO que seria +/- 2.048V

Empieza midiendo bien la corriente y consecuentemente medirás bien la potencia.

Gracias por tu interés.

El formato que has dado al sketch lo hace mucho más comprensible, la próxima vez que realice una consulta lo tendré en cuenta.

En cuanto a la solución propuesta, esta no se adapta a mi propuesta. Se basa en rectificar la señal de salida para posteriormente amplificarla. Yo leo directamente la salida en modo diferencial y el ADC la adapta mediante la ganancia y realiza una conversión de 16 bits.

El sensor funciona perfectamente, la tensión alterna de salida está en línea con la intensidad medida.

El sketch se basa en multitud que puedes obtener en Internet (de creadores de reconocido prestigio). Se me escapa dónde está el fallo, la teoría es bastante sencilla.

Saludos

No entiendo el sensor funciona perfectamente pero tienes 4 veces mas corriente de lo que muestra el arduino?

A ver si nos entendemos mejor.
Alguno esta mal, el arduino o el sensor.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.