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.0k 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
              • bgunnarbB Offline
                bgunnarbB 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
                • bgunnarbB 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 bgunnarbB 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/

                          bgunnarbB Offline
                          bgunnarbB 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
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          13

                          Online

                          11.7k

                          Users

                          11.2k

                          Topics

                          113.1k

                          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