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!
-
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!
-
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. -
@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. -
@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. -
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? -
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 .