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



  • 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;
      }
    
    }
    

    👉 For each cts013 circuit, i use the classic circuit (http://systemadmin.es/wp-content/uploads/emolib_schema.jpg)
    👉 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).
    👉 Sorry for my english ....
    have a nice day...😃


 

429
Online

7.8k
Users

8.7k
Topics

93.0k
Posts