medidor de potencia Arduino

11

Quiero crear un medidor de potencia y usar arduino para registrar la información y enviarla a la web. ¿Hay alguna solución fácil para el medidor de potencia? Vivo en Argentina y la línea eléctrica es de 220V. Gracias

    
pregunta Mariano

6 respuestas

10

Puede consultar Tweet-a-Watt y ver si funcionará con su línea eléctrica de 220V. Ese proyecto debería al menos darte una idea de cómo empezar.

    
respondido por el Bill the Lizard
4

Echa un vistazo a estos proyectos:

  1. enlace
  2. enlace
  3. enlace
  4. enlace
  5. enlace
  6. enlace
  7. enlace
  8. enlace
  9. enlace

¿Suficiente? ;-)

    
respondido por el avra
3

Crear un medidor de potencia preciso no es una tarea trivial. Necesita una forma de detectar el voltaje y la corriente con suficiente precisión y velocidad para poder detectar las diferencias de fase entre ellos (factor de potencia) y calcular la potencia real y aparente. Casi desearías un DSP para esto.

La creación de un medidor de potencia rudimentario se puede hacer detectando y DC promediando el voltaje y la corriente, ignorando la potencia reactiva y la necesidad de muestrear a altas velocidades. La precisión variará en función de la calidad de la carga.

Hay circuitos integrados en el mercado específicamente para la medición de potencia, como Microchip MCP3909 , que Puede ser capaz de usar con tu Arduino.

    
respondido por el Adam Lawrence
1

Este sistema de Smart Energy Groups puede ser de interés, se basa en el hardware de Arduino, etc.

    
respondido por el user1307
1

Puede usar un sensor de efecto HALL (¿10-30e quizás?) con una placa Arduino.

    
respondido por el Savpek
0

He estado trabajando mucho en la construcción de monitores de energía conectados a la web utilizando el ESP8266 (con Arduino IDE) y varios DSP dedicados de monitoreo de energía de ADC ( ATM90E26 y ADE7763 ).

El diagrama

Fritzing del ADC + Wifi básico compatible con Arduino NodeMCU se muestra a continuación:

ElcódigoparausarelmonitordeenergíaESP8266ilustradoarribaestáaquí.TengaencuentaquesetratadeunasoluciónsimpledebajaprecisiónparaimplementarelmuestreodelvoltajeconuntransformadorylacorrienteconunCT.Lassolucionesdemayorprecisiónnecesitantomarmuestrasde240Vdirectamente(utilizandounaescaleradivisoradevoltajeyunaresistenciadederivación)yrequierenconsideracionesdediseñoadicionalesparamanejarlosproblemasquesurgenaltrabajarconaltosvoltajes.

/**Thissketchsendsads1115currentsensordataviaHTTPPOSTrequesttothingspeakserver.*Itneedsthefollowinglibrariestowork(besidestheesp8266standardlibrariessuppliedwiththeIDE):**-https://github.com/adafruit/Adafruit_ADS1X15**designedtorundirectlyonesp8266-01module,towhereitcanbeuploadedusingthismarvelouspieceofsoftware:**https://github.com/esp8266/Arduino**2015TishamDhar*licensedunderGNUGPL*/#include<ESP8266WiFi.h>#include<Wire.h>#include<Adafruit_ADS1015.h>//replacewithyourchannel'sthingspeakAPIkey,StringapiKey="XXXXXXXXXXXXX";
//WIFI credentials go here
const char* ssid     = "XXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXXXXXXXXXX";
Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

const char* server = "api.thingspeak.com";
WiFiClient client;

double offsetI;
double filteredI;
double sqI,sumI;
int16_t sampleI;
double Irms;

double squareRoot(double fg)  
{
  double n = fg / 2.0;
  double lstX = 0.0;
  while (n != lstX)
  {
    lstX = n;
    n = (n + fg / n) / 2.0;
  }
  return n;
}

double calcIrms(unsigned int Number_of_Samples)
{
  /* Be sure to update this value based on the IC and the gain settings! */
  float multiplier = 0.125F;    /* ADS1115 @ +/- 4.096V gain (16-bit results) */
  for (unsigned int n = 0; n < Number_of_Samples; n++)
  {
    sampleI = ads.readADC_Differential_0_1();

    // Digital low pass filter extracts the 2.5 V or 1.65 V dc offset, 
  //  then subtract this - signal is now centered on 0 counts.
    offsetI = (offsetI + (sampleI-offsetI)/1024);
    filteredI = sampleI - offsetI;
    //filteredI = sampleI * multiplier;

    // Root-mean-square method current
    // 1) square current values
    sqI = filteredI * filteredI;
    // 2) sum 
    sumI += sqI;
  }

  Irms = squareRoot(sumI / Number_of_Samples)*multiplier; 

  //Reset accumulators
  sumI = 0;
//--------------------------------------------------------------------------------------       

  return Irms;
}

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

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  ads.begin();
}

void loop() {


  //Serial.print("Differential: "); Serial.print(results); Serial.print("("); Serial.print(trans_volt); Serial.println("mV)");
  double current = calcIrms(2048);

  if (client.connect(server,80)) {  //   "184.106.153.149" or api.thingspeak.com
    String postStr = apiKey;
           postStr +="&field1=";
           postStr += String(current);
           postStr += "\r\n\r\n";

     client.print("POST /update HTTP/1.1\n"); 
     client.print("Host: api.thingspeak.com\n"); 
     client.print("Connection: close\n"); 
     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); 
     client.print("Content-Type: application/x-www-form-urlencoded\n"); 
     client.print("Content-Length: "); 
     client.print(postStr.length()); 
     client.print("\n\n"); 
     client.print(postStr);  
  }
  client.stop();

  //Serial.println("Waiting...");    
  // thingspeak needs minimum 15 sec delay between updates
  delay(20000);  
}
    
respondido por el whatnick

Lea otras preguntas en las etiquetas