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. How to include the battery measurement?

How to include the battery measurement?

Scheduled Pinned Locked Moved Troubleshooting
12 Posts 3 Posters 5.2k Views 2 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.
  • tlpeterT tlpeter

    I am trying to build a sensor with a DHT22 and for now on a solar panel and a battery.
    I want to see the battery level within Domoticz.
    I cannot seem to merge both the battery sketch and the DHT sketch together.
    Most of the times i get an error about a { being in a place where it should not belong.
    I think i lost it :smiley: and i am going mad soon.
    Also how to send the battery level to Domoticz? i tried the battery sketch alone and nothing happens.

    S Offline
    S Offline
    sundberg84
    Hardware Contributor
    wrote on last edited by sundberg84
    #2

    @tlpeter

    Most of the times i get an error about a { being in a place where it should not belong.

    Its easier for us if you post the code so we can have a look if you want help :)

    Also how to send the battery level to Domoticz?

    Well, before 2.0 it was gw.sendBatteryLevel(batteryPcnt); and now it is sendBatteryLevel(batteryPcnt);
    The battery% needs to be attached to a sensor - so it will be displayed in the deviced tab if you look at the device/sensor.

    Controller: Proxmox VM - Home Assistant
    MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
    MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
    RFLink GW - Arduino Mega + RFLink Shield, 433mhz

    1 Reply Last reply
    1
    • tlpeterT Offline
      tlpeterT Offline
      tlpeter
      wrote on last edited by
      #3

      sendBatteryLevel doesn't do anything.
      I have modified it a bit and now i have some readings.
      I will do a bit more playing to see where i will end.

      S 1 Reply Last reply
      0
      • tlpeterT tlpeter

        sendBatteryLevel doesn't do anything.
        I have modified it a bit and now i have some readings.
        I will do a bit more playing to see where i will end.

        S Offline
        S Offline
        sundberg84
        Hardware Contributor
        wrote on last edited by
        #4

        @tlpeter - it does, but it needs to be together with a sensor. You will find it in "devices".

        Controller: Proxmox VM - Home Assistant
        MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
        MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
        RFLink GW - Arduino Mega + RFLink Shield, 433mhz

        1 Reply Last reply
        0
        • S Offline
          S Offline
          sundberg84
          Hardware Contributor
          wrote on last edited by
          #5

          0_1472575404591_1.JPG

          Controller: Proxmox VM - Home Assistant
          MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
          MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
          RFLink GW - Arduino Mega + RFLink Shield, 433mhz

          1 Reply Last reply
          0
          • tlpeterT Offline
            tlpeterT Offline
            tlpeter
            wrote on last edited by tlpeter
            #6

            I have voltage now (utility) and a percentage under devices.
            I have read somewhere that the percentage is depending on the last sensors poll so i will now try to add the DHT part in to the sketch.

            1 Reply Last reply
            0
            • tlpeterT Offline
              tlpeterT Offline
              tlpeter
              wrote on last edited by tlpeter
              #7

              I have the voltage part working and i think also the battery percentage with it.
              I build the sketch like this. Can you have a little look?

              /**
               * The MySensors Arduino library handles the wireless radio link and protocol
               * between your home built sensors/actuators and HA controller of choice.
               * The sensors forms a self healing radio network with optional repeaters. Each
               * repeater and gateway builds a routing tables in EEPROM which keeps track of the
               * network topology allowing messages to be routed to nodes.
               *
               * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
               * Copyright (C) 2013-2015 Sensnology AB
               * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
               *
               * Documentation: http://www.mysensors.org
               * Support Forum: http://forum.mysensors.org
               *
               * This program is free software; you can redistribute it and/or
               * modify it under the terms of the GNU General Public License
               * version 2 as published by the Free Software Foundation.
               *
               *******************************
               *
               * DESCRIPTION
               *
               * This is an example that demonstrates how to report the battery level for a sensor
               * Instructions for measuring battery capacity on A0 are available here:
               * http://www.mysensors.org/build/battery
               * 
               */
              
              
              
              // Enable debug prints to serial monitor
              #define MY_DEBUG 
              
              // Enable and select radio type attached
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              
              #include <SPI.h>
              #include <MySensors.h>
              #include <DHT.h>
              
              #define CHILD_ID_BATT 0
              #define CHILD_ID_HUM 1
              #define CHILD_ID_TEMP 2
              
              #define DHT_DATA_PIN 3 // Set this to the pin you connected the DHT's data pin to
              int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
              
              // Set this offset if the sensor has a permanent small offset to the real temperatures
              #define SENSOR_TEMP_OFFSET 0
              
              static const uint64_t UPDATE_INTERVAL = 30000;
              
              // Force sending an update of the temperature after n sensor reads, so a controller showing the
              // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
              // the value didn't change since;
              // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
              static const uint8_t FORCE_UPDATE_N_READS = 10;
              
              //unsigned long SLEEP_TIME = 9000;  // sleep time between reads (seconds * 1000 milliseconds)
              int oldBatteryPcnt = 0;
              
              float lastTemp;
              float lastHum;
              uint8_t nNoUpdatesTemp;
              uint8_t nNoUpdatesHum;
              boolean metric = true; 
              
              MyMessage msgBatt(CHILD_ID_BATT, V_VOLTAGE);
              MyMessage msgHum(CHILD_ID_HUM, V_HUM);
              MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
              DHT dht;
              
              void setup()  
              {
                 // use the 1.1 V internal reference
              #if defined(__AVR_ATmega2560__)
                 analogReference(INTERNAL1V1);
              #else
                 analogReference(INTERNAL);
              #endif
              //}
              
              {
              dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                  Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                }
                // Sleep for the time of the minimum sampling period to give the sensor time to power up
                // (otherwise, timeout errors might occure for the first reading)
                sleep(dht.getMinimumSamplingPeriod());
              }
              }
              void presentation() {
                 // Send the sketch version information to the gateway and Controller
                 sendSketchInfo("Battery Meter", "1.0");
              
                 present(CHILD_ID_BATT, S_MULTIMETER);
                 wait(20);
                 present(CHILD_ID_HUM, S_HUM);
                 wait(20);
                 present(CHILD_ID_TEMP, S_TEMP);
                 wait(20);
                 metric = getConfig().isMetric;
              
              }
              void loop()
              {
                 // get the battery Voltage
                 int sensorValue = analogRead(BATTERY_SENSE_PIN);
                 #ifdef MY_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
                 
                 int batteryPcnt = sensorValue / 10;
              
                 #ifdef MY_DEBUG
                 float batteryV  = sensorValue * 0.003363075;
                 Serial.print("Battery Voltage: ");
                 Serial.print(batteryV);
                 Serial.println(" V");
              
                 Serial.print("Battery percent: ");
                 Serial.print(batteryPcnt);
                 Serial.println(" %");
                 #endif
              
                 if (oldBatteryPcnt != batteryPcnt) {
                   // Power up radio after sleep
                   send(msgBatt.set(batteryV, 1));
                  //sendBatteryLevel(batteryPcnt);
                   oldBatteryPcnt = batteryPcnt;
                 }
              
                 {  
                // Force reading sensor, so it works also after sleep()
                dht.readSensor(true);
                
                // Get temperature from DHT library
                float temperature = dht.getTemperature();
                if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT!");
                } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                  // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                  lastTemp = temperature;
                  if (!metric) {
                    temperature = dht.toFahrenheit(temperature);
                  }
                  // Reset no updates counter
                  nNoUpdatesTemp = 0;
                  temperature += SENSOR_TEMP_OFFSET;
                  send(msgTemp.set(temperature, 1));
              
                  #ifdef MY_DEBUG
                  Serial.print("T: ");
                  Serial.println(temperature);
                  #endif
                } else {
                  // Increase no update counter if the temperature stayed the same
                  nNoUpdatesTemp++;
                }
              
                // Get humidity from DHT library
                float humidity = dht.getHumidity();
                if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
                } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                  // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                  lastHum = humidity;
                  // Reset no updates counter
                  nNoUpdatesHum = 0;
                  send(msgHum.set(humidity, 1));
                  
                  #ifdef MY_DEBUG
                  Serial.print("H: ");
                  Serial.println(humidity);
                  #endif
                } else {
                  // Increase no update counter if the humidity stayed the same
                  nNoUpdatesHum++;
                }
                 //sleep(SLEEP_TIME);
                 sleep(UPDATE_INTERVAL);
                 }}```
              S 1 Reply Last reply
              0
              • tlpeterT tlpeter

                I have the voltage part working and i think also the battery percentage with it.
                I build the sketch like this. Can you have a little look?

                /**
                 * The MySensors Arduino library handles the wireless radio link and protocol
                 * between your home built sensors/actuators and HA controller of choice.
                 * The sensors forms a self healing radio network with optional repeaters. Each
                 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                 * network topology allowing messages to be routed to nodes.
                 *
                 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                 * Copyright (C) 2013-2015 Sensnology AB
                 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                 *
                 * Documentation: http://www.mysensors.org
                 * Support Forum: http://forum.mysensors.org
                 *
                 * This program is free software; you can redistribute it and/or
                 * modify it under the terms of the GNU General Public License
                 * version 2 as published by the Free Software Foundation.
                 *
                 *******************************
                 *
                 * DESCRIPTION
                 *
                 * This is an example that demonstrates how to report the battery level for a sensor
                 * Instructions for measuring battery capacity on A0 are available here:
                 * http://www.mysensors.org/build/battery
                 * 
                 */
                
                
                
                // Enable debug prints to serial monitor
                #define MY_DEBUG 
                
                // Enable and select radio type attached
                #define MY_RADIO_NRF24
                //#define MY_RADIO_RFM69
                
                #include <SPI.h>
                #include <MySensors.h>
                #include <DHT.h>
                
                #define CHILD_ID_BATT 0
                #define CHILD_ID_HUM 1
                #define CHILD_ID_TEMP 2
                
                #define DHT_DATA_PIN 3 // Set this to the pin you connected the DHT's data pin to
                int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
                
                // Set this offset if the sensor has a permanent small offset to the real temperatures
                #define SENSOR_TEMP_OFFSET 0
                
                static const uint64_t UPDATE_INTERVAL = 30000;
                
                // Force sending an update of the temperature after n sensor reads, so a controller showing the
                // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                // the value didn't change since;
                // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                static const uint8_t FORCE_UPDATE_N_READS = 10;
                
                //unsigned long SLEEP_TIME = 9000;  // sleep time between reads (seconds * 1000 milliseconds)
                int oldBatteryPcnt = 0;
                
                float lastTemp;
                float lastHum;
                uint8_t nNoUpdatesTemp;
                uint8_t nNoUpdatesHum;
                boolean metric = true; 
                
                MyMessage msgBatt(CHILD_ID_BATT, V_VOLTAGE);
                MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                DHT dht;
                
                void setup()  
                {
                   // use the 1.1 V internal reference
                #if defined(__AVR_ATmega2560__)
                   analogReference(INTERNAL1V1);
                #else
                   analogReference(INTERNAL);
                #endif
                //}
                
                {
                dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                  if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                    Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                  }
                  // Sleep for the time of the minimum sampling period to give the sensor time to power up
                  // (otherwise, timeout errors might occure for the first reading)
                  sleep(dht.getMinimumSamplingPeriod());
                }
                }
                void presentation() {
                   // Send the sketch version information to the gateway and Controller
                   sendSketchInfo("Battery Meter", "1.0");
                
                   present(CHILD_ID_BATT, S_MULTIMETER);
                   wait(20);
                   present(CHILD_ID_HUM, S_HUM);
                   wait(20);
                   present(CHILD_ID_TEMP, S_TEMP);
                   wait(20);
                   metric = getConfig().isMetric;
                
                }
                void loop()
                {
                   // get the battery Voltage
                   int sensorValue = analogRead(BATTERY_SENSE_PIN);
                   #ifdef MY_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
                   
                   int batteryPcnt = sensorValue / 10;
                
                   #ifdef MY_DEBUG
                   float batteryV  = sensorValue * 0.003363075;
                   Serial.print("Battery Voltage: ");
                   Serial.print(batteryV);
                   Serial.println(" V");
                
                   Serial.print("Battery percent: ");
                   Serial.print(batteryPcnt);
                   Serial.println(" %");
                   #endif
                
                   if (oldBatteryPcnt != batteryPcnt) {
                     // Power up radio after sleep
                     send(msgBatt.set(batteryV, 1));
                    //sendBatteryLevel(batteryPcnt);
                     oldBatteryPcnt = batteryPcnt;
                   }
                
                   {  
                  // Force reading sensor, so it works also after sleep()
                  dht.readSensor(true);
                  
                  // Get temperature from DHT library
                  float temperature = dht.getTemperature();
                  if (isnan(temperature)) {
                    Serial.println("Failed reading temperature from DHT!");
                  } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                    // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                    lastTemp = temperature;
                    if (!metric) {
                      temperature = dht.toFahrenheit(temperature);
                    }
                    // Reset no updates counter
                    nNoUpdatesTemp = 0;
                    temperature += SENSOR_TEMP_OFFSET;
                    send(msgTemp.set(temperature, 1));
                
                    #ifdef MY_DEBUG
                    Serial.print("T: ");
                    Serial.println(temperature);
                    #endif
                  } else {
                    // Increase no update counter if the temperature stayed the same
                    nNoUpdatesTemp++;
                  }
                
                  // Get humidity from DHT library
                  float humidity = dht.getHumidity();
                  if (isnan(humidity)) {
                    Serial.println("Failed reading humidity from DHT");
                  } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                    // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                    lastHum = humidity;
                    // Reset no updates counter
                    nNoUpdatesHum = 0;
                    send(msgHum.set(humidity, 1));
                    
                    #ifdef MY_DEBUG
                    Serial.print("H: ");
                    Serial.println(humidity);
                    #endif
                  } else {
                    // Increase no update counter if the humidity stayed the same
                    nNoUpdatesHum++;
                  }
                   //sleep(SLEEP_TIME);
                   sleep(UPDATE_INTERVAL);
                   }}```
                S Offline
                S Offline
                sundberg84
                Hardware Contributor
                wrote on last edited by
                #8

                @tlpeter - Im not a coding guy, but it looks good to me.
                Myself i build my sketches, test and look at serial output and Domoticz output. When im happy with the result - i go for it.

                This is going to create two devices i think, one humidity/temp and one voltage. The batterypct and voltage will be seperated from humidity/temp i think even if they belong together. If you want the procentage in devices for the right device you just skip the voltage part.

                Controller: Proxmox VM - Home Assistant
                MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
                MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
                RFLink GW - Arduino Mega + RFLink Shield, 433mhz

                1 Reply Last reply
                0
                • tlpeterT Offline
                  tlpeterT Offline
                  tlpeter
                  wrote on last edited by
                  #9

                  I have voltage now and a percentage at the devices.
                  Hum and temp do work fine.
                  I only sucked all the juice out of the battery so it is charging now by the little solar panel.
                  I found out that 2,4V was really the lowest voltage that worked :smile:

                  S 1 Reply Last reply
                  0
                  • tlpeterT tlpeter

                    I have voltage now and a percentage at the devices.
                    Hum and temp do work fine.
                    I only sucked all the juice out of the battery so it is charging now by the little solar panel.
                    I found out that 2,4V was really the lowest voltage that worked :smile:

                    S Offline
                    S Offline
                    sundberg84
                    Hardware Contributor
                    wrote on last edited by
                    #10

                    @tlpeter If you want to suck more juice out of the batteries use a DC-DC step up booster: https://www.mysensors.org/store/#regulators then you can go down to 0.9V :)

                    Controller: Proxmox VM - Home Assistant
                    MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
                    MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
                    RFLink GW - Arduino Mega + RFLink Shield, 433mhz

                    1 Reply Last reply
                    0
                    • tlpeterT Offline
                      tlpeterT Offline
                      tlpeter
                      wrote on last edited by
                      #11

                      I will buy one later :smile:
                      This is just to play with as i wanted to know how the battery measurement works.

                      1 Reply Last reply
                      0
                      • C Offline
                        C Offline
                        clio75
                        wrote on last edited by
                        #12

                        @tlpeter said:

                        if (oldBatteryPcnt != batteryPcnt) {
                        // Power up radio after sleep
                        send(msgBatt.set(batteryV, 1));
                        //sendBatteryLevel(batteryPcnt);
                        oldBatteryPcnt = batteryPcnt;
                        }

                        Hi, This part should not have been updated

                        this part is icluded in the lib
                        So leave it like the exsample
                        if (oldBatteryPcnt != batteryPcnt) {
                        // Power up radio after sleep
                        sendBatteryLevel(batteryPcnt);
                        oldBatteryPcnt = batteryPcnt;
                        }

                        For sending over your voltage you need one additional

                        send(msgBatt.set(batteryV, 1));

                        Good luck

                        1 Reply Last reply
                        0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better 💗

                        Register Login
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        17

                        Online

                        12.0k

                        Users

                        11.2k

                        Topics

                        113.4k

                        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