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. Development
  3. How to get battery volt / percentage message send to mqtt?

How to get battery volt / percentage message send to mqtt?

Scheduled Pinned Locked Moved Development
15 Posts 3 Posters 2.8k Views 3 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.
  • M Offline
    M Offline
    Mr_sensor
    wrote on last edited by
    #1

    I Build a temp / hum sensor with the easyPcb board and Am able to get the temp and hum send to the Mqtt broker.
    Next thing is to get the battery voltage and % send to the Mqtt broker as well.
    Now that is giving me some problems. I merged the two scripts together, and tried to learn form other topics. But I'M not getting is right dough. This is my script right now:
    Also the output of the serial monitor.
    I have the feeling I am nearly there :) Any help would be great!

    [code]
    /**
     * 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.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0: Henrik EKblad
     * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
     * 
     * DESCRIPTION
     * This sketch provides an example of how to implement a humidity/temperature
     * sensor using a DHT11/DHT-22.
     *  
     * For more information, please visit:
     * http://www.mysensors.org/build/humidity
     * 
     HTU21D Humidity Sensor
     Hardware Connections (Breakoutboard to Arduino):
     -VCC = 3.3V
     -GND = GND
     -SDA = A4 (use inline 330 ohm resistor if your board is 5V)
     -SCL = A5 (use inline 330 ohm resistor if your board is 5V)
     */
    
     
    #define MY_NODE_ID 2
    #define MY_PARENT_NODE_ID 0
    #define MY_PARENT_NODE_IS_STATIC
    
    // Enable debug prints
    #define MY_DEBUG
    
    // Enable and select radio type attached 
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    //#define MY_RS485
     
    #include <SparkFunHTU21D.h>
    #include <MySensors.h>  
    #include <Wire.h>
    #include <SPI.h>
    
    // 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;
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_BATTERY 2
    //#define CHILD_ID_VOLT 2
    #define CHILD_ID_PRCNT 3
    
    float lastTemp;
    float lastHum;
    
    uint8_t nNoUpdatesTemp;
    uint8_t nNoUpdatesHum;
    boolean metric = true;
    
    
    void presentation()  
    { 
     // Send the Sketch Version Information to the Gateway                                                                                                                     
      sendSketchInfo("Humidity", "2.0");      
       
     // Register all sensors to gw (they will be created as child devices)                                                                                                     
      present(CHILD_ID_HUM, S_HUM);                                                                                                                                          
      present(CHILD_ID_TEMP, S_TEMP);
       present(CHILD_ID_BATTERY, S_MULTIMETER);                                                                                                                                         
      //metric = getControllerConfig().isMetric;
    
    
       
    }
    
                                                                                                                                                      
    unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)                                                                                             
                                                                                                                                                                            
                                                                                                                                                                   
                                                                                                                                                                            
    //Create an instance of the object                                                                                                                                          
    HTU21D myHumidity;                                                                                                                                                         
    
                                                                                                                                                                                                                                                                                                                                 
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);                                                                                                                                      
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);                                                                                                                                   
    MyMessage msgBattery(CHILD_ID_BATTERY, V_VOLTAGE);
    //MyMessage msgBattery(CHILD_ID_BATTERY, V_PRCNT);
    
    
    void setup() {
        myHumidity.begin();
    
         // use the 1.1 V internal reference
    #if defined(__AVR_ATmega2560__)
        analogReference(INTERNAL1V1);
    #else
        analogReference(INTERNAL);
    #endif
    } 
                                                                                                                                                                                                                                                                                                                                                     
    void loop()                                                                                                                                                                 
    {                                                                                                                                                                           
      float temperature = myHumidity.readTemperature();                                                                                                                         
      //if (!metric) {                                                                                                                                                            
      //    temperature = (temperature * 1.8) + 32.0;                                                                                                                             
      //}                                                                                                                                                                         
      send(msgTemp.set(temperature, 1));
      Serial.print("T: ");
      Serial.println(temperature);                                                                                                                                     
    
      float humidity = myHumidity.readHumidity();                                                                                                                               
      send(msgHum.set(humidity, 1));                                                                                                                                         
      Serial.print("H: ");
      Serial.println(humidity);
    
    
       // get the battery Voltage
       int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    
    //SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
    int oldBatteryPcnt = 0;
    
        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("Child ID ");
        Serial.print(CHILD_ID_BATTERY);
        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
            sendBatteryLevel(batteryPcnt);
            oldBatteryPcnt = batteryPcnt;
        } 
    
      
    
                                                                                                                                                                                
      sleep(SLEEP_TIME); //sleep a bit  
                                                                                                                                           
    }
    
    
    
    [/code]```
    
    

    16 MCO:BGN:INIT NODE,CP=RNNNA---,VER=2.2.0
    26 TSM:INIT
    28 TSF:WUR:MS=0
    34 TSM:INIT:TSP OK
    36 TSM:INIT:STATID=2
    38 TSF:SID:OK,ID=2
    40 TSM:FPAR
    43 TSM:FPAR:STATP=0
    45 TSM:ID
    47 TSM:ID:OK
    47 TSM:UPL
    51 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1
    59 TSF:MSG:READ,0-0-2,s=255,c=3,t=25,pt=1,l=1,sg=0:1
    65 TSF:MSG:PONG RECV,HP=1
    69 TSM:UPL:OK
    69 TSM:READY:ID=2,PAR=0,DIS=1
    75 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
    81 TSF:MSG:READ,0-0-2,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
    90 TSF:MSG:SEND,2-2-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.2.0
    100 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
    2111 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=11,pt=0,l=8,sg=0,ft=0,st=OK:Humidity
    2119 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:2.0
    2129 TSF:MSG:SEND,2-2-0-0,s=0,c=0,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
    2138 TSF:MSG:SEND,2-2-0-0,s=1,c=0,t=6,pt=0,l=0,sg=0,ft=0,st=OK:
    2146 TSF:MSG:SEND,2-2-0-0,s=2,c=0,t=30,pt=0,l=0,sg=0,ft=0,st=OK:
    2154 MCO:REG:REQ
    2158 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
    2179 TSF:MSG:READ,0-0-2,s=255,c=3,t=27,pt=1,l=1,sg=0:1
    2185 MCO:PIM:NODE REG=1
    2187 MCO:BGN:STP
    2189 MCO:BGN:INIT OK,TSP=1
    2244 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.2
    T: 19.20
    2277 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:42.7
    H: 42.68
    127
    Child ID 2Battery Voltage: 0.43 V
    Battery Percent: 12 %
    2289 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:12
    2297 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2304 TSF:TDI:TSL
    2306 MCO:SLP:WUP=-1
    2308 TSF:TRI:TSB
    2363 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.1
    T: 19.14
    2396 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:42.7
    H: 42.71
    0
    Child ID 2Battery Voltage: 0.00 V
    Battery Percent: 0 %
    2406 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2414 TSF:TDI:TSL
    2416 MCO:SLP:WUP=-1
    2418 TSF:TRI:TSB
    2473 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:20.3
    T: 20.33
    2506 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:55.9
    H: 55.90
    0
    Child ID 2Battery Voltage: 0.00 V
    Battery Percent: 0 %
    2516 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2525 TSF:TDI:TSL
    2527 MCO:SLP:WUP=-1
    2529 TSF:TRI:TSB
    2584 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.6
    T: 19.59
    2617 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:45.1
    H: 45.06
    0
    Child ID 2Battery Voltage: 0.00 V
    Battery Percent: 0 %
    2627 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2635 TSF:TDI:TSL
    2637 MCO:SLP:WUP=-1
    2639 TSF:TRI:TSB
    2695 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.4
    T: 19.39
    2727 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:43.9
    H: 43.87
    0
    Child ID 2Battery Voltage: 0.00 V
    Battery Percent: 0 %
    2738 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2746 TSF:TDI:TSL
    2748 MCO:SLP:WUP=-1
    2750 TSF:TRI:TSB
    2807 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.3
    T: 19.30
    2838 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:43.5
    H: 43.48
    0

    1 Reply Last reply
    0
    • gohanG Offline
      gohanG Offline
      gohan
      Mod
      wrote on last edited by
      #2

      @mr_sensor said in How to get battery volt / percentage message send to mqtt?:

      int oldBatteryPcnt = 0;

      I think this needs to be a global variable, not inside loop, otherwise you set it to zero on each loop. I don't have my code with me at the moment to compare, but I think there is an error on the voltage and percentage calculation

      Y 1 Reply Last reply
      0
      • gohanG gohan

        @mr_sensor said in How to get battery volt / percentage message send to mqtt?:

        int oldBatteryPcnt = 0;

        I think this needs to be a global variable, not inside loop, otherwise you set it to zero on each loop. I don't have my code with me at the moment to compare, but I think there is an error on the voltage and percentage calculation

        Y Offline
        Y Offline
        Yveaux
        Mod
        wrote on last edited by
        #3

        @gohan said in How to get battery volt / percentage message send to mqtt?:

        I think this needs to be a global variable

        Or prefix it with the 'static' keyword to indicate its value should persist over multiple runs.

        http://yveaux.blogspot.nl

        M 1 Reply Last reply
        0
        • Y Yveaux

          @gohan said in How to get battery volt / percentage message send to mqtt?:

          I think this needs to be a global variable

          Or prefix it with the 'static' keyword to indicate its value should persist over multiple runs.

          M Offline
          M Offline
          Mr_sensor
          wrote on last edited by
          #4

          @yveaux changed the position of int oldBatteryPcnt = 0; outside of the loop and added the static prefix static int oldBatteryPcnt = 0;
          Still not giving me the right result the first message seem ok but than it only has 0 ?

          Child ID 2Battery Voltage: 0.43 V
          Battery Percent: 12 %
          2289 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:12
          2297 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
          2304 TSF:TDI:TSL
          2306 MCO:SLP:WUP=-1
          2308 TSF:TRI:TSB
          2363 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.6
          T: 19.56
          2396 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:39.7
          H: 39.69
          0
          Child ID 2Battery Voltage: 0.00 V
          Battery Percent: 0 %
          2408 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:0
          2414 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
          2420 TSF:TDI:TSL
          2422 MCO:SLP:WUP=-1
          2426 TSF:TRI:TSB
          2482 TSF:MSG:SEND,2-2-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:19.6
          T: 19.57
          2512 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:39.5
          H: 39.52
          0
          Child ID 2Battery Voltage: 0.00 V
          Battery Percent: 0 %
          2523 MCO:SLP:MS=60000,SMS=0,I1=255,M1=255,I2=255,M2=255
          2531 TSF:TDI:TSL```
          1 Reply Last reply
          0
          • gohanG Offline
            gohanG Offline
            gohan
            Mod
            wrote on last edited by
            #5

            it looks as the analogread keeps returning zero

            M 1 Reply Last reply
            0
            • gohanG gohan

              it looks as the analogread keeps returning zero

              M Offline
              M Offline
              Mr_sensor
              wrote on last edited by
              #6

              @gohan Tried to find out what causing that but can not figure it out. I'm bot a real coderer so its trial and error :) and trying to understand form other sketches / posts. Any idea where to look for?

              1 Reply Last reply
              0
              • gohanG Offline
                gohanG Offline
                gohan
                Mod
                wrote on last edited by
                #7

                try adding a delay(500) before the analogread

                M 1 Reply Last reply
                0
                • gohanG gohan

                  try adding a delay(500) before the analogread

                  M Offline
                  M Offline
                  Mr_sensor
                  wrote on last edited by
                  #8

                  @gohan said in How to get battery volt / percentage message send to mqtt?:

                  delay(500)

                  Hi, tried that (already tried it with wait). Now I added it here:

                  delay(500);
                      int sensorValue = analogRead(BATTERY_SENSE_PIN);
                  

                  Also tried it here:

                   if (oldBatteryPcnt != batteryPcnt) {
                          // Power up radio after sleep
                          delay(500);       
                          sendBatteryLevel(batteryPcnt);
                          oldBatteryPcnt = batteryPcnt;
                      } 
                                                                                                                                                                                        
                    sleep(SLEEP_TIME); //sleep a bit  ```
                  
                  Both did not help still ending up with 0 . 
                  So what should be the best place the right place to put the delay?
                  1 Reply Last reply
                  0
                  • gohanG Offline
                    gohanG Offline
                    gohan
                    Mod
                    wrote on last edited by
                    #9

                    the second one is useless. It is odd that it misses the analog reads. What AVR boards version are you using?

                    M 1 Reply Last reply
                    0
                    • gohanG gohan

                      the second one is useless. It is odd that it misses the analog reads. What AVR boards version are you using?

                      M Offline
                      M Offline
                      Mr_sensor
                      wrote on last edited by
                      #10

                      @gohan I'm using the EasyPCB board with an arduino pro mini 3,3v

                      1 Reply Last reply
                      0
                      • gohanG Offline
                        gohanG Offline
                        gohan
                        Mod
                        wrote on last edited by
                        #11

                        I mean in Arduino IDE library manager

                        M 1 Reply Last reply
                        0
                        • gohanG gohan

                          I mean in Arduino IDE library manager

                          M Offline
                          M Offline
                          Mr_sensor
                          wrote on last edited by
                          #12

                          @gohan

                          Arduino Pro or Pro Mini
                          Programmer AVR ISP
                          ATmega328P (3,3v 8mhz)

                          M 1 Reply Last reply
                          0
                          • M Mr_sensor

                            @gohan

                            Arduino Pro or Pro Mini
                            Programmer AVR ISP
                            ATmega328P (3,3v 8mhz)

                            M Offline
                            M Offline
                            Mr_sensor
                            wrote on last edited by
                            #13

                            Still not getting it working! Any thoughts on this?

                            1 Reply Last reply
                            0
                            • gohanG Offline
                              gohanG Offline
                              gohan
                              Mod
                              wrote on last edited by
                              #14

                              Try a simple example sketch that reads the analog pin just to make sure the hardware is OK, or try another pro mini

                              M 1 Reply Last reply
                              0
                              • gohanG gohan

                                Try a simple example sketch that reads the analog pin just to make sure the hardware is OK, or try another pro mini

                                M Offline
                                M Offline
                                Mr_sensor
                                wrote on last edited by
                                #15

                                @gohan Ok will try that see if I made a fault somewhere

                                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


                                15

                                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