Navigation

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

    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