Monitor a DIY solarpanel with ASC712 - HELP



  • Has anyone gotten a ASC712 to work with a actuator node?

    I'm trying to monitor my diy solar panel, so that I can see what it is producing(if).

    I've tried with the code below, but I can't get the node to send the readings to the gateway. I'm using a 30A ASC712 to do the readings. (Don't mind the motion sensor part).

    My last code:

    // Example sketch showing how to control physical relays. 
    // This example will remember relay state even after power failure.
    
    #include <MySensor.h>
    #include <SPI.h>
    const int analogIn = A0;
    int mVperAmp = 66; // use 100 for 20A Module and 66 for 30A Module
    int RawValue= 0;
    int ACSoffset = 2500; 
    double Voltage = 0;
    double Amps = 0;
    double Voltage_new = 0;
    double Amps_new = 0;
    
    #define RELAY_1 6  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 2 // Total number of attached relays
    #define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    
    // Motion sensor defs
    unsigned long SLEEP_TIME = 10000; // Sleep time between reports (in milliseconds)
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motionsensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 3   // Id of the sensor child
    volatile int state = LOW;
    boolean lockLow = true;
    boolean lastTripped = 0;
    
    MySensor gw;
    MyMessage msgMotion(CHILD_ID, V_TRIPPED);
    MyMessage msgvolt(4, V_VOLTAGE);
    MyMessage msgcur(5, V_CURRENT);
    MyMessage msg(CHILD_ID, V_LIGHT);
    
    void setup()  
    {   
      // Initialize library and add callback for incoming messages
      gw.begin(incomingMessage, AUTO, true);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay/Motion Sensor", "1.0");
    
      // Fetch relay status
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        gw.present(sensor, S_LIGHT);
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
      }
      
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as  input
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_MOTION);
      // attachInterrupt(DIGITAL_INPUT_SENSOR, ON, CHANGE);
      //delay(30000);
      gw.present(4, V_VOLTAGE);
      gw.present(5, V_CURRENT);
    }
    
    
    void loop() 
    {
      // Alway process incoming messages whenever possible
      gw.process();
    
      //boolean tripped = (digitalRead(DIGITAL_INPUT_SENSOR) == HIGH);
      //  if (lastTripped != tripped ) {
    //	gw.send(msgMotion.set(tripped?"1":"0")); // Send new state
    //	lastTripped=tripped;
    //   }
      
      //Serial.print("Raw Value = " ); // shows pre-scaled value 
      //Serial.print(RawValue);
      //gw.send(msgvolt);
      //Serial.print("\t mV = "); // shows the voltage measured 
      //Serial.print(Voltage,3); // the '3' after voltage allows you to display 3 digits after decimal point
      //Serial.print("\t Amps = "); // shows the voltage measured
      for ( int i=0; i<=20; i++ ){
        RawValue += analogRead(analogIn);
        delay(50);
      }
      Voltage = (RawValue / 1023.0) * 5000; // Gets you mV
      Amps = ((Voltage - ACSoffset) / mVperAmp);
      
      //gw.send(msgcur);
      Serial.print("mV = "); // shows the voltage measured
      Serial.println(Voltage);
      //Serial.println(Amps,3); // the '3' after voltage allows you to display 3 digits after             decimal point
      //delay(2500);
    }
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
     if (message.type==V_LIGHT) {
     // Change relay state
     digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     gw.saveState(message.sensor, message.getBool());
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
     }
    }
    

    Any help would be appreciated 🙂

    PS: Att HEK - why isn't there a "insert code" button, just like the "insert link" button?


  • Admin

    @Hausner said:

    PS: Att HEK - why isn't there a "insert code" button, just like the "insert link" button?

    Sorry. Haven't found any nodebb-plugin which add this in the composer. So you have to surround code with 4 backticks ```` in the meantime.


  • Hero Member

    @Hausner Serial Monitor output OK?



  • No, serial monitor was just for testing. I would like to push it to mqtt.

    I found the V_VOLTAGE and V_CURRENT, and the serial monotir showed up correctly as 38/39.


  • Hero Member

    @Hausner So the problem is with the node transmitting anything to the gateway?

    Post the radio messages from the serial monitor and hopefully someone can tell you what's going on..


Log in to reply
 

Suggested Topics

  • 3
  • 2
  • 6
  • 1

56
Online

11.4k
Users

11.1k
Topics

112.7k
Posts