NRF52 -> Will not wake after sleep
-
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?
-
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.
-
I have a feeling that the
Wait()
Is the problem but haven't had time to investigate.
-
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.
-
@nagelc can you use
MY_DEBUG_VERBOSE_NRF5_ESBDo I need to add a bigger capacitor between gnd and +3?
-
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_SketchI have the nrf5 routines and some battery routines in separate files for convenience, but I think we are using the same code otherwise.
-
@nagelc Thanks will try
-
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.
-
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