I’m using deep sleep to wake up xiao esp32s3 and send some data from sensor via lora every 300 seconds. But after random power cycles, xiao esp32s3 will stop working and cannot wake up anymore, no matter how long I wait. I powered it with battery, and there is still sufficient voltage (4v). Here is my code, any ideas?
#include <Wire.h>
#include "esp_sleep.h"
// #include "driver/rtc_io.h"
#include "config.h"
#define PD_PIN GPIO_NUM_3
#define I2C_ADDR 0x6D
float pressure; // celsius
float temperature; // gauge pressure in kPa
void setup() {
// turn on debug led
// pinMode(LED_BUILTIN, OUTPUT);
// digitalWrite(LED_BUILTIN, LOW);
// add watch dog
esp_task_wdt_deinit();
esp_task_wdt_init(&wdt_config);
esp_task_wdt_add(NULL);
// turn on sensor
// rtc_gpio_deinit(PD_PIN);
pinMode(PD_PIN, OUTPUT);
digitalWrite(PD_PIN, LOW);
Wire.begin();
delay(5);
// default interval
uint32_t uplinkIntervalSeconds = 300UL;
// init lora
radio.begin();
radio.setRfSwitchPins(38, RADIOLIB_NC);
node.beginOTAA(joinEUI, devEUI, nwkKey, appKey);
node.activateOTAA();
node.setDwellTime(true, 400);
// collect data
uint8_t reg[0xD0] = {0};
if (readRegisters(0x00, reg, sizeof(reg))) {
processSensorData(reg);
}
// package data
uint8_t temperature_est = (uint8_t)(temperature + 128);
uint16_t pressure_est = (pressure > 0) ? (uint16_t)pressure : 0;
uint8_t uplinkPayload[3];
uplinkPayload[0] = temperature_est;
uplinkPayload[1] = highByte(pressure_est);
uplinkPayload[2] = lowByte(pressure_est);
// send data
if (node.sendReceive(uplinkPayload, sizeof(uplinkPayload)) != RADIOLIB_ERR_NONE) {
uplinkIntervalSeconds = 60UL;
};
// sleep
radio.sleep();
esp_sleep_enable_timer_wakeup(uplinkIntervalSeconds * 1000000UL);
esp_deep_sleep_start();
}
void loop() {}
bool readRegisters(uint8_t startAddr, uint8_t *data, uint8_t length) {
Wire.beginTransmission(I2C_ADDR);
Wire.write(startAddr);
if(Wire.endTransmission() != 0) {
return false;
}
Wire.requestFrom(I2C_ADDR, length);
for(int i=0; i<length && Wire.available(); i++) {
data[i] = Wire.read();
}
return true;
}
void processSensorData(uint8_t *Reg) {
// pressure data
int32_t pdata = (((uint32_t)Reg[0x06] << 16) |
((uint32_t)Reg[0x07] << 8) |
Reg[0x08]) & 0xFFFFFF;
if(Reg[0x06] & 0x80) pdata |= 0xFF000000;
// temperature data
int32_t tdata = (((uint32_t)Reg[0x09] << 16) |
((uint32_t)Reg[0x0A] << 8) |
Reg[0x0B]) & 0xFFFFFF;
if(Reg[0x09] & 0x80) tdata |= 0xFF000000;
// calc temp in C
temperature = (float)tdata / 65536.0 + 25.0;
uint8_t decimal_places = (Reg[0xCF] >> 5) & 0x07;
int16_t rangeL_raw = (Reg[0xC5] << 8) | Reg[0xC6];
int16_t rangeH_raw = (Reg[0xC7] << 8) | Reg[0xC8];
float rangeL = (float)rangeL_raw / pow(10, decimal_places);
float rangeH = (float)rangeH_raw / pow(10, decimal_places);
// calc pressure in MPa
pressure = (rangeH - rangeL) *
((float)(pdata - 8388608 * 0.1) / (8388608 * 0.8)) +
rangeL;
// MPa to kPa
pressure *= 1000;
}