Cómo incluir una librería dentro de otra?

Muy buenas, estoy trabajando con la librería de EmonLib de openenergy para las mediciones de potencia con un sensor SCT. Lo que sucede es que al probarlo con el Arduino todo funciona perfecto, el problema radica en que deseo utilizar un ADS1115 para no limitarme sólo al microcontrolador de Arduino, sino poder utilizarlo con un ESP8266 y para la utilización del ADS requiere una librería específica, la que estoy utilizando es esta. La librería de EmonLib internamente lee los valores analógicos con la función analogRead, y no me serviría debido a que para leer con el ADS necesita una función diferente, entonces digamos que tendría que editar la librería de EmonLib para adaptarla al ADS y así poder utilizarla, lo que implica incluir la librería del ADS en la de EmonLib.

Alguno tiene idea de cómo solucionar esto?

Muchas gracias.

Tu ves las cosas de modo simple y no lo son. El ADC del Arduino es de 10 Bits y el ADS1115 de 16 bits y hasta ahi lo simple.
Pero el ADC del arduino permite sampleos de alta velocidad y no se hasta que punto el ADS1115 si lo permite.
Para medir correctamente como hace EMONLIB deberias poder samplera tension y corriente a 100 hs para frecuecias de 50 Hz y a 120 Hz para frecuencias de 60Hz.

La hoja de datos dice que samplea entre 8 SPS to 860 SPS asi que en principio se puede.

Luego hay que hacer modificaciones a la librería para que tolere el ADS1115. Lo mejor que puedes hacer es ir al foro de EMONLIB y hacer alla la consulta.

Fui a Google y puse : Emonlib ADS1115 y salió tu respuesta

que basicamente luego de su correspondiente charla te lleva a esto

Hoa surbyte, ya esa librería la he comprobado y no funciona correctamente, tiene varios errores que la verdad no he logrado corregir, los valores iniciales dan muy altos y luego comienzan a bajar hasta llegar a 0.00 y por mas carga que le coloque no hace ningún cambio, de igual forma ya he colocado un comentario en esa librería haber si me pueden ayudar.

Por otro lado he estado intentado realizar un código para la medición de corriente y voltaje y me ha funcionado bien, el problema radica en que al momento de calcular el ángulo de fase el tiempo entre cada senoidal del voltaje y corriente siempre me marca el mismo. No sé si debo crear un nuevo post con este problema o si lo coloco acá.

Saludos y muchas gracias.

Sigue acá pero ves que todo eso que respondes no lo indicaste y uno pierde tiempo buscandote respuestas como si no tuvieras nada.

Lo mejor sería continuar con esa librería y ver donde falla o tienes algo mejor? Eso que comentas que te ha funcionado bien lo has hecho basado en qué?

Si lo siento por no haber mencionado eso anteriormente, pero mi idea inicial era configurarla por mi mismo. Te mostraré otras librerías que he intentado implementar con poco éxito:

En esta las medidas dan muy lejos de los valores que en realidad son, estoy comparando los valores de corriente con un medidor TS-1500 y un multímetro UT61. Las medidas que dan por ejemplo en un consumo de 700 mA, marca 7 amperios, por lo que es algo muy descabellado. El código que proponen en esa página es el siguiente:

#include "EmonLiteESP.h"

EmonLiteESP power;

unsigned int adcBits = 10; // ADC bit resoltion (normally 10)
double referenceVoltage = 1.0; // 1.0V for a bare ESP8266 chip
double currentRatio = 30; // 30A 1V for a YHDC SCT-013-030
double mainsVoltage = 230.0 // EU standard
unsigned int samples = 1000; // 1000 samples each time we measure current

unsigned int currentCallback() {
   return analogRead(0);
}

void setup() {
   Serial.begin(115200);
   power.initCurrent(currentCallback, adcBits, referenceVoltage, currentRatio);
}

void loop() {
  double current = power.getCurrent(samples);
  Serial.print(F("Power now: "));
  Serial.print(int(current * mainsVoltage));
  Serial.println(F("W"));
  delay(5000);
}

Aquí hice el cambio del ADC a 15, la referencia de voltaje en 1.0, rango de corriente en mi caso es 100 ya que estoy utilizando un SCT de 100A:50mA, voltaje de 110, y los samples igualmente de 1000. En este caso tuve que agregar la librería del ADS1115 y cambiar en la función currentCallback el analogRead(), por la función de la librería del ADS para la lectura del valor analógico.

Probé esta otra página en donde prácticamente copiaron y pegaron la parte de medición de corriente de la librería de EmonLib, sin embargo, las mediciones son bastante erróneas igualmente.

Al ver que nada de lo que encontraba funcionaba bien, me decidí a realizar un código por mi cuenta, en el cual tomé la base de este blog. El código que realicé fue el siguiente:

#include <Wire.h>
#include <Adafruit_ADS1015.h>
#include <math.h>

#define CONST_TENSION 152; //90.90

Adafruit_ADS1115 ads(0x48);

int i, adcZ = 0, Itera = 300;
float adc1 = 0, valorMax1 = 0, adc2 = 0, valorMax2 = 0;
float tension, corriente, potencia, Vref, fp;
long ADCRef;

void setup() {
  Serial.begin(9600);
  ads.setGain(GAIN_ONE);
  ads.begin();
  Referencia();

}

void loop() {
  CalIrms();
  float corrienteR = (145 * corriente) - 0.6208; //(146.49*corriente) - 0.6862
  float corrienteP = (-819.44 * (corriente * corriente)) + (197.62 * corriente) - 1.1624;
  Serial.print(corrienteP, 3);
  Serial.print(" ");
  Serial.print(corrienteR, 3);
  Serial.print(" ");
  Serial.print(corriente, 4);
  CalVrms();
  Serial.print(" V: ");
  Serial.print(tension);
  FP();
  Serial.print(" FP: ");
  Serial.println(fp);
}

void Referencia() {
  long ADCSuma, ADCProm;
  float VrefSuma, VrefProm;
  for (int i = 0; i < 100; i++) {
    ADCRef = ads.readADC_SingleEnded(1);
    Vref = (ADCRef * 0.125) / 1000;
    ADCSuma += ADCRef;
    VrefSuma += Vref;
  }
  Serial.print(ADCSuma);
  Serial.print(" ");
  ADCProm = ADCSuma / 100;
  VrefProm = VrefSuma / 100;
  Serial.print(ADCProm);
  Serial.print(" ");
  Serial.println(VrefProm);

  ADCRef = ADCProm;
  VrefProm = Vref;
}

void CalIrms() {
  do {
    adcZ = ads.readADC_SingleEnded(0) - (ADCRef / 2); //13274 - 13340
    delayMicroseconds(20);
  } while (adcZ < 10);

  for (i = 0; i < Itera; i++) {
    adc2 = (ads.readADC_SingleEnded(0) * Vref / ADCRef) - (Vref / 2);
    delayMicroseconds(33);
    valorMax2 = adc2 * adc2 + valorMax2;
  }
  corriente = sqrt(valorMax2 / Itera);
  valorMax2 = 0;

}

void CalVrms() {
  do {
    adcZ = ads.readADC_SingleEnded(2) - (ADCRef / 2); //13274 - 13340
    delayMicroseconds(20);
    //Serial.println(adcZ);
  } while (adcZ < 10);

  for (i = 0; i < Itera; i++) {
    adc1 = (ads.readADC_SingleEnded(2) * Vref / ADCRef) - (Vref / 2);
    delayMicroseconds(33);
    valorMax1 = adc1 * adc1 + valorMax1;
  }
  tension = sqrt(valorMax1 / Itera) * CONST_TENSION;
  valorMax1 = 0;
}

void FP() {
  unsigned long time1, time2;
  float rad, pi = 3.14159, phase;

  do {
    adcZ = ads.readADC_SingleEnded(0) - (ADCRef / 2); //13274 - 13340
    delayMicroseconds(20);
  } while (adcZ < 10);

  time1 = millis();
  Serial.print(" t1:");
  Serial.print(time1);
  do {
    adcZ = ads.readADC_SingleEnded(2) - (ADCRef / 2); //13274 - 13340
    delayMicroseconds(20);
  } while (adcZ < 10);

  time2 = millis();
  Serial.print(" t2:");
  Serial.print(time2);
  phase = ((time2 - time1) * 360)/(16); 
  Serial.print(" fa:");
  Serial.print(phase);
  rad = (phase*pi)/(180);
  Serial.print("rad");
  Serial.print(rad);
  fp = sqrt(cos(rad)*cos(rad));
  Serial.print(" fp:");
  Serial.print(fp);
}

Este código mide muy bien la corriente y el voltaje, el problema es al momento de medir el factor de potencia, ya que para poder medir dicho factor (llamado FP en el código), necesito el ángulo de fase, dicho ángulo lo calculo midiendo el tiempo que está desfasada una onda de otra al momento de cruzar por cero. Pero dicho tiempo siempre marca el mismo valor. El pin analógico 0 es la corriente y el 2 es el voltaje, el pin 1 lo tengo conectado a 3.3V del ESP para poder tomar la referencia del ADC.