Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
fredokF

fredok

@fredok
About
Posts
16
Topics
1
Shares
0
Groups
0
Followers
0
Following
0

Posts

Recent Best Controversial

  • SCT-013-030 current monitor sensor
    fredokF fredok

    fine thx....

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    great !!!!!

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    hello,

    1. the constant 30 is the divide between ratio/burden resistor including inside the clamp
      for me ration=1800 and R=62ohm (1800/62 approx 30)
      http://www.planete-domotique.com/notices/S/C/SCT013-030V.pdf
    2. i can see 1677 Wh=1,677 kWh ... but 1900W for only TV+fridge its many
      mine clamp2 log in domoticz
      0_1490978374266_grphclamp2.jpg
    3. Maybe it can help u??? i have a pulse powercounter count every flash (1 Wh of energy) of mine electric box and the power (Watt) send to gw is wrong in domoticz but the energy counting (kWh) is great.
      0_1490978648613_grphclamp2.jpg
      Where come the wrong of fake power (GW ? sketch ? domoticz , i dont know)
      bye
    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    a clamp measure only intensity I (in A) and Power =UrmsxIrms so if in u home Urms=241V u can change with this value but the power measurment not consider cosphy
    by example the power measurment of my fridge =257W but true value is (with cosphy) 257x0,56=....W
    so if u change 232V with 241V why not but at the end its will continu to be a approximate of the true power.
    bye

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    its seem good kWh every 2min
    1864W is the power value

    send(IrmsMsg1.set(intrms * 232.0, 1));
    

    the sketch send power value P (in W) and energy (in kWh) calculated over 2min.

    double energie = (intrms * 232.0 * SEND_FREQUENCY / 1000) / 3.6E6;
    
    // and after
    nrj1 += energie;
    send(kWhMsg1.set(nrj1, 5));
    

    in domoticz i have one "dispositif" included instant power Watt and day cumulate energy kWh
    bye

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    ahoj, if not working i will try with a new arduino for test the code.
    dobrý večer

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    hello, i see the sketch send everyloop ???
    try this

    #define MY_DEBUG
    #define MY_RADIO_NRF24
    // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3  ***/
    #include <SPI.h>
    #include <MySensors.h>
    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance
    
    #define CHILD_ID_CLAMP1 0
    #define PIN_ANALOG_I1 A2 //pince amperemetrique1
    
    unsigned long lastSend_power = millis();
    unsigned long lastSend_c = millis();
    unsigned long SEND_FREQUENCY = 120000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    unsigned long SEND_FREQUENCY_C = SEND_FREQUENCY / 30;
    int index = 0;
    double Irms1 = 0;
    boolean pcReceived1 = false;
    float nrj1 = 0, old_nrj1;
    
    MyMessage IrmsMsg1(CHILD_ID_CLAMP1, V_WATT);
    MyMessage kWhMsg1(CHILD_ID_CLAMP1, V_KWH);
    MyMessage pcMsg1(CHILD_ID_CLAMP1, V_VAR1);
    
    void before() {
    
    }
    
    
    void presentation()
    {
      sendSketchInfo("Multisensors_Entree", "2.0");  // Send the sketch version information to the gateway and Controller
      present(CHILD_ID_CLAMP1, S_POWER);   // Register this device as power sensor
      request(CHILD_ID_CLAMP1, V_VAR1);
    }
    
    
    void receive(const MyMessage &message)
    {
      if (message.type == V_VAR1)
      {
        nrj1 = old_nrj1 = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj1);
        pcReceived1 = true;
      }
    }
    
    void setup()
    {
      emon1.current(PIN_ANALOG_I1, 30.0);       // Current: input pin, calibration.
      Serial.println("SETUP completed");
    }
    
    void envoi_donnees(double intrms, int id_clamp)
    {
      Serial.print("Envoi des donnees .... clamp="); Serial.println(id_clamp);
      double energie = (intrms * 232.0 * SEND_FREQUENCY / 1000) / 3.6E6;
      switch (id_clamp) //can be modified ...
      {
        case 1:
          {
            send(IrmsMsg1.set(intrms * 232.0, 1));
            nrj1 += energie;
            send(kWhMsg1.set(nrj1, 5));
            send(pcMsg1.set(nrj1, 5));
            old_nrj1 = nrj1;
          }
          break;
      }
    }
    
    void loop() {
      unsigned long now = millis();
      bool sendTime_c = now - lastSend_c > SEND_FREQUENCY_C;
      // Calcul de Irms1 et Irms2
      if (sendTime_c) //calcul Irms moy clamp1/clamp2
      {
        if (index == 0)
        {
          Irms1 = emon1.calcIrms(1480);
        }
        else  
        {
          Irms1 = (index * Irms1 + emon1.calcIrms(1480)) / (index + 1);
        }
        lastSend_c = now;
        index++;
      }
    
    bool sendTime_power = now - lastSend_power > SEND_FREQUENCY;
    
     if (sendTime_power)
    {
    
      // Envoi ou request Puissance1
      if (pcReceived1) envoi_donnees(Irms1, 1);
      else     {
        request(CHILD_ID_CLAMP1, V_VAR1);
        Serial.println("Request VAR1");
      }
      //on reinitialise les compteurs
      lastSend_power = now;
      index = 0;
      }
    }
    

    if problem copy the screen of monitor.thx

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    .... u must to look the monitor for see "Envoi des données .... clamp=0" and after (a few minutes after) "Envoi des données .... clamp=1"
    Look after ur domotic soft for see if your gw become something.
    0_1490792642229_clamp1.jpg
    0_1490792655751_clamp2.jpg

    bye.

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    Hello, at the end i write a v2.0 of the sketch

    //#include <Arduino.h>
    #define MY_DEBUG
    #define MY_RADIO_NRF24
    // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3  ***/
    #include <SPI.h>
    #include <MySensors.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance
    EnergyMonitor emon2;
    
    #define CHILD_ID_CLAMP1 0
    #define CHILD_ID_CLAMP2 1
    #define CHILD_ID_TEMP 2
    #define CHILD_ID_LDR 3
    
    #define PIN_ANALOG_I1 A2 //pince amperemetrique1
    #define PIN_ANALOG_I2 A3
    #define PIN_LDR A0 // LDR
    #define PIN_DALLAS 3
    
    //Definition de dallas
    #define MAX_ATTACHED_DS18B20 1
    #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
    OneWire oneWire(PIN_DALLAS);
    DallasTemperature sensors(&oneWire);
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors = 1;
    bool receivedConfig = false;
    bool metric = true; //truc v2.0
    
    //int compat = 0;
    unsigned long lastSend_temp = millis();
    unsigned long lastSend_power = millis();
    unsigned long lastSend_c;
    unsigned long SEND_FREQUENCY = 120000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    unsigned long SEND_FREQUENCY_TEMP = 300000; //delais d'emission entre 2 mesures de temps
    unsigned long SEND_FREQUENCY_C = SEND_FREQUENCY / 30;
    int index = 0;
    double Irms1 = 0;
    double Irms2 = 0;
    boolean pcReceived1 = false;
    boolean pcReceived2 = false;
    boolean first_time_temp = HIGH;
    
    float nrj1 = 0, old_nrj1;
    float nrj2 = 0, old_nrj2;
    int ldr = 0, old_ldr;
    
    MyMessage IrmsMsg1(CHILD_ID_CLAMP1, V_WATT);
    MyMessage kWhMsg1(CHILD_ID_CLAMP1, V_KWH);
    MyMessage pcMsg1(CHILD_ID_CLAMP1, V_VAR1);
    MyMessage IrmsMsg2(CHILD_ID_CLAMP2, V_WATT);
    MyMessage kWhMsg2(CHILD_ID_CLAMP2, V_KWH);
    MyMessage pcMsg2(CHILD_ID_CLAMP2, V_VAR2);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgLight(CHILD_ID_LDR, V_LIGHT_LEVEL);
    
    void before() {
      sensors.begin();
    }
    
    
    void presentation()
    {
    
      sendSketchInfo("Multisensors_Entree", "2.0");  // Send the sketch version information to the gateway and Controller
      present(CHILD_ID_CLAMP1, S_POWER);   // Register this device as power sensor
      request(CHILD_ID_CLAMP1, V_VAR1);
      present(CHILD_ID_CLAMP2, S_POWER);   // Register this device as power sensor
      request(CHILD_ID_CLAMP2, V_VAR2);
      numSensors = sensors.getDeviceCount(); //compte le nb de ds18
      present(CHILD_ID_TEMP, S_TEMP);
      present(CHILD_ID_LDR, S_LIGHT_LEVEL);
    }
    
    
    void receive(const MyMessage &message)
    {
      if (message.type == V_VAR1)
      {
        nrj1 = old_nrj1 = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj1);
        pcReceived1 = true;
      }
    
      if (message.type == V_VAR2)
      {
        nrj2 = old_nrj2 = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj2);
        pcReceived2 = true;
      }
    
    }
    
    void setup()
    {
      sensors.setWaitForConversion(false);
      emon1.current(PIN_ANALOG_I1, 30.0);       // Current: input pin, calibration.
      emon2.current(PIN_ANALOG_I2, 30.0);
      Serial.println("SETUP completed");
    }
    
    void envoi_donnees(double intrms, int id_clamp)
    {
      Serial.print("Envoi des donnees .... clamp="); Serial.println(id_clamp);
      double energie = (intrms * 232.0 * SEND_FREQUENCY / 1000) / 3.6E6;
      switch (id_clamp)
      {
        case 1:
          {
            send(IrmsMsg1.set(intrms * 232.0, 1));
            nrj1 += energie;
            send(kWhMsg1.set(nrj1, 5));
            send(pcMsg1.set(nrj1, 5));
            old_nrj1 = nrj1;
          }
          break;
        case 2:
          {
            send(IrmsMsg2.set(intrms * 232.0, 1));
            nrj2 += energie;
            send(kWhMsg2.set(nrj2, 5));
            send(pcMsg2.set(nrj2, 5));
            old_nrj2 = nrj2;
          }
          break;
      }
    }
    
    void loop() {
      unsigned long now = millis();
      bool sendTime_c = now - lastSend_c > SEND_FREQUENCY_C;
      // Calcul de Irms1 et Irms2
      if (sendTime_c) //calcul Irms moy clamp1/clamp2
      {
        if (index == 0)
        {
          Irms1 = emon1.calcIrms(1480);
          Irms2 = emon2.calcIrms(1480);
        }
        else  
        {
          Irms1 = (index * Irms1 + emon1.calcIrms(1480)) / (index + 1);
          Irms2 = (index * Irms2 + emon2.calcIrms(1480)) / (index + 1);
        }
        lastSend_c = now;
        index++;
      }
    
      bool sendTime_temp = now - lastSend_temp > SEND_FREQUENCY_TEMP;
      if (sendTime_temp || first_time_temp)
      {
        Serial.println("........ quoiqu'il arrive, on envoi la temp+ldr");
        first_time_temp = LOW;
        //Send Temp
        // Envoi Température d'après https://github.com/mysensors/MySensorsArduinoExamples/blob/master/examples/DallasTemperatureSensor/DallasTemperatureSensor.ino
        sensors.requestTemperatures();
        sleep(750);
        for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++)
          {
         // float temperature = static_cast<float>(static_cast<int>((getConfig().isMetric ? sensors.getTempCByIndex(i) : sensors.getTempFByIndex(i)) * 10.)) / 10.;
          float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
          if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00)
          {
    
            // Send in the new temperature
            send(msgTemp.setSensor(i).set(temperature, 1));
            Serial.println(".....................Envoi Temp");
            // Save new temperatures for next compare
            lastTemperature[i] = temperature;
          }
        }
     
      //Send light LDR
      //Envoi Light LDR
      ldr = (1023 - analogRead(PIN_LDR)) / 10.23;
      if (old_ldr != ldr)
      {
        send(msgLight.set(ldr));
        old_ldr = ldr;
      }
       lastSend_temp=now;
      }
    
    
    
     bool sendTime_power = now - lastSend_power > SEND_FREQUENCY;
    
     if (sendTime_power)
    {
    
      // Envoi ou request Puissance1
      if (pcReceived1) envoi_donnees(Irms1, 1);
      else     {
        request(CHILD_ID_CLAMP1, V_VAR1);
        Serial.println("Request VAR1");
      }
    
    
      // Envoi ou request Puissance2
      if (pcReceived2) envoi_donnees(Irms2, 2);
      else     {
        request(CHILD_ID_CLAMP2, V_VAR2);
        Serial.println("Request VAR2");
      }
      //on reinitialise les compteurs
      lastSend_power = now;
      index = 0;
      }
    }
    
    
    
    
    
    

    attention, i use in the same node a ds18b20 for temp and LRD for light measurment
    so u need to delete part of sketch.
    i just compiling/Verifying this with mysensors v2.1 (but not loaded in arduino pro) and no error
    for emonlib => https://github.com/openenergymonitor/EmonLib

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    @warmaniac
    Sorry i not update this sketch ...

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    Hello, sorry for my late reply.
    About the sketch,

    1. At the beginning, the sketch request the last kWh to the GW (I use Domoticz, so GW ask Domoticz the last kWh value) and send to the node.
    2. If node receiv, the variable pcreceiv=true and it working fine else node wait for the request until he receiv. A serial.print will inform if receiv.

    Fredok

    Hardware

  • Curent sensor/power with 2xcts013-30 + light + temperature
    fredokF fredok

    Hello everybody today i upgrade my 1 cts013 power sensor with a second curent sensor.
    this is my new sketch (since now, it seem to work ...)

    #include <Arduino.h>
    
    // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3  ***/
    #include <SPI.h>
    #include <MySensor.h>  
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance
    EnergyMonitor emon2;
    
    #define CHILD_ID_CLAMP1 0 
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_LDR 2
    #define CHILD_ID_CLAMP2 3
    
    #define PIN_ANALOG_I1 A2 //pince amperemetrique1
    #define PIN_ANALOG_I2 A3
    #define PIN_LDR A0 // LDR
    #define PIN_DALLAS 3
    
    MySensor gw;
    //Definition de dallas
    #define MAX_ATTACHED_DS18B20 1
    OneWire oneWire(PIN_DALLAS);
    DallasTemperature sensors(&oneWire);
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=1;
    int compat =0;
    unsigned long lastSend=millis();
    unsigned long lastSend_c;
    unsigned long SEND_FREQUENCY = 90000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    unsigned long SEND_FREQUENCY_C = SEND_FREQUENCY / 30;
    int index_temp =3;
    int index_temp_max =2;
    int index = 0;
    double Irms1=0;
    double Irms2=0;
    //double power1;
    //double power2;
    boolean pcReceived1 = false;
    boolean pcReceived2 = false;
    boolean onyva=true;
    float nrj1=0, old_nrj1;
    float nrj2=0, old_nrj2;
    int ldr=0, old_ldr;
    
    MyMessage IrmsMsg1(CHILD_ID_CLAMP1,V_WATT);
    MyMessage kWhMsg1(CHILD_ID_CLAMP1,V_KWH);
    MyMessage pcMsg1(CHILD_ID_CLAMP1,V_VAR1);
    MyMessage IrmsMsg2(CHILD_ID_CLAMP2,V_WATT);
    MyMessage kWhMsg2(CHILD_ID_CLAMP2,V_KWH);
    MyMessage pcMsg2(CHILD_ID_CLAMP2,V_VAR2);
    MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP);
    MyMessage msgLight(CHILD_ID_LDR,V_LIGHT_LEVEL);
    
    void incomingMessage(const MyMessage &message) 
    {
      if (message.type==V_VAR1) 
      {  
        nrj1 = old_nrj1 = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj1);
        pcReceived1 = true;
      }
    
       if (message.type==V_VAR2) 
      {  
        nrj2 = old_nrj2 = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj2);
        pcReceived2 = true;
      }
    
    }
    
    void setup()
    { 
      sensors.begin();
      numSensors = sensors.getDeviceCount(); //compte le nb de ds18 
      
      gw.begin(incomingMessage);
      gw.sendSketchInfo("Energy Meter", "1.0");  // Send the sketch version information to the gateway and Controller
      gw.present(CHILD_ID_CLAMP1, S_POWER);   // Register this device as power sensor
      gw.request(CHILD_ID_CLAMP1, V_VAR1);
      gw.present(CHILD_ID_CLAMP2, S_POWER);   // Register this device as power sensor
      gw.request(CHILD_ID_CLAMP2, V_VAR2);
      gw.present(CHILD_ID_TEMP, S_TEMP);
      gw.present(CHILD_ID_LDR, S_LIGHT_LEVEL);
      emon1.current(PIN_ANALOG_I1, 30.0);       // Current: input pin, calibration.
      emon2.current(PIN_ANALOG_I2, 30.0);
      Serial.println("SETUP completed");
    }
    
    void envoi_donnees(double intrms, int id_clamp)
      {
        Serial.print("Envoi des donnees .... clamp=");Serial.println(id_clamp);
        double energie = (intrms*232.0*SEND_FREQUENCY/1000)/3.6E6;
        switch (id_clamp) 
          {
            case 1:
              {
                gw.send(IrmsMsg1.set(intrms*232.0,1));
                nrj1 += energie;
                gw.send(kWhMsg1.set(nrj1,5));
                gw.send(pcMsg1.set(nrj1,5));
                old_nrj1=nrj1;
              }
              break;
              case 2:
              {
                gw.send(IrmsMsg2.set(intrms*232.0,1));
                nrj2 += energie;
                gw.send(kWhMsg2.set(nrj2,5));
                gw.send(pcMsg2.set(nrj2,5));
                old_nrj2=nrj2;
              }
              break;
          }
      }
    
    void loop()
    {
      if (onyva) gw.process();
      onyva = false; 
      unsigned long now = millis();
      bool sendTime_c = now - lastSend_c > SEND_FREQUENCY_C;
      // Calcul de Irms1 et Irms2
      if (sendTime_c) //calcul Irms moy clamp1/clamp2
      {
        if (index==0) 
        { 
          Irms1=emon1.calcIrms(1480);
          Irms2=emon2.calcIrms(1480);
        }
        else  {
                Irms1 = (index*Irms1+emon1.calcIrms(1480))/(index+1);
                Irms2 = (index*Irms2+emon2.calcIrms(1480))/(index+1);
              }
        lastSend_c = now;
        index++;
      }
      
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (sendTime) 
      { 
        // quoiqu'il arrive, on envoi la temp+ldr
        index_temp++;
        if (index_temp>index_temp_max)
          {
            index_temp=0;
            sensors.requestTemperatures();
            for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) 
              {
                float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                if (lastTemperature[i] != temperature && temperature != -127.00) 
                  {
                       gw.send(msgTemp.setSensor(i).set(temperature,1));
                       lastTemperature[i]=temperature;
                  }
              }
              ldr = (1023-analogRead(PIN_LDR))/10.23;
              if (old_ldr != ldr) 
                {
                  gw.send(msgLight.set(ldr));
                  old_ldr = ldr;
                }
          }
          
        if (pcReceived1)
        {
          // on envoi les données de puissance+nrj+vvar1  
          envoi_donnees(Irms1,1);  
        }
        else
        {
          //on demande les données au gw
          gw.request(CHILD_ID_CLAMP1, V_VAR1);
          Serial.println("Request VAR1");
        }
    
        if (pcReceived2)
        {
          envoi_donnees(Irms2,2); 
        }
        else
        {
          gw.request(CHILD_ID_CLAMP2, V_VAR2);
          Serial.println("Request VAR2");
        }
        //on reinitialise les compteurs
              lastSend=now;
              index=0;
              onyva=true;
      }
    
    }
    

    :point_right: For each cts013 circuit, i use the classic circuit (http://systemadmin.es/wp-content/uploads/emolib_schema.jpg)
    :point_right: be carefull, with only curent sensor, the sketch can't calculate true power P (active power P=UxIxcos(phi)) but only P=UxI) (look like OWL cm180).
    :point_right: Sorry for my english ....
    have a nice day...:smiley:

    My Project

  • SCT-013-030 current monitor sensor
    fredokF fredok

    hummm. i use this sketch with arduino mini near the GW (approx 5m max / 1 Wall) and i not see disconnection. So i cant help u.

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    Hello chatainsim, in my domoticz i have only one device counting (kWh+instant Power)
    0_1460535247416_upload-ddcdf9df-e7f6-441a-bdc0-2d426f76aa27
    0_1460535269881_upload-a2371cbe-49f0-497d-af85-7e2433941d15

    The instant power updated every 90s is writing in Watt value(83.3) , the kWh of the day (1.174) and total energy (61.582 kWh).... the device log show the power = f(t).
    Look if Watt value in (kWhMeter) device change, look the log graph ... if is ok, u not need Wattmeter device.
    Thx Fredok

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    Sorry, I'm late debause i come back holiday today
    This sketch send Power and energy (kWh) every Sendfrequency=90s but the sketch not measure power every 90s but everyre 90/25=3,6s and send to the GW the mean power (Pmean)
    this is calculate here :
    if (index==0) Irms=emon1.calcIrms(1480);
    else {
    index++;
    Irms = (index*Irms+emon1.calcIrms(1480))/(index+1);
    }
    lastSend2 = now;

    Hardware

  • SCT-013-030 current monitor sensor
    fredokF fredok

    Hello, if i remember physics course in university Power P=u.i and energy E=integrale(Pdt)=integrale(u.i.dt)=UeffxIeffxcos(phi)
    but for particular citizen same me, energy provider non consider cos(phi)

    So, i correct my last sketch for request last nrj value to the gw.

    // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3  ***/
    #include <SPI.h>
    #include <MySensor.h>  
    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance
    #define CHILD_ID 0 
    #define PIN_ANALOG_I A2
    MySensor gw;
    unsigned long lastSend;
    unsigned long lastSend2;
    unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25;
    int index = 0;
    double Irms=0;
    double power;
    boolean pcReceived = false;
    boolean onyva=true;
    float nrj=0, old_nrj;
    MyMessage IrmsMsg(CHILD_ID,V_WATT);
    MyMessage kWhMsg(CHILD_ID,V_KWH);
    MyMessage pcMsg(CHILD_ID,V_VAR1);
    
    
    void incomingMessage(const MyMessage &message) 
    {
      if (message.type==V_VAR1) 
      {  
        nrj = old_nrj = message.getFloat();
        Serial.print("Received last nrj count from gw:");
        Serial.println(nrj);
        pcReceived = true;
      }
    }
    
    void setup()
    {  
      gw.begin(incomingMessage);
      gw.sendSketchInfo("Energy Meter", "1.0");  // Send the sketch version information to the gateway and Controller
      gw.present(CHILD_ID, S_POWER);   // Register this device as power sensor
      gw.request(CHILD_ID, V_VAR1);
      emon1.current(PIN_ANALOG_I, 30.0);       // Current: input pin, calibration.
    }
    
    void loop()
    {
      if (onyva) gw.process();
      onyva = false; 
      unsigned long now = millis();
      //unsigned long now2 = millis();
      bool sendTime2 = now - lastSend2 > SEND_FREQUENCY2;
      if (sendTime2) //calcul Irms moy
      {
        if (index==0) Irms=emon1.calcIrms(1480);
        else {
        index++;
        Irms = (index*Irms+emon1.calcIrms(1480))/(index+1);
        }
        lastSend2 = now;
      }
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (sendTime && pcReceived) 
      { 
        power = Irms*232.0;
        gw.send(IrmsMsg.set(power,1));
        Serial.println(Irms*232.0);
        nrj += (power*SEND_FREQUENCY/1000)/3.6E6;
        gw.send(kWhMsg.set(nrj,5));
        gw.send(pcMsg.set(nrj,5));
        lastSend = now;
        index = 0;
        old_nrj=nrj;
        onyva=true;
      }
     else if (sendTime && !pcReceived)
     {
      gw.request(CHILD_ID, V_VAR1);
      lastSend=now;
      index=0;
      onyva=true;
     }
    }
    
    

    thx...

    Hardware
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular