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. Lux sensor (BH1750) sending battery level (V)

Lux sensor (BH1750) sending battery level (V)

Scheduled Pinned Locked Moved Development
12 Posts 6 Posters 1.8k Views 5 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.
  • F Offline
    F Offline
    FrankVK
    wrote on last edited by FrankVK
    #1

    Hi,

    I really enjoy using MySensors!

    Got a small general question though: I'm using a BH1750 light sensor, powered by a 3V battery and I'd like to keep an eye on the battery status.

    I have added a line to the existing BH1750 scetch:

    #define CHILD_ID_VCC = 1
    MyMessage msgVcc(CHILD_ID_VCC, V_VOLTAGE);
    .. 
    void Presentation() {
      sendSketchInfo("Light Lux Sensor", "1.1");
      present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
      present(CHILD_ID_VCC, S_MULTIMETER);
    }
    
    Loop() {
    uint16_t lux = lightSensor.readLightLevel();
    float Vcc = ReadVcc();
    
    send(msgLux.set(Lux));
    send(msgVcc.set(Vcc));
    }
    

    Domoticz recieves the data now, but the Voltage is reading 2968V because readVcc delivers mV
    If I change the code to:

    float Vcc = readVcc()/1000;
    

    I get an error message "call of overloaded 'set(float&)'is ambiguous"
    How can I send decimal values to the Domoticz controller from MySensors?

    Regards, Frank

    zboblamontZ mfalkviddM 2 Replies Last reply
    0
    • F FrankVK

      Hi,

      I really enjoy using MySensors!

      Got a small general question though: I'm using a BH1750 light sensor, powered by a 3V battery and I'd like to keep an eye on the battery status.

      I have added a line to the existing BH1750 scetch:

      #define CHILD_ID_VCC = 1
      MyMessage msgVcc(CHILD_ID_VCC, V_VOLTAGE);
      .. 
      void Presentation() {
        sendSketchInfo("Light Lux Sensor", "1.1");
        present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
        present(CHILD_ID_VCC, S_MULTIMETER);
      }
      
      Loop() {
      uint16_t lux = lightSensor.readLightLevel();
      float Vcc = ReadVcc();
      
      send(msgLux.set(Lux));
      send(msgVcc.set(Vcc));
      }
      

      Domoticz recieves the data now, but the Voltage is reading 2968V because readVcc delivers mV
      If I change the code to:

      float Vcc = readVcc()/1000;
      

      I get an error message "call of overloaded 'set(float&)'is ambiguous"
      How can I send decimal values to the Domoticz controller from MySensors?

      Regards, Frank

      zboblamontZ Offline
      zboblamontZ Offline
      zboblamont
      wrote on last edited by
      #2

      @frankvk No programming skills, but is it correct trying to calculate in a procedure call rather than insert an intermediate step?
      If the ReadVcc() procedure call returns millivolts, suggest preceding the "float Vcc = ReadVcc();" with "int Voltage= ReadVcc();" and change the "float Vcc = ReadVcc();" to "float Vcc = Voltage/1000;", it should then do as you want.

      1 Reply Last reply
      0
      • F Offline
        F Offline
        FrankVK
        wrote on last edited by
        #3

        Hi Zboblamont,

        Thanks for your response, but the error occurs in the line, obviously because Vcc is of the type 'float'

        send(msgVcc.set(Vcc));
        
        
        zboblamontZ 1 Reply Last reply
        0
        • F FrankVK

          Hi Zboblamont,

          Thanks for your response, but the error occurs in the line, obviously because Vcc is of the type 'float'

          send(msgVcc.set(Vcc));
          
          
          zboblamontZ Offline
          zboblamontZ Offline
          zboblamont
          wrote on last edited by zboblamont
          #4

          @frankvk I'm no expert on this, but do know all my nodes send battery as a float for the last 2 years, excerpt as follows:

          // Call for battery reading, send in every 12th RTC call?
             if(halfday==12){
             digitalWrite(BatteryOn, HIGH);
             voltread = analogRead(BatteryIn);
             float voltage = (7.272 * voltread) / 1024;
             sleep(5);
             digitalWrite(BatteryOn, LOW);
             send(msg3.set(voltage,2));
             sleep(50);
             voltread=0;
             sleep(50);
             halfday=0;//Reset for 12 hourly cycle
          }
             halfday++;//Increment hourly cycle
          

          That is based on the internal value defined without any complications, but note that the message is sent to 2 decimal places, whether that truncation is essential for the MySensors environment I do not know, it was all I required.

          1 Reply Last reply
          0
          • electrikE Offline
            electrikE Offline
            electrik
            wrote on last edited by
            #5

            Is there a typo in your message or in your code?
            First you used ReadVcc(), then readVcc()

            1 Reply Last reply
            0
            • F FrankVK

              Hi,

              I really enjoy using MySensors!

              Got a small general question though: I'm using a BH1750 light sensor, powered by a 3V battery and I'd like to keep an eye on the battery status.

              I have added a line to the existing BH1750 scetch:

              #define CHILD_ID_VCC = 1
              MyMessage msgVcc(CHILD_ID_VCC, V_VOLTAGE);
              .. 
              void Presentation() {
                sendSketchInfo("Light Lux Sensor", "1.1");
                present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                present(CHILD_ID_VCC, S_MULTIMETER);
              }
              
              Loop() {
              uint16_t lux = lightSensor.readLightLevel();
              float Vcc = ReadVcc();
              
              send(msgLux.set(Lux));
              send(msgVcc.set(Vcc));
              }
              

              Domoticz recieves the data now, but the Voltage is reading 2968V because readVcc delivers mV
              If I change the code to:

              float Vcc = readVcc()/1000;
              

              I get an error message "call of overloaded 'set(float&)'is ambiguous"
              How can I send decimal values to the Domoticz controller from MySensors?

              Regards, Frank

              mfalkviddM Offline
              mfalkviddM Offline
              mfalkvidd
              Mod
              wrote on last edited by
              #6

              @frankvk could you post the entire sketch, including where readVcc comes from? Seeing the code will make it much easier to help you.

              1 Reply Last reply
              0
              • B Offline
                B Offline
                bgunnarb
                wrote on last edited by
                #7

                The line

                float Vcc = readVcc()/1000;
                

                should be:

                float Vcc = readVcc()/1000.;
                

                to start with. Note the decimal point! If read Vcc() returns a float, you cannot divide by an integer.

                I have never been so busy since I retired!

                K 1 Reply Last reply
                1
                • B bgunnarb

                  The line

                  float Vcc = readVcc()/1000;
                  

                  should be:

                  float Vcc = readVcc()/1000.;
                  

                  to start with. Note the decimal point! If read Vcc() returns a float, you cannot divide by an integer.

                  K Offline
                  K Offline
                  kimot
                  wrote on last edited by
                  #8

                  @bgunnarb
                  But readVcc returns long

                  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
                    ADCSRA |= _BV(ADSC); // Convert
                    while (bit_is_set(ADCSRA,ADSC));
                    result = ADCL;
                    result |= ADCH<<8;
                    result = 1126400L / result; // Back-calculate AVcc in mV
                    return result;
                  }```
                  mfalkviddM 1 Reply Last reply
                  0
                  • K kimot

                    @bgunnarb
                    But readVcc returns long

                    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
                      ADCSRA |= _BV(ADSC); // Convert
                      while (bit_is_set(ADCSRA,ADSC));
                      result = ADCL;
                      result |= ADCH<<8;
                      result = 1126400L / result; // Back-calculate AVcc in mV
                      return result;
                    }```
                    mfalkviddM Offline
                    mfalkviddM Offline
                    mfalkvidd
                    Mod
                    wrote on last edited by mfalkvidd
                    #9

                    A float can be divided by an integer. The result will be a float.

                    A long can be divided by an integer or a float. The result will differ though.
                    2968/1000 will give the integer 2
                    2968/1000.0 will give the float 2.968

                    See "Integer and floating point division" at https://www.learncpp.com/cpp-tutorial/32-arithmetic-operators/

                    zboblamontZ F B 3 Replies Last reply
                    1
                    • mfalkviddM mfalkvidd

                      A float can be divided by an integer. The result will be a float.

                      A long can be divided by an integer or a float. The result will differ though.
                      2968/1000 will give the integer 2
                      2968/1000.0 will give the float 2.968

                      See "Integer and floating point division" at https://www.learncpp.com/cpp-tutorial/32-arithmetic-operators/

                      zboblamontZ Offline
                      zboblamontZ Offline
                      zboblamont
                      wrote on last edited by
                      #10

                      @mfalkvidd @bgunnarb Something new learned from that, hadn't realised a procedure call could be mathematically manipulated like that, nor the subtle differences in the outputs...

                      1 Reply Last reply
                      0
                      • mfalkviddM mfalkvidd

                        A float can be divided by an integer. The result will be a float.

                        A long can be divided by an integer or a float. The result will differ though.
                        2968/1000 will give the integer 2
                        2968/1000.0 will give the float 2.968

                        See "Integer and floating point division" at https://www.learncpp.com/cpp-tutorial/32-arithmetic-operators/

                        F Offline
                        F Offline
                        FrankVK
                        wrote on last edited by FrankVK
                        #11

                        Actually, I needed to change 2 things: first one was dividing by 1000.0 rather than 1000 and the other one was calling send(msgVcc.set(Vcc, 2)); rather than send(msgVcc.set(Vcc)); Now the log reads 2.95V.

                        Thanks Mikael (@mfalkvidd) & everyone! Happy coding!

                        1 Reply Last reply
                        1
                        • mfalkviddM mfalkvidd

                          A float can be divided by an integer. The result will be a float.

                          A long can be divided by an integer or a float. The result will differ though.
                          2968/1000 will give the integer 2
                          2968/1000.0 will give the float 2.968

                          See "Integer and floating point division" at https://www.learncpp.com/cpp-tutorial/32-arithmetic-operators/

                          B Offline
                          B Offline
                          bgunnarb
                          wrote on last edited by
                          #12

                          @mfalkvidd
                          Yep, this is a great way of introducing errors that will be nearly impossible to find!:grinning:

                          I have never been so busy since I retired!

                          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