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
  1. Home
  2. Troubleshooting
  3. Problem with optimizing power consumption

Problem with optimizing power consumption

Scheduled Pinned Locked Moved Troubleshooting
8 Posts 3 Posters 1.5k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • vgaV Offline
    vgaV Offline
    vga
    wrote on last edited by
    #1

    Hi,

    i´ve made a sensor with the following hardware:

    Arduino Mini Pro 3,3v 8Mhz: removed regulator, removed power-LED
    NRF24L01+ Tranceiver
    Water-Flow Sensor

    The Flow-Sensor works, but now i want to power it with a battery:
    In measuring mode, the consumption is 19mA, when entering gw.sleep the power consumption of the Sensor reduces to 2mA.
    (also if I disconnect the Flow Sensor, and only the Transceiver is connected to the Arduino, it is still 2mA)
    Is there a way to optimize the power consumption more?
    I´ve heard about 120uA in sleep mode?
    Maybe the gw.sleep does not turn of the ADC, SPI, BOD, like the LowPower library?
    BTW, when i try to include the LowPower library, the arduino IDE says, it is not possible to compile LowPower for Arduino Pro Mini.

    Here is my code:

    
    // Sleep Mode Libraries laden
    #include <avr/sleep.h>
    #include <avr/power.h> 
    
    // MySensor Library hinzufügen
    #include <SPI.h>
    #include <MySensor.h> 
    
    #define CHILD_ID 0   // Id of the sensor child
    
    
    //Batteriestatus 
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    int oldBatteryPcnt = 0;
    
    
    MySensor gw;
    MyMessage flowMsg(CHILD_ID,V_FLOW);
    MyMessage volumeMsg(CHILD_ID,V_VOLUME);
    
     
    volatile int NbTopsFan; //measuring the rising edges of the signal
    float Calc;                               
    int hallsensor = 3;    //The pin location of the sensor
    
    unsigned int flowMilliLitres;
    unsigned int lastFlowVal;
    
    long totalMilliLitres;
    long lastTotalVal;
     
    void rpm ()     //This is the function that the interupt calls 
    { 
      NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
    } 
    
    // The setup() method runs once, when the sketch starts
    void setup() //
    { 
    
      // Start Gateway Kommunikation
      gw.begin();
      
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Water Flow Sensor", "1.0");     
      // Register all sensors to gw (they will be created as child devices)  
      gw.present(CHILD_ID, S_WATER);
    
      
      pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
      Serial.begin(115200); //This is the setup function where the serial port is initialised,
      attachInterrupt(1, rpm, RISING); //and the interrupt is attached 1 = Digital Pin 3!
    
      // Batteriestatus
      // use the 1.1 V internal reference
      #if defined(__AVR_ATmega2560__)
       analogReference(INTERNAL1V1);
      #else
       analogReference(INTERNAL);
      #endif
    } 
    // the loop() method runs over and over again,
    // as long as the Arduino has power
    void loop ()    
    {
       
      NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
      sei();      //Enables interrupts
    
     if(flowMilliLitres == 0){
        delay (500);
      
        gw.sleep(300000); 
      }
      
      delay (1000);   //Wait 1 second
      cli();      //Disable interrupts
      Calc = (NbTopsFan / 7.5); //(Pulse frequency) / 7.5Q, = flow rate in L/min 
      Serial.print (Calc); //Prints the number calculated above
      Serial.print (" L/min\r\n"); //Prints "L/min" and returns a  new line
      int val=(int)Calc;
    
      // Divide the flow rate in litres/minute by 60 to determine how many litres have
      // passed through the sensor in this 1 second interval, then multiply by 1000 to
      // convert to millilitres.
      flowMilliLitres = (Calc / 60) * 1000;
        
      // Add the millilitres passed in this second to the cumulative total
      totalMilliLitres += flowMilliLitres;
    
      // Print the number of litres flowed in this second
      Serial.print("  Current Liquid Flowing: ");             // Output separator
      Serial.print(flowMilliLitres);
      Serial.print("mL/Sec");
      if(lastFlowVal != flowMilliLitres){
        gw.send(flowMsg.set(flowMilliLitres));
        lastFlowVal = flowMilliLitres;
      }
      
    
      // Print the cumulative total of litres flowed since starting
      Serial.print("  Output Liquid Quantity: ");             // Output separator
      Serial.print(totalMilliLitres);
      Serial.println("mL"); 
      if(lastTotalVal != totalMilliLitres){
        gw.send(volumeMsg.set(totalMilliLitres));
        lastTotalVal = totalMilliLitres;
        //Starting at the first byte on the eeprom.   
        //EEPROMWritelong(address, totalMilliLitres);
      }
    
    
      // get the battery Voltage
       int sensorValue = analogRead(BATTERY_SENSE_PIN);
       #ifdef DEBUG
       Serial.println(sensorValue);
       #endif
       
       // 1M, 470K divider across battery and using internal ADC ref of 1.1V
       // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
       // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
       // 3.44/1023 = Volts per bit = 0.003363075
       float batteryV  = sensorValue * 0.003363075;
       int batteryPcnt = sensorValue / 10;
    
       #ifdef DEBUG
       Serial.print("Battery Voltage: ");
       Serial.print(batteryV);
       Serial.println(" V");
    
       Serial.print("Battery percent: ");
       Serial.print(batteryPcnt);
       Serial.println(" %");
       #endif
       gw.sendBatteryLevel(batteryPcnt);
    
        
      
    }
    

    Would be nice to get some tipps for reducing the power consumption more, thanks!

    YveauxY 1 Reply Last reply
    0
    • vgaV vga

      Hi,

      i´ve made a sensor with the following hardware:

      Arduino Mini Pro 3,3v 8Mhz: removed regulator, removed power-LED
      NRF24L01+ Tranceiver
      Water-Flow Sensor

      The Flow-Sensor works, but now i want to power it with a battery:
      In measuring mode, the consumption is 19mA, when entering gw.sleep the power consumption of the Sensor reduces to 2mA.
      (also if I disconnect the Flow Sensor, and only the Transceiver is connected to the Arduino, it is still 2mA)
      Is there a way to optimize the power consumption more?
      I´ve heard about 120uA in sleep mode?
      Maybe the gw.sleep does not turn of the ADC, SPI, BOD, like the LowPower library?
      BTW, when i try to include the LowPower library, the arduino IDE says, it is not possible to compile LowPower for Arduino Pro Mini.

      Here is my code:

      
      // Sleep Mode Libraries laden
      #include <avr/sleep.h>
      #include <avr/power.h> 
      
      // MySensor Library hinzufügen
      #include <SPI.h>
      #include <MySensor.h> 
      
      #define CHILD_ID 0   // Id of the sensor child
      
      
      //Batteriestatus 
      int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
      int oldBatteryPcnt = 0;
      
      
      MySensor gw;
      MyMessage flowMsg(CHILD_ID,V_FLOW);
      MyMessage volumeMsg(CHILD_ID,V_VOLUME);
      
       
      volatile int NbTopsFan; //measuring the rising edges of the signal
      float Calc;                               
      int hallsensor = 3;    //The pin location of the sensor
      
      unsigned int flowMilliLitres;
      unsigned int lastFlowVal;
      
      long totalMilliLitres;
      long lastTotalVal;
       
      void rpm ()     //This is the function that the interupt calls 
      { 
        NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
      } 
      
      // The setup() method runs once, when the sketch starts
      void setup() //
      { 
      
        // Start Gateway Kommunikation
        gw.begin();
        
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Water Flow Sensor", "1.0");     
        // Register all sensors to gw (they will be created as child devices)  
        gw.present(CHILD_ID, S_WATER);
      
        
        pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
        Serial.begin(115200); //This is the setup function where the serial port is initialised,
        attachInterrupt(1, rpm, RISING); //and the interrupt is attached 1 = Digital Pin 3!
      
        // Batteriestatus
        // use the 1.1 V internal reference
        #if defined(__AVR_ATmega2560__)
         analogReference(INTERNAL1V1);
        #else
         analogReference(INTERNAL);
        #endif
      } 
      // the loop() method runs over and over again,
      // as long as the Arduino has power
      void loop ()    
      {
         
        NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
        sei();      //Enables interrupts
      
       if(flowMilliLitres == 0){
          delay (500);
        
          gw.sleep(300000); 
        }
        
        delay (1000);   //Wait 1 second
        cli();      //Disable interrupts
        Calc = (NbTopsFan / 7.5); //(Pulse frequency) / 7.5Q, = flow rate in L/min 
        Serial.print (Calc); //Prints the number calculated above
        Serial.print (" L/min\r\n"); //Prints "L/min" and returns a  new line
        int val=(int)Calc;
      
        // Divide the flow rate in litres/minute by 60 to determine how many litres have
        // passed through the sensor in this 1 second interval, then multiply by 1000 to
        // convert to millilitres.
        flowMilliLitres = (Calc / 60) * 1000;
          
        // Add the millilitres passed in this second to the cumulative total
        totalMilliLitres += flowMilliLitres;
      
        // Print the number of litres flowed in this second
        Serial.print("  Current Liquid Flowing: ");             // Output separator
        Serial.print(flowMilliLitres);
        Serial.print("mL/Sec");
        if(lastFlowVal != flowMilliLitres){
          gw.send(flowMsg.set(flowMilliLitres));
          lastFlowVal = flowMilliLitres;
        }
        
      
        // Print the cumulative total of litres flowed since starting
        Serial.print("  Output Liquid Quantity: ");             // Output separator
        Serial.print(totalMilliLitres);
        Serial.println("mL"); 
        if(lastTotalVal != totalMilliLitres){
          gw.send(volumeMsg.set(totalMilliLitres));
          lastTotalVal = totalMilliLitres;
          //Starting at the first byte on the eeprom.   
          //EEPROMWritelong(address, totalMilliLitres);
        }
      
      
        // get the battery Voltage
         int sensorValue = analogRead(BATTERY_SENSE_PIN);
         #ifdef DEBUG
         Serial.println(sensorValue);
         #endif
         
         // 1M, 470K divider across battery and using internal ADC ref of 1.1V
         // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
         // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
         // 3.44/1023 = Volts per bit = 0.003363075
         float batteryV  = sensorValue * 0.003363075;
         int batteryPcnt = sensorValue / 10;
      
         #ifdef DEBUG
         Serial.print("Battery Voltage: ");
         Serial.print(batteryV);
         Serial.println(" V");
      
         Serial.print("Battery percent: ");
         Serial.print(batteryPcnt);
         Serial.println(" %");
         #endif
         gw.sendBatteryLevel(batteryPcnt);
      
          
        
      }
      

      Would be nice to get some tipps for reducing the power consumption more, thanks!

      YveauxY Offline
      YveauxY Offline
      Yveaux
      Mod
      wrote on last edited by
      #2

      @vga did you try searching the forum first?
      There are numerous topics on power consumption in sleep mode, containing many tips!

      http://yveaux.blogspot.nl

      1 Reply Last reply
      0
      • vgaV Offline
        vgaV Offline
        vga
        wrote on last edited by
        #3

        yes, i used the search function, but there are no tips which are helpful for my problem.
        While sleep mode, using gw.sleep, the power consumption is still 2mA.

        AWIA 1 Reply Last reply
        0
        • vgaV vga

          yes, i used the search function, but there are no tips which are helpful for my problem.
          While sleep mode, using gw.sleep, the power consumption is still 2mA.

          AWIA Offline
          AWIA Offline
          AWI
          Hero Member
          wrote on last edited by
          #4

          @vga The gw.sleep() lets you go as low as 2uA so there must be something else in your circuit which still consumes.. Maybe (internal) pull-ups?

          1 Reply Last reply
          0
          • vgaV Offline
            vgaV Offline
            vga
            wrote on last edited by
            #5

            @AWI you are right. My fault, I checked again my wiring. the flow sensor is connected to vcc, so it consumes permanently. disconnected and restarted the arduino, the consumption in sleep is 0,1mA.

            so i tried to connect the flow sensor to a digital pin, set it to output mode and put it HIGH.
            When it go to sleep i set it to LOW.

            But I fail to see that it wake up again with interruptpin, when sensor change, but if it has no power, of course it can not change! :smirk:

            any idea how to make the best of it?
            timer interrupt is no alternative, cause of possible missing sensor activity.

            AWIA 1 Reply Last reply
            0
            • vgaV vga

              @AWI you are right. My fault, I checked again my wiring. the flow sensor is connected to vcc, so it consumes permanently. disconnected and restarted the arduino, the consumption in sleep is 0,1mA.

              so i tried to connect the flow sensor to a digital pin, set it to output mode and put it HIGH.
              When it go to sleep i set it to LOW.

              But I fail to see that it wake up again with interruptpin, when sensor change, but if it has no power, of course it can not change! :smirk:

              any idea how to make the best of it?
              timer interrupt is no alternative, cause of possible missing sensor activity.

              AWIA Offline
              AWIA Offline
              AWI
              Hero Member
              wrote on last edited by
              #6

              @vga What kind of flow sensor are you using? If you could use a passive type (i.e. reed contact) that would make the difference..

              1 Reply Last reply
              0
              • vgaV Offline
                vgaV Offline
                vga
                wrote on last edited by
                #7

                i am using this sensor:
                http://www.seeedstudio.com/wiki/images/b/b7/Water_flow_sensor_datasheet.pdf
                Do you know a "reed Sensor" for such a my sensor project?

                AWIA 1 Reply Last reply
                0
                • vgaV vga

                  i am using this sensor:
                  http://www.seeedstudio.com/wiki/images/b/b7/Water_flow_sensor_datasheet.pdf
                  Do you know a "reed Sensor" for such a my sensor project?

                  AWIA Offline
                  AWIA Offline
                  AWI
                  Hero Member
                  wrote on last edited by
                  #8

                  @vga The sensor you are referring to is working with "hall" effect. I can't find the internal schematics of the thing but I assume there are some active components to give you a nice square wave output. Another principle would be a magnet with reed (magnetic) contact which you can read with minimal current.
                  You can find the " rest" current by measuring the power line of the sensor .

                  1 Reply Last reply
                  0
                  Reply
                  • Reply as topic
                  Log in to reply
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes


                  25

                  Online

                  11.7k

                  Users

                  11.2k

                  Topics

                  113.1k

                  Posts


                  Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                  • Login

                  • Don't have an account? Register

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