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. NRF52 -> Will not wake after sleep

NRF52 -> Will not wake after sleep

Scheduled Pinned Locked Moved Troubleshooting
9 Posts 3 Posters 778 Views 1 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.
  • S Offline
    S Offline
    smilvert
    wrote on last edited by
    #1

    Hi

    Finally I have had time to solder my project, Temp_hum, and started to create the code for it. But I struggle with some bascis

    Code for the sensor:

    
    #define MY_NODE_ID 37
    
    // Enable debug prints
    #define MY_DEBUG
    
    // #define MY_DEBUG_VERBOSE_NRF5_ESB
    #define MY_BAUD_RATE 115200
    
    // Enable and select radio type attached
    //#define MY_RADIO_RF24
    //#define MY_RADIO_RFM69
    //#define MY_RS485
    #define MY_RADIO_NRF5_ESB
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_VOLT 2
    
    #define IS_NRF52
    // #define IS_NRF51
    
    #define SHORT_WAIT 100
    
    // Sleep time between sensor updates (in milliseconds)
    static const uint64_t UPDATE_INTERVAL = 6000;
    
    static bool metric = true;
    
    float batteryPcnt;
    float oldBatteryPcnt;
    
    #include <MySensors.h>
    #include <SI7021.h>
    
    static SI7021 sensor;
    
    void disableNfc()
    { //only applied to nRF52
    
    #ifdef IS_NRF52
      //Make pins 9 and 10 usable as GPIO pins.
      NRF_NFCT->TASKS_DISABLE = 1; //disable NFC
      NRF_NVMC->CONFIG = 1;        // Write enable the UICR
      NRF_UICR->NFCPINS = 0;       //Make pins 9 and 10 usable as GPIO pins.
      NRF_NVMC->CONFIG = 0;        // Put the UICR back into read-only mode.
    #endif
    }
    
    void turnOffRadio()
    {
      NRF_RADIO->TASKS_DISABLE = 1;
      while (!(NRF_RADIO->EVENTS_DISABLED))
      {
      } //until radio is confirmed disabled
    }
    
    void turnOffAdc()
    {
    #ifndef IS_NRF52
      if (NRF_SAADC->ENABLE)
      { //if enabled, then disable the SAADC
        NRF_SAADC->TASKS_STOP = 1;
        while (NRF_SAADC->EVENTS_STOPPED)
        {
        }                      //wait until stopping of SAADC is confirmed
        NRF_SAADC->ENABLE = 0; //disable the SAADC
        while (NRF_SAADC->ENABLE)
        {
        } //wait until the disable is confirmed
      }
    #endif
    }
    
    void turnOffUarte0()
    {
    #ifndef IS_NRF52
      NRF_UARTE0->TASKS_STOPRX = 1;
      NRF_UARTE0->TASKS_STOPTX = 1;
      NRF_UARTE0->TASKS_SUSPEND = 1;
      NRF_UARTE0->ENABLE = 0; //disable UART0
      while (NRF_UARTE0->ENABLE != 0)
      {
      }; //wait until UART0 is confirmed disabled.
    #endif
    
    #ifdef IS_NRF51
      NRF_UART0->TASKS_STOPRX = 1;
      NRF_UART0->TASKS_STOPTX = 1;
      NRF_UART0->TASKS_SUSPEND = 1;
      NRF_UART0->ENABLE = 0; //disable UART0
      while (NRF_UART0->ENABLE != 0)
      {
      }; //wait until UART0 is confirmed disabled.
    #endif
    }
    
    void turnOffHighFrequencyClock()
    {
      NRF_CLOCK->TASKS_HFCLKSTOP = 1;
      while ((NRF_CLOCK->HFCLKSTAT) & 0x0100)
      {
      } //wait as long as HF clock is still running.
    }
    
    void mySleepPrepare()
    { //turn-off energy drains prior to sleep
      turnOffHighFrequencyClock();
      turnOffRadio();
      //turnOffUarte0();
    }
    
    void presentation()
    {
      Serial.println("Presentation");
      // Send the sketch info to the gateway
      sendSketchInfo("TemperatureAndHumidity", "1.2");
    
      // Present sensors as children to gateway
      present(CHILD_ID_HUM, S_HUM, "Humidity");
      delay(SHORT_WAIT);
      present(CHILD_ID_TEMP, S_TEMP, "Temperature");
      delay(SHORT_WAIT);
      present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
    
      metric = getControllerConfig().isMetric;
      Serial.println("End presention");
    }
    
    void setup()
    {
      Serial.println("Setup");
      hwInit();
      
      disableNfc(); //remove unnecessary energy drains
      turnOffAdc(); //remove unnecessary energy drains
      while (not sensor.begin())
      {
        Serial.println(F("Sensor not detected!"));
        wait(5000);
      }
      Serial.println("End Setup");
    }
    
    void mySleep(uint32_t ms)
    {
      mySleepPrepare();  //Take steps to reduce drains on battery current prior to sleeping
      sleep(ms);
    }
    
    void loop()
    {
      // Read temperature & humidity from sensor.
      const float temperature = float(metric ? sensor.getCelsiusHundredths() : sensor.getFahrenheitHundredths()) / 100.0;
      const float humidity = float(sensor.getHumidityBasisPoints()) / 100.0;
    
    #ifdef MY_DEBUG
      Serial.print(F("Temp "));
      Serial.print(temperature);
      Serial.print(metric ? 'C' : 'F');
      Serial.print(F("\tHum "));
      Serial.println(humidity);
    #endif
    
      static MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      static MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      static MyMessage msgBattery(CHILD_ID_VOLT, V_VOLTAGE);
    
      send(msgTemp.set(temperature, 2));
    
      wait(SHORT_WAIT);
      send(msgHum.set(humidity, 2));
    
      float batteryVolt = getInternalVoltage();
      batteryPcnt =(batteryVolt / 3.3) * 100;
      if (batteryPcnt > 100)
      {
        batteryPcnt = 100;
      }
    #ifdef MY_DEBUG
      Serial.print(F("Vbat "));
      Serial.print(batteryVolt);
      Serial.print(F(" Battery percent "));
      Serial.println(batteryPcnt);
    #endif
    
      // Battery readout should only go down. So report only when new value is smaller than previous one.
      if (batteryPcnt < oldBatteryPcnt)
      {
    
        wait(SHORT_WAIT);
        send(msgBattery.set(batteryVolt, 3));
        wait(SHORT_WAIT);
        if (batteryPcnt < oldBatteryPcnt)
        {
          sendBatteryLevel(batteryPcnt);
          oldBatteryPcnt = batteryPcnt;
        }
    
        // Sleep until next update to save energy
        // 
        
      }
      //delay(5000);
      mySleep(UPDATE_INTERVAL);
    }
    
    float getInternalVoltage()
    {
      return ((float)hwCPUVoltage()) / 1000.0;
    }
    
    

    Have some problems.

    First and biggest: The sensor will not wake,

    2577 TSF:MSG:SEND,37-37-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:33.34
    Vbat 3.29 Battery percent 99.67
    2587 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    2591 TSF:TDI:TPD
    8593 MCO:SLP:WUP=-1
    8595 TSF:TRI:TPU
    Temp 23.46C	Hum 33.85
    8626 TSF:MSG:SEND,37-37-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:23.46
    8733 TSF:MSG:SEND,37-37-0-0,s=0,c=1,t=1,pt=7,l=5,sg=0,ft=0,st=OK:33.85
    Vbat 3.29 Battery percent 99.67
    8743 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    8748 TSF:TDI:TPD
    

    (Some times I got stuck at:

    5803 MCO:SLP:MS=6000,SMS=0,I1=255,M1=255,I2=255,M2=255
    5807 TSF:TDI:TPD
    11809 MCO:SLP:WUP=-1
    11811 TSF:TRI:TPU
    Temp 22.69C	Hum 31.08
    11842 TSF:MSG:SEND,37-37-0-0,s=1,c=1,t=0,pt=7,l=5,sg=0,ft=0,st=OK:22.69
    

    )

    Second when im trying to debug with

    #define MY_DEBUG_VERBOSE_NRF5_ESB
    

    the node will not pass presentation.

    153 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=5
    4158 TSF:MSG:SEND,37-37-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.3.2
    4164 NRF5:SND:TO=0,LEN=8,PID=1,NOACK=0
    4169 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4174 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
    4180 NRF5:RX:LEN=9,NOACK=0,PID=2,RSSI=-74,RX=0
    4184 TSF:MSG:READ,0-0-37,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
    4190 NRF5:RX:LEN=8,NOACK=0,PID=1,RSSI=-53,RX=0
    4194 TSF:MSG:READ,0-0-37,s=255,c=3,t=6,pt=0,l=1,sg=0:M
    Presentation
    4200 NRF5:SND:TO=0,LEN=29,PID=2,NOACK=0
    4206 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=5
    4210 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=11,pt=0,l=22,sg=0,ft=0,st=OK:TemperatureAndHumidity
    4218 NRF5:SND:TO=0,LEN=10,PID=3,NOACK=0
    4223 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4228 TSF:MSG:SEND,37-37-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:1.2
    4234 NRF5:SND:TO=0,LEN=15,PID=0,NOACK=0
    4239 NRF5:SND:END=1,ACK=1,RTRY=1,RSSI=-55,WAKE=4
    4244 TSF:MSG:SEND,37-37-0-0,s=0,c=0,t=7,pt=0,l=8,sg=0,ft=0,st=OK:Humidity
    

    Someone that can help me?

    1 Reply Last reply
    1
    • berkseoB Offline
      berkseoB Offline
      berkseo
      wrote on last edited by
      #2

      Recently, I have faced exactly the same situation. Since this is no longer an isolated case, it means that the case is in the mysensors library.

      S 1 Reply Last reply
      0
      • berkseoB berkseo

        Recently, I have faced exactly the same situation. Since this is no longer an isolated case, it means that the case is in the mysensors library.

        S Offline
        S Offline
        smilvert
        wrote on last edited by smilvert
        #3

        I have a feeling that the

        Wait()
        

        Is the problem but haven't had time to investigate.

        1 Reply Last reply
        0
        • nagelcN Offline
          nagelcN Offline
          nagelc
          wrote on last edited by
          #4

          I'm stumped so far.
          I have a very similar board, bt832 + SI7021, with a very similar sketch, which seems to work OK.
          I don't see anything out of place in your sketch.

          S 1 Reply Last reply
          0
          • nagelcN nagelc

            I'm stumped so far.
            I have a very similar board, bt832 + SI7021, with a very similar sketch, which seems to work OK.
            I don't see anything out of place in your sketch.

            S Offline
            S Offline
            smilvert
            wrote on last edited by
            #5

            @nagelc can you use
            MY_DEBUG_VERBOSE_NRF5_ESB

            Do I need to add a bigger capacitor between gnd and +3?

            1 Reply Last reply
            0
            • nagelcN Offline
              nagelcN Offline
              nagelc
              wrote on last edited by
              #6

              I tried with MY_DEBUG_VERBOSE_NRF5_ESB, and it woke from sleep. I have it seeping for one minute.

              I posted my code to my github in case you want to take a look:
              https://github.com/spike314/BT8_SI_Sketch

              I have the nrf5 routines and some battery routines in separate files for convenience, but I think we are using the same code otherwise.

              S 1 Reply Last reply
              1
              • nagelcN nagelc

                I tried with MY_DEBUG_VERBOSE_NRF5_ESB, and it woke from sleep. I have it seeping for one minute.

                I posted my code to my github in case you want to take a look:
                https://github.com/spike314/BT8_SI_Sketch

                I have the nrf5 routines and some battery routines in separate files for convenience, but I think we are using the same code otherwise.

                S Offline
                S Offline
                smilvert
                wrote on last edited by
                #7

                @nagelc Thanks will try

                1 Reply Last reply
                0
                • berkseoB Offline
                  berkseoB Offline
                  berkseo
                  wrote on last edited by
                  #8

                  I don't remember exactly, but I think in my case it was due to using wait b sleep in before() and presentation(). This may be due to the power of the radio module.

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    smilvert
                    wrote on last edited by smilvert
                    #9

                    I have been trying @nagelc code with a lot of debug prints and I think that my device is stuck after

                    MyHwNRF5.cpp

                    inline void hwSleep(void)
                    {	CORE_DEBUG(PSTR("In hwSleep, 345\n"));
                    	__WFE();
                    	__SEV();
                    	__WFE();
                    	CORE_DEBUG(PSTR("In hwSleep, 351\n"));
                    }
                    
                    int8_t hwSleep(uint32_t ms)
                    {
                    	hwSleepPrepare(ms);
                    	while (nrf5_rtc_event_triggered == false) {
                    		hwSleep();
                    	}
                    	CORE_DEBUG(PSTR("In hwSleep, 357\n"));
                    	hwSleepEnd(ms);
                    	return MY_WAKE_UP_BY_TIMER;
                    }
                    

                    And I will not go to hwSleepEnd

                    11274 MCO:SLP:MS=5000,SMS=0,I1=255,M1=255,I2=255,M2=255
                    11280 TSF:TDI:TPD
                    11281 After transport Disable
                    11284 Before hwSleep
                    11286 In hwSleepPrepare, 287
                    11289 In hwSleepPrepare,300
                    11291 In hwSleep, 345
                    
                    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


                    18

                    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