Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. fredok
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    fredok

    @fredok

    2
    Reputation
    16
    Posts
    542
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    fredok Follow

    Best posts made by fredok

    • RE: SCT-013-030 current monitor sensor

      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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      .... 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.

      posted in Hardware
      fredok
      fredok

    Latest posts made by fredok

    • RE: SCT-013-030 current monitor sensor

      fine thx....

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      great !!!!!

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      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
      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      .... 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.

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      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

      posted in Hardware
      fredok
      fredok
    • RE: SCT-013-030 current monitor sensor

      @warmaniac
      Sorry i not update this sketch ...

      posted in Hardware
      fredok
      fredok