• Categories
    • Recent
    • Tags
    • Popular
    • Register
    • Login

    About battery level

    Scheduled Pinned Locked Moved General Discussion
    14 Posts 4 Posters 3.6k Views 1 Watching
    Loading More Posts
    • 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.
    • bmanosB Offline
      bmanos @Anduril
      last edited by jkandasa

      @Anduril Thanks for helping me on this

      get a look at the following pleas

      This is the code without the battery

      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      
      #define CHILD_ID 0
      #include <MySensors.h>
      
      // Here we are setting up some water thresholds that we will
      // use later. Note that you will need to change these to match
      // your soil type and environment. It doesn't do much for me because I'm using domoticz
      int thresholdUp = 400;
      int thresholdDown = 075;
      
      MyMessage msg(CHILD_ID, V_LEVEL);
      unsigned long SLEEP_TIME = 30000;
      
      // We are setting up the pin A0 on the redboard to be our sensor
      // pin input:
      int sensorPin = A0;
      
      const int buzzer = 8; //buzzer to arduino pin 8
      
      void setup(){
        pinMode(buzzer, OUTPUT); // Set buzzer - pin 8 as an output
      }
      
      void presentation()
      {
      sendSketchInfo("Soil Moisture Sensor", "1.0");
      present(CHILD_ID, S_MOISTURE);
      }
      
      void loop()
      {
      int sensorValue;
      sensorValue = analogRead(sensorPin);
      //send back the values
      send(msg.set(sensorValue));
      if (sensorValue <= 800){
        tone(buzzer, 2000); 
        delay(1000);        
        noTone(buzzer);     
        delay(500);        
        Serial.println(sensorValue);
      }
      else{
        Serial.println(sensorValue);
        }
      // delay until next measurement (msec)
      
      sleep(SLEEP_TIME);
      
      }
      

      This is the code with battery code that seems to work ( I am waiting for the battery to run out to see if the values shown are correct)

      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      
      #define CHILD_ID 0
      #include <MySensors.h>
      
      // Here we are setting up some water thresholds that we will
      // use later. Note that you will need to change these to match
      // your soil type and environment. It doesn't do much for me because I'm using domoticz
      int thresholdUp = 400;
      int thresholdDown = 075;
      
      MyMessage msg(CHILD_ID, V_LEVEL);
      unsigned long SLEEP_TIME = 30000;
      //unsigned long SLEEP_TIME = 900000;  //15 minutes
      
      // We are setting up the pin A0 on the redboard to be our sensor
      // pin input:
      int sensorPin = A0;
      
      const int buzzer = 8; //buzzer to arduino pin 8
      
      void setup(){
        pinMode(buzzer, OUTPUT); // Set buzzer - pin 8 as an output
      }
      
      void presentation()
      {
      sendSketchInfo("Soil Moisture Sensor", "1.0");
      present(CHILD_ID, S_MOISTURE);
      }
      
      void loop()
      {
      int sensorValue;
      sensorValue = analogRead(sensorPin);
      //send back the values
      send(msg.set(sensorValue));
      if (sensorValue <= 800){
        tone(buzzer, 2000);
        delay(1000);       
        noTone(buzzer);    
        delay(1000);       
        Serial.println(sensorValue);
      }
      else{
        Serial.println(sensorValue);
        }
      // delay until next measurement (msec)
      
        #define MIN_V 2700
        #define MAX_V 4100
        int batteryPcnt = min(map(readVcc(), MIN_V, MAX_V, 0, 100), 100); // Convert voltage to percentage
        sendBatteryLevel(batteryPcnt); // Send battery percentage to gateway
      
      sleep(SLEEP_TIME);
      
      }
      
        long readVcc() {
          // Read 1.1V reference against AVcc
          // set the reference to Vcc and the measurement to the internal 1.1V reference
          #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
            ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
          #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
            ADMUX = _BV(MUX5) | _BV(MUX0);
          #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
            ADMUX = _BV(MUX3) | _BV(MUX2);
          #else
            ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
          #endif  
         
          delay(2); // Wait for Vref to settle
          ADCSRA |= _BV(ADSC); // Start conversion
          while (bit_is_set(ADCSRA,ADSC)); // measuring
         
          uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
          uint8_t high = ADCH; // unlocks both
         
          long result = (high<<8) | low;
         
          result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
          return result; // Vcc in millivolts
        }
      

      And this is the code with the battery from mysensors that is not working as I don't t get values from the soil moisture sensor and I am not sure that the battery level is working

      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      
      #define CHILD_ID 0
      #include <MySensors.h>
      
      // Here we are setting up some water thresholds that we will
      // use later. Note that you will need to change these to match
      // your soil type and environment. It doesn't do much for me because I'm using domoticz
      int thresholdUp = 400;
      int thresholdDown = 075;
      
      MyMessage msg(CHILD_ID, V_LEVEL);
      unsigned long SLEEP_TIME = 30000;
      
      // We are setting up the pin A0 on the redboard to be our sensor
      // pin input:
      int sensorPin = A1;
      int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
      
      const int buzzer = 8; //buzzer to arduino pin 8
      
      int oldBatteryPcnt = 0;
      
      void setup(){
        pinMode(buzzer, OUTPUT); // Set buzzer - pin 8 as an output
      // use the 1.1 V internal reference
      #if defined(__AVR_ATmega2560__)
        analogReference(INTERNAL1V1);
      #else
        analogReference(INTERNAL);
      #endif
      }
      
      void presentation()
      {
      sendSketchInfo("Soil Moisture Sensor", "1.0");
      present(CHILD_ID, S_MOISTURE);
      }
      
      void loop()
      {
      int sensorValue;
      sensorValue = analogRead(sensorPin);
      //send back the values
      send(msg.set(sensorValue));
      if (sensorValue <= 800){
        tone(buzzer, 2000);
        delay(1000);       
        noTone(buzzer);     
        delay(500);        
        Serial.println(sensorValue);
      }
      else{
        Serial.println(sensorValue);
        }
      // delay until next measurement (msec)
      
      // get the battery Voltage
        int sensorValueBat = analogRead(BATTERY_SENSE_PIN);
      #ifdef MY_DEBUG
        Serial.println(sensorValueBat);
      #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 = sensorValueBat / 10;
      
      #ifdef MY_DEBUG
        float batteryV  = sensorValueBat * 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
          sendBatteryLevel(batteryPcnt);
          oldBatteryPcnt = batteryPcnt;
        }
      
      sleep(SLEEP_TIME);
      
      }
      

      Also I have another issue I would like that the sleep function works differently for the sensor and for the battery level and I cannot figure how to do this yet

      Thanks

      1 Reply Last reply Reply Quote 0
      • A Offline
        Anduril
        last edited by

        Hey,

        I have a sensor working also using the readVCC lib as in your working example. But I don't see any obvious problem in your example using the voltage divider to read the battery voltage. Maybe you have a problem in your hardware connection to pin A1?
        Also one suggestion: between sending 2 messages, I prefer to include a wait(50). I had problems with lost messages when sending too fast, maybe my caps were depleted and my voltage dropped during sending.
        For your other problem I know how to do this, here an example:

        int counter=0
        
        void loop()
        if counter=120 {
           sendBatteryLevel(batteryPcnt);
           counter=0;
        }
        counter++
        sleep(30000);
        

        That way your battery is transmitted only once an hour, I use this also for my own sensor and it works great.

        bmanosB 1 Reply Last reply Reply Quote 0
        • bmanosB Offline
          bmanos @Anduril
          last edited by

          @Anduril thanks
          I will try your code for sending the battery status once an hour
          As for the A0, A1, A2 etc pins when I am using them alone they worked just fine but when I have A0 on battery and A1 on soil moisture the A1 never sends any signal (for the battery I don't know as the sensor don't work I did not connect the battery)

          1 Reply Last reply Reply Quote 0
          • bmanosB Offline
            bmanos
            last edited by jkandasa

            Hell @Anduril I try to add your code for having moisture level every 30 seconds and battery level every 50 minutes but look at my serial monitor I get the two values at the same time.
            Probably I am doing something wrong. Could you have a look at the loop code one more time please

            2413 MCO:SLP:WUP=-1
            2415 TSF:MSG:READ,0-0-2,s=255,c=3,t=6,pt=0,l=6,sg=0:Metric
            2422 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=OK:1021
            1021
            2433 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
            2439 MCO:SLP:MS=30000,SMS=0,I1=255,M1=255,I2=255,M2=255
            2444 MCO:SLP:TPD
            2446 MCO:SLP:WUP=-1
            2450 TSF:MSG:SEND,2-2-0-0,s=0,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=OK:1022
            1022
            2460 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
            2467 MCO:SLP:MS=30000,SMS=0,I1=255,M1=255,I2=255,M2=255
            2472 MCO:SLP:TPD
            

            my loop code is here:

            void loop()
            {
            int sensorValue;
            sensorValue = analogRead(sensorPin);
            send(msg.set(sensorValue));
            
            if (sensorValue <= 800){
              tone(buzzer, 2000); 
              delay(1000);        
              noTone(buzzer);     
              delay(1000);        
            }
            else{
              }
            
            // Battery
              #define MIN_V 2700
              #define MAX_V 3700
              int batteryPcnt = min(map(readVcc(), MIN_V, MAX_V, 0, 100), 100); // Convert voltage to percentage
              int counter=0;
            
            if (counter = 120) {
               sendBatteryLevel(batteryPcnt);
               counter=0;
            }
            counter++;
            
            sleep(30000);
            }
            
            jkandasaJ 1 Reply Last reply Reply Quote 0
            • jkandasaJ Offline
              jkandasa @bmanos
              last edited by

              @bmanos

              I see an error, if (counter = 120) should be if (counter == 120)

              1 Reply Last reply Reply Quote 0
              • bmanosB Offline
                bmanos
                last edited by

                thanks @jkandasa I will correct this
                Is the rest of code Ok?

                jkandasaJ 1 Reply Last reply Reply Quote 0
                • jkandasaJ Offline
                  jkandasa @bmanos
                  last edited by

                  @bmanos I do not see any other issues

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    Anduril
                    last edited by

                    @bmanos you should declare int counterin the header, not in the void loop(). The way you did it I think it will be set to 0 in each loop, never reaching 120. And of course @jkandasa is right, it has to be if (counter == 120)

                    1 Reply Last reply Reply Quote 1
                    • bmanosB Offline
                      bmanos
                      last edited by

                      thanks again @jkandasa and @Anduril for your help

                      1 Reply Last reply Reply Quote 0
                      • T Offline
                        Tag MOD
                        last edited by Tag

                        @bmanos said in About battery level:

                        delay until ne

                        One thing i saw in your sketch is this line

                          delay(1000);
                        

                        Delay will stop all processing, also the mysensors code...
                        what you preferably should use is:

                        wait(1000);
                        

                        In this case mysensors is still able to process
                        (just a little tip which will help coding, see this link for more information)

                        1 Reply Last reply Reply Quote 1
                        • First post
                          Last post

                        0

                        Online

                        590

                        Users

                        529

                        Topics

                        3.4k

                        Posts
                        Copyright © 2015-2025 MyController.org | Contributors | Localization