//#define LONG_SLEEP // longer light_sleeps don't crash as often #include #include #include #include void suspend(uint32_t ms) { uint64_t time_in_us = (uint64_t) ms * 1000; esp_err_t ret; ret = esp_sleep_enable_timer_wakeup(time_in_us); if (ret == ESP_OK) ret = esp_light_sleep_start(); if (ret != ESP_OK) Serial.printf("light_sleep error: %d", ret); } unsigned long adjustedMillis() { extern uint64_t s_microseconds_offset; // defined in components/newlib/time.c static uint64_t t0_diff = 0LL; // difference between RTC and millis() timer at T0 if (t0_diff == 0) t0_diff = s_microseconds_offset; return millis() + ((s_microseconds_offset - t0_diff) / 1000); } #define TIMER_CLEAR timerclear(&tv1); timerclear(&tv2); timerclear(&tvd) #define TIMER_START gettimeofday(&tv1, (struct timezone*)0) #define TIMER_STOP gettimeofday(&tv2, (struct timezone*)0) #define TIMER_SUB timersub(&tv2, &tv1, &tvd) // time_t is an int32_t on ESP32 so need to cast before multiplying #define TIMER_ELAPSED ((tvd.tv_usec + ((int64_t)tvd.tv_sec * 1000000)) / 1000.0) struct timeval tv1, tv2, tvd; time_t now; void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); // 6nov17 SDK=v3.0-dev-899-g3a271a4a // 6dec17 SDK=v3.0-dev-1325-ge5b2c1cf Serial.printf("\nSDK version: %s\n", ESP.getSdkVersion()); Serial.printf(" time ms adjms tod\n"); TIMER_START; } void loop() { static int ledON = 0; if (ledON) digitalWrite(LED_BUILTIN, LOW); else digitalWrite(LED_BUILTIN, HIGH); ledON ^= 1; time(&now); TIMER_STOP; TIMER_SUB; Serial.printf("%5d %7lu %7lu %10.2f\n", now, millis(), adjustedMillis(), TIMER_ELAPSED); #if LONG_SLEEP suspend(1000); #else for (int i=0; i<100; i++) suspend(10); // small time values cause light_sleep to hang often #endif }