Problem with optimizing power consumption
-
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 SensorThe 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!
-
@vga did you try searching the forum first?
There are numerous topics on power consumption in sleep mode, containing many tips!
-
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.
-
@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?
-
@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!
any idea how to make the best of it?
timer interrupt is no alternative, cause of possible missing sensor activity.
-
@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..
-
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?
-
@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 .