My 2AA battery sensor
-
@m26872 said:
I thought someone would ask why I expect a 3000mAh battery to supply 1mA for 6 months ?
Ok, I'll be the straight man here: why do you expect a 3000mAh battery to supply 1mA for around 4400 hours?
@Zeph Thank you.
Because it's 90% mAac (from dc source) and I think the china step-up isn't really that crappy after all. Energizing-deenergizing a a coil with no load will look like this without any real power produced. Of course there are loss power and wear on battery etc, but not compareable to 1mAdc. Deeper investigation to this should be the subject of a new thread. -
I'm getting about 3-4 months from my less active sensors, and the only hardware mod I'm using is the Arduino LED removal. So I can image removing the regulator and step LED would save a fair amount of energy.
I really need to get around to removing those....
-
This are my results, with low power arduino powerd on 2 AA alkaline batteries.
Door/window sensor (front door - opens frequently). On ocrober 4 battery status 64%, december 18 62% (still at 62%). 100% spike is when I reprogram my sensor. In 75 days battery drops for 2 % -> 100% in more than 10 years.
Code is available on GitHub.EasyIoT server battery status

Temperature and humidity sensor with DHT22 and step up regulator. Arduino and NFR24L is powered directly on 2 AA batteries, DHT22 is powered on step up regulator but only when measure is taken. Battery drops for 14% in 75 days. Actually this design is not so good. I'm testing new design without step up regulator and better temperature/humidity sensor. 2AA alkaline batteries could last 10 years.

This is my water leak sensor. I'm using 2 wasted AA batteries for testing, and voltage actually rise. Current consumption is about 6uA (self discharge is about 10 times bigger) practically all the time.
-
This are my results, with low power arduino powerd on 2 AA alkaline batteries.
Door/window sensor (front door - opens frequently). On ocrober 4 battery status 64%, december 18 62% (still at 62%). 100% spike is when I reprogram my sensor. In 75 days battery drops for 2 % -> 100% in more than 10 years.
Code is available on GitHub.EasyIoT server battery status

Temperature and humidity sensor with DHT22 and step up regulator. Arduino and NFR24L is powered directly on 2 AA batteries, DHT22 is powered on step up regulator but only when measure is taken. Battery drops for 14% in 75 days. Actually this design is not so good. I'm testing new design without step up regulator and better temperature/humidity sensor. 2AA alkaline batteries could last 10 years.

This is my water leak sensor. I'm using 2 wasted AA batteries for testing, and voltage actually rise. Current consumption is about 6uA (self discharge is about 10 times bigger) practically all the time.
@dopustko Looks nice. Can you please share a more detailed description of your hardware?
Edit: I searched and saw that you're running at 1MHz and soon with HTU21T. Very elegant! -
@dopustko Looks nice. Can you please share a more detailed description of your hardware?
Edit: I searched and saw that you're running at 1MHz and soon with HTU21T. Very elegant! -
@m26872 here is my complete description for MySensors door/window sensor. For other sensors I will add descriptions in the future...
@dopustko Great! I love your low-power guide. Wow! That should be mandatory for all sensors that work below 3.3V like e.g. a door switch. And you're able to use the internal battery monitoring method and all.
Also, when I looked at your diagram I realized that I probably did a mistake with my door switch connection to arduino and have a substantial current draw through the switch. If true it means that the step-up is innocent. -
@dopustko Great! I love your low-power guide. Wow! That should be mandatory for all sensors that work below 3.3V like e.g. a door switch. And you're able to use the internal battery monitoring method and all.
Also, when I looked at your diagram I realized that I probably did a mistake with my door switch connection to arduino and have a substantial current draw through the switch. If true it means that the step-up is innocent.@m26872 In fact most of sensors can work on 2 AA batteries without step up regulator if sensor is selected carefully. That also minimize number of components and battery consumption.
I'm using 1M pull up resistor instead of internal resistor (50-60K) - this lower power consumption. 1M is quite big but wires are short, so it's working ok. -
@m26872 here is my complete description for MySensors door/window sensor. For other sensors I will add descriptions in the future...
-
Hi @dopustko , i've checked your cool website. can I ask few question regarding your setup?
I saw this page, in order to get low power consumption, you did burn fuse and disable brown-out? Possible to use it without usbtinyisp? -
Good info here. Thought comes to mind about using a small solar cell off a defectivet walkway light to add a little charge back in to the system, when there is any kind of light around.
-
Just an update on my battery levels. My VeraLite Datamine-plugin won't longer plot for me. I suspect I'm out of VeraLite memory to handle all the data. This is it. (Look above for last graphs.)
Node 16: BatteryLevel 51
Node 101: Dead 03 Feb
Node 110; BatteryLevel 57
Node 105: BatteryLevel 80
Node 106: BatteryLevel 53
As I hoped, the decrease rate for 105 and 106 is now less than 5% per month and 6-month target is already passed by half.
The revenge of the Chinese step-up ?! -
Someone else noticed that one of the two batteries drained by the step-up always has negative(!) charge? Due to the AC-load? Could it be possible to extend battery life by adding some kind of capacitor?
-
Node 105 and 106 down just 1% since last post (22 days ago). Not bad. Relatively stable readings and low activity, but it doesn't matter since we're all expected the sleep mode consumption to be the worst.
-
@EasyIoT: Thank you for your nice descriptions of the low power sensors.
I have some questions regarding the temperature sensor:
Did you use a "Low power modified" Arduino for that as well?
How are you able to power the sensor via the step-up only when needed? Do you power the step-up via an digital pin or something?@m26872: Also thanks for your design. I am thinking of building something similar. So you got now about 5% battery drop per month using the china stepup with desoldered LED?
-
@EasyIoT: Thank you for your nice descriptions of the low power sensors.
I have some questions regarding the temperature sensor:
Did you use a "Low power modified" Arduino for that as well?
How are you able to power the sensor via the step-up only when needed? Do you power the step-up via an digital pin or something?@m26872: Also thanks for your design. I am thinking of building something similar. So you got now about 5% battery drop per month using the china stepup with desoldered LED?
@daenny said:
So you got now about 5% battery drop per month using the china stepup with desoldered LED?
Today I read Node 105: 78% and Node 106: 51%. That's only 2% in the last 38 days.

Edit: Perhaps using the "%" here is a little careless, but I think everyone knows that we're talking battery level.
-
@daenny said:
So you got now about 5% battery drop per month using the china stepup with desoldered LED?
Today I read Node 105: 78% and Node 106: 51%. That's only 2% in the last 38 days.

Edit: Perhaps using the "%" here is a little careless, but I think everyone knows that we're talking battery level.
@daenny yes, I'm using DO pin and MOSFET connected to step up regulator. But this is complicated solution. I'ts better to use different temperature sensor which can operate down to 1.8V. Right now I'm testing custom board with NRF24L and HTU21D (it's not cheap, but it can work down to 1,8V). Results are pretty good. Temperature and humidity sensor can operate more than 5 years on 2 AA batteries. For example door window sensor and water leak sensor can work more than 10 years on 2 AA batteries. It's seems that for those sensors AA batteries are overkill.
-
@daenny said:
So you got now about 5% battery drop per month using the china stepup with desoldered LED?
Today I read Node 105: 78% and Node 106: 51%. That's only 2% in the last 38 days.

Edit: Perhaps using the "%" here is a little careless, but I think everyone knows that we're talking battery level.
@m26872 I still dont get it. Why I cant get the same efficient power like you.
I already follow all of your requirement in the first thread - difference only I use breadboard.
The minimum consumption (sleep) that I've got still 2.4mA, compare to you, it still huge differences. I dont know what's wrong with my setup.My sketch wake up every 10s (consumption up to 3.5mA), while sleep the lowest is 2.4mA.
#include <avr/sleep.h> // Sleep Modes #include <MySensor.h> #include <SPI.h> MySensor gw; #define BATTERY_SENSE_PIN #define SLEEP_IN_MS 86400000 // 1 day #define PROD false int oldBatLevel; void setup() { gw.begin(NULL,1); gw.sendSketchInfo("Basic-Sketch-MySensor", "1.0"); pinMode(2,INPUT); digitalWrite (2, LOW); pinMode(3,INPUT); digitalWrite (3, LOW); pinMode(4,OUTPUT); digitalWrite (4, LOW); pinMode(5,INPUT); digitalWrite (5, LOW); pinMode(6,INPUT); digitalWrite (6, LOW); pinMode(7,INPUT); digitalWrite (7, LOW); pinMode(8,INPUT); digitalWrite (8, LOW); oldBatLevel = -1; sendValue(); Serial.println("Startup Finished"); TurnOnLed(); } void TurnOnLed(){ digitalWrite(4,HIGH); gw.sleep(1000); digitalWrite(4,LOW); gw.sleep(100); } void loop () { sendValue(); gw.sleep(1000*10); } // end of loop void sendValue() { gw.powerUp(); int batLevel = getBatteryLevel(); if (!PROD){ gw.sendBatteryLevel(batLevel); TurnOnLed(); } else{ if (oldBatLevel != batLevel) { gw.sendBatteryLevel(batLevel); oldBatLevel = batLevel; TurnOnLed(); } } gw.powerDown(); } // Battery measure int getBatteryLevel () { int results = (readVcc() - 2000) / 10; if (results > 100) results = 100; if (results < 0) results = 0; return results; } // end of getBandgap // when ADC completed, take an interrupt EMPTY_INTERRUPT (ADC_vect); long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle noInterrupts (); // start the conversion ADCSRA |= _BV (ADSC) | _BV (ADIE); set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample interrupts (); sleep_mode (); // reading should be done, but better make sure // maybe the timer interrupt fired while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate AVcc in mV return result; }``` -
@m26872 I still dont get it. Why I cant get the same efficient power like you.
I already follow all of your requirement in the first thread - difference only I use breadboard.
The minimum consumption (sleep) that I've got still 2.4mA, compare to you, it still huge differences. I dont know what's wrong with my setup.My sketch wake up every 10s (consumption up to 3.5mA), while sleep the lowest is 2.4mA.
#include <avr/sleep.h> // Sleep Modes #include <MySensor.h> #include <SPI.h> MySensor gw; #define BATTERY_SENSE_PIN #define SLEEP_IN_MS 86400000 // 1 day #define PROD false int oldBatLevel; void setup() { gw.begin(NULL,1); gw.sendSketchInfo("Basic-Sketch-MySensor", "1.0"); pinMode(2,INPUT); digitalWrite (2, LOW); pinMode(3,INPUT); digitalWrite (3, LOW); pinMode(4,OUTPUT); digitalWrite (4, LOW); pinMode(5,INPUT); digitalWrite (5, LOW); pinMode(6,INPUT); digitalWrite (6, LOW); pinMode(7,INPUT); digitalWrite (7, LOW); pinMode(8,INPUT); digitalWrite (8, LOW); oldBatLevel = -1; sendValue(); Serial.println("Startup Finished"); TurnOnLed(); } void TurnOnLed(){ digitalWrite(4,HIGH); gw.sleep(1000); digitalWrite(4,LOW); gw.sleep(100); } void loop () { sendValue(); gw.sleep(1000*10); } // end of loop void sendValue() { gw.powerUp(); int batLevel = getBatteryLevel(); if (!PROD){ gw.sendBatteryLevel(batLevel); TurnOnLed(); } else{ if (oldBatLevel != batLevel) { gw.sendBatteryLevel(batLevel); oldBatLevel = batLevel; TurnOnLed(); } } gw.powerDown(); } // Battery measure int getBatteryLevel () { int results = (readVcc() - 2000) / 10; if (results > 100) results = 100; if (results < 0) results = 0; return results; } // end of getBandgap // when ADC completed, take an interrupt EMPTY_INTERRUPT (ADC_vect); long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle noInterrupts (); // start the conversion ADCSRA |= _BV (ADSC) | _BV (ADIE); set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample interrupts (); sleep_mode (); // reading should be done, but better make sure // maybe the timer interrupt fired while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate AVcc in mV return result; }```@funky81 said:
@m26872 I still dont get it. Why I cant get the same efficient power like you....
I see that your sketch uses the internal battery monitoring method. That isn't possible when using the design as in this threads subject, with a step-up regulator that makes Vbat different from Vcc. Are you sure you're not confusing my design with EaysIoTs ?
Anyhow, I can't explain the sleep mode consumption, it seems like something isn't sleeping like it should.
Here's my sketch for Node 105/106:
// Egen kombo-nod för DHT22, BMP180 och batterimonitering. // 20141019 // DHT-22 Working voltage: DC 3.3-5.5V (so connect after step-up regulator). http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf // BMP180 (compatible with BMP085) working voltage 1.8-3.6V. Different boards with different power and pullups. Datasheet for ic only: http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf #include <SPI.h> #include <MySensor.h> #include <DHT.h> #include <Wire.h> #include <Adafruit_BMP085.h> // N.b. The new library includes the function readSealevelPressure() #define NODE_ID 106 // Manually asign Node Id <<<<<<<<<<<<<<<<<<< ENTER THIS !!!! #define ONE_WIRE_BUS 3 // Pin where dallase sensor bus is connected. <<<<<<<<<<<<<<< DON'T FORGET 4k7 PULL-UP !!! >>>>>>>>>>>>>>>> #define VBAT_PER_BITS 0.003363075 // Calculated volts per bit from the used battery montoring voltage divider. Internal_ref=1.1V, res=10bit=2^10-1=1023, Eg for 3V (2AA): Vin/Vb=R1/(R1+R2)=470e3/(1e6+470e3), Vlim=Vb/Vin*1.1=3.44V, Volts per bit = Vlim/1023= 0.003363075 #define VMIN 1.9 // Battery monitor lower level. Vmin_radio=1.9V #define VMAX 3.3 // " " " high level. Vmin<Vmax<=3.44 #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define BARO_CHILD 2 //#define TEMP_CHILD 3 // Commented since don't need the Bmp tempsensor #define HUMIDITY_SENSOR_DIGITAL_PIN 3 // <<<<<<<<<<<<<<<<<<<<<<<< Use 4k7 Pull-up. MySensors webpage doesn't use, datasheet does. Adafruit does https://learn.adafruit.com/dht/using-a-dhtxx-sensor unsigned long SLEEP_TIME = 15*60000; // sleep time between reads (in milliseconds) unsigned long preSleepTime = 5*60000; // sleep time for extra pre hum-reading for simple avaraging filter Adafruit_BMP085 bmp = Adafruit_BMP085(); // Digital Pressure Sensor MySensor gw; DHT dht; float lastTemp; float lastHum; float lastPressure = -1; //float lastBmpTemp = -1; // Commented since don't need the Bmp tempsensor MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); //MyMessage tempMsg(TEMP_CHILD, V_TEMP); // Commented since don't need the Bmp tempsensor MyMessage pressureMsg(BARO_CHILD, V_PRESSURE); int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point int oldBatteryPcnt = 0; void setup() { analogReference(INTERNAL); // use the 1.1 V internal reference for battery level measuring delay(500); // Allow time for radio if power used as reset <<<<<<<<<<<<<< Experimented with good result gw.begin(NULL,NODE_ID); // Startup and initialize MySensors library. Set callback for incoming messages. dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); gw.sendSketchInfo("EgHumBarTemBatv2", "2.0 20141110"); // Send the Sketch Version Information to the Gateway if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) { } } gw.present(CHILD_ID_HUM, S_HUM); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID_TEMP, S_TEMP); gw.present(BARO_CHILD, S_BARO); // gw.present(TEMP_CHILD, S_TEMP); // Commented since don't need the Bmp tempsensor } void loop() { delay(dht.getMinimumSamplingPeriod()); float humidity_1 = dht.getHumidity(); if (isnan(humidity_1)) { Serial.println("Failed reading humidity_1 from DHT"); } // else { // Serial.print("Hum1: "); // Serial.println(humidity_1); // } gw.sleep(preSleepTime); //sleep shortly until the "real" processing happens delay(dht.getMinimumSamplingPeriod()); float humidity_2 = dht.getHumidity(); if (isnan(humidity_2)) { Serial.println("Failed reading humidity_2 from DHT"); } // else { // Serial.print("Hum2: "); // Serial.println(humidity_2); // } if ( isnan(humidity_1) && isnan(humidity_2) ) { Serial.println("Failed reading humidity_1 and humidity_2 from DHT"); } else if ( isnan(humidity_2) && !isnan(humidity_1) ) { // && abs(humidity_1-lastHum)>2. ) { // Ev hysteres gw.send(msgHum.set(humidity_1, 1)); lastHum = humidity_1; // Serial.println("Humidity_1 sent to gw."); } else if ( isnan(humidity_1) && !isnan(humidity_2) ) { // && abs(humidity_2-lastHum)>2. ) { gw.send(msgHum.set(humidity_2, 1)); lastHum = humidity_2; // Serial.println("Humidity_2 sent to gw."); } else { // Serial.println("Else mean calc"); float humidity_m = (humidity_1+humidity_2)/2. ; // Averageing the two. // if ( abs(humidity_m-lastHum) > 2. ) { gw.send(msgHum.set(humidity_m, 1)); lastHum = humidity_m; // Serial.println("The mean humidity_m sent to gw."); // } } float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT"); } else if (temperature != lastTemp) { lastTemp = temperature; gw.send(msgTemp.set(temperature, 1)); // Always send temperature // Serial.print("Sent temp: "); // Serial.println(temperature); } float pressure = bmp.readPressure()/100; // float pressureS = bmp.readSealevelPressure(75.)/100; // Serial.print("Pressure = "); Serial.print(pressure); Serial.println(" Pa"); // Serial.print("SeaLevelPressure = "); Serial.print(pressureS); Serial.println(" Pa"); if (pressure != lastPressure) { gw.send(pressureMsg.set(pressure, 0)); lastPressure = pressure; // Serial.print("Sent pressure: "); // Serial.println(pressure); } // float bmpTemperature = bmp.readTemperature(); // Commented since don't need the Bmp tempsensor //// Serial.print("Temperature = "); Serial.print(bmpTemperature); Serial.println(" *C"); // if (bmpTemperature != lastBmpTemp) { // gw.send(tempMsg.set(bmpTemperature,1)); // lastBmpTemp = bmpTemperature; // } int sensorValue = analogRead(BATTERY_SENSE_PIN); // Battery monitoring reading // Serial.println(sensorValue); float Vbat = sensorValue * VBAT_PER_BITS; // Serial.print("Battery Voltage: "); Serial.print(Vbat); Serial.println(" V"); //int batteryPcnt = sensorValue / 10; int batteryPcnt = static_cast<int>(((Vbat-VMIN)/(VMAX-VMIN))*100.); // Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); if (oldBatteryPcnt != batteryPcnt) { gw.sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt; } gw.sleep(SLEEP_TIME); //sleep a bit } -
@funky81 said:
@m26872 I still dont get it. Why I cant get the same efficient power like you....
I see that your sketch uses the internal battery monitoring method. That isn't possible when using the design as in this threads subject, with a step-up regulator that makes Vbat different from Vcc. Are you sure you're not confusing my design with EaysIoTs ?
Anyhow, I can't explain the sleep mode consumption, it seems like something isn't sleeping like it should.
Here's my sketch for Node 105/106:
// Egen kombo-nod för DHT22, BMP180 och batterimonitering. // 20141019 // DHT-22 Working voltage: DC 3.3-5.5V (so connect after step-up regulator). http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf // BMP180 (compatible with BMP085) working voltage 1.8-3.6V. Different boards with different power and pullups. Datasheet for ic only: http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf #include <SPI.h> #include <MySensor.h> #include <DHT.h> #include <Wire.h> #include <Adafruit_BMP085.h> // N.b. The new library includes the function readSealevelPressure() #define NODE_ID 106 // Manually asign Node Id <<<<<<<<<<<<<<<<<<< ENTER THIS !!!! #define ONE_WIRE_BUS 3 // Pin where dallase sensor bus is connected. <<<<<<<<<<<<<<< DON'T FORGET 4k7 PULL-UP !!! >>>>>>>>>>>>>>>> #define VBAT_PER_BITS 0.003363075 // Calculated volts per bit from the used battery montoring voltage divider. Internal_ref=1.1V, res=10bit=2^10-1=1023, Eg for 3V (2AA): Vin/Vb=R1/(R1+R2)=470e3/(1e6+470e3), Vlim=Vb/Vin*1.1=3.44V, Volts per bit = Vlim/1023= 0.003363075 #define VMIN 1.9 // Battery monitor lower level. Vmin_radio=1.9V #define VMAX 3.3 // " " " high level. Vmin<Vmax<=3.44 #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define BARO_CHILD 2 //#define TEMP_CHILD 3 // Commented since don't need the Bmp tempsensor #define HUMIDITY_SENSOR_DIGITAL_PIN 3 // <<<<<<<<<<<<<<<<<<<<<<<< Use 4k7 Pull-up. MySensors webpage doesn't use, datasheet does. Adafruit does https://learn.adafruit.com/dht/using-a-dhtxx-sensor unsigned long SLEEP_TIME = 15*60000; // sleep time between reads (in milliseconds) unsigned long preSleepTime = 5*60000; // sleep time for extra pre hum-reading for simple avaraging filter Adafruit_BMP085 bmp = Adafruit_BMP085(); // Digital Pressure Sensor MySensor gw; DHT dht; float lastTemp; float lastHum; float lastPressure = -1; //float lastBmpTemp = -1; // Commented since don't need the Bmp tempsensor MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); //MyMessage tempMsg(TEMP_CHILD, V_TEMP); // Commented since don't need the Bmp tempsensor MyMessage pressureMsg(BARO_CHILD, V_PRESSURE); int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point int oldBatteryPcnt = 0; void setup() { analogReference(INTERNAL); // use the 1.1 V internal reference for battery level measuring delay(500); // Allow time for radio if power used as reset <<<<<<<<<<<<<< Experimented with good result gw.begin(NULL,NODE_ID); // Startup and initialize MySensors library. Set callback for incoming messages. dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); gw.sendSketchInfo("EgHumBarTemBatv2", "2.0 20141110"); // Send the Sketch Version Information to the Gateway if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) { } } gw.present(CHILD_ID_HUM, S_HUM); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID_TEMP, S_TEMP); gw.present(BARO_CHILD, S_BARO); // gw.present(TEMP_CHILD, S_TEMP); // Commented since don't need the Bmp tempsensor } void loop() { delay(dht.getMinimumSamplingPeriod()); float humidity_1 = dht.getHumidity(); if (isnan(humidity_1)) { Serial.println("Failed reading humidity_1 from DHT"); } // else { // Serial.print("Hum1: "); // Serial.println(humidity_1); // } gw.sleep(preSleepTime); //sleep shortly until the "real" processing happens delay(dht.getMinimumSamplingPeriod()); float humidity_2 = dht.getHumidity(); if (isnan(humidity_2)) { Serial.println("Failed reading humidity_2 from DHT"); } // else { // Serial.print("Hum2: "); // Serial.println(humidity_2); // } if ( isnan(humidity_1) && isnan(humidity_2) ) { Serial.println("Failed reading humidity_1 and humidity_2 from DHT"); } else if ( isnan(humidity_2) && !isnan(humidity_1) ) { // && abs(humidity_1-lastHum)>2. ) { // Ev hysteres gw.send(msgHum.set(humidity_1, 1)); lastHum = humidity_1; // Serial.println("Humidity_1 sent to gw."); } else if ( isnan(humidity_1) && !isnan(humidity_2) ) { // && abs(humidity_2-lastHum)>2. ) { gw.send(msgHum.set(humidity_2, 1)); lastHum = humidity_2; // Serial.println("Humidity_2 sent to gw."); } else { // Serial.println("Else mean calc"); float humidity_m = (humidity_1+humidity_2)/2. ; // Averageing the two. // if ( abs(humidity_m-lastHum) > 2. ) { gw.send(msgHum.set(humidity_m, 1)); lastHum = humidity_m; // Serial.println("The mean humidity_m sent to gw."); // } } float temperature = dht.getTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT"); } else if (temperature != lastTemp) { lastTemp = temperature; gw.send(msgTemp.set(temperature, 1)); // Always send temperature // Serial.print("Sent temp: "); // Serial.println(temperature); } float pressure = bmp.readPressure()/100; // float pressureS = bmp.readSealevelPressure(75.)/100; // Serial.print("Pressure = "); Serial.print(pressure); Serial.println(" Pa"); // Serial.print("SeaLevelPressure = "); Serial.print(pressureS); Serial.println(" Pa"); if (pressure != lastPressure) { gw.send(pressureMsg.set(pressure, 0)); lastPressure = pressure; // Serial.print("Sent pressure: "); // Serial.println(pressure); } // float bmpTemperature = bmp.readTemperature(); // Commented since don't need the Bmp tempsensor //// Serial.print("Temperature = "); Serial.print(bmpTemperature); Serial.println(" *C"); // if (bmpTemperature != lastBmpTemp) { // gw.send(tempMsg.set(bmpTemperature,1)); // lastBmpTemp = bmpTemperature; // } int sensorValue = analogRead(BATTERY_SENSE_PIN); // Battery monitoring reading // Serial.println(sensorValue); float Vbat = sensorValue * VBAT_PER_BITS; // Serial.print("Battery Voltage: "); Serial.print(Vbat); Serial.println(" V"); //int batteryPcnt = sensorValue / 10; int batteryPcnt = static_cast<int>(((Vbat-VMIN)/(VMAX-VMIN))*100.); // Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); if (oldBatteryPcnt != batteryPcnt) { gw.sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt; } gw.sleep(SLEEP_TIME); //sleep a bit } -
I declare the 6 months criteria easily passed. And the chinese step up regulator to be good value for money. Next target; 12 months.
