在 ESP8266 上使用 DeepSleep 进行精确计时

Precise timing with DeepSleep on an ESP8266

我有一个 ESP8266,我用它通过 MQTT 记录天气数据。因为我想节省一些电量,所以我决定使用 DeepSleep。因为我要记录数据,如果我能每分钟发送新条目就​​好了。

这曾经与我的旧草图一起工作,我在 loop 部分中完成了所有数据采集任务,并且我保持与 WiFi 和 MQTT 服务器的连接处于打开状态.

但这不适用于 DeepSleep。每次唤醒后都需要重新连接,每次唤醒后,ESP8266基本上都会重启。

因为每次唤醒的时间并不完全相同,所以我想知道是否有办法让 ESP8266 登录完全相同的时间戳并在两者之间进入 DeepSleep?

这是 DeepSleep 算法的代码示例:

String JSON = "{\"sensor\": \"Outdoor Sensor\", \"data\":[" + String(temp) + "," + String(hum) + "," + String(brightness) + "]}";
client.publish(topic, JSON.c_str(), true); //publish data as JSON to MQTT
delay(10); //somehow if this is not added, the data does not get logged.
Serial.println("Going into deep sleep for 60 seconds");
ESP.deepSleep(56e6); // because of microseconds - processing data takes about 4sec, but this is very unprecise

这是来自 PhpMyAdmin,为了更好地可视化问题:

如果 ESP8266 无法完成,ESP32 是否有帮助?

我找到了一个(不完美的)解决方法。 如果我这样做

Serial.println("Going into deep sleep so that next data gets posted in a minute");
Serial.println(60e6-micros());
ESP.deepSleep(60e6-micros()); // because of microseconds; micros() is reset on wake-up

然后我得到稍微好一点的结果。但是我不明白,为什么它不能正常工作。

在我看来应该如此,因为我计算了整个启动过程和代码 运行 所花费的时间,然后从 ESP8266 处于 DeepSleep 的时间中减去该时间。

如果时间跟踪很重要,建议使用外部 RTC。使用内部 RTC,改进睡眠期间时间流逝的测量显然包括猜测睡眠芯片的温度:

在 ESP8266 上保持时间在技术上非常具有挑战性。尽管被命名为 RTC,但它确实会在模块休眠时保持计数器滴答作响,其准确性在很大程度上取决于芯片的温度。一旦进入深度睡眠模式,所述温度就会发生显着变化,芯片处于活动状态时执行的校准在芯片进入睡眠状态后的片刻变得毫无用处。

http://arduino.stackexchange.com/questions/65530/ddg#65532

如果不需要高精度,我建议取几个样本并计算平均间隔误差。

间隔为 5 分钟的示例:

excel calculation screenshot

int32_t deep_sleep_time_compensation = -145000000; // chip temperature dependant deep sleep duration error compensation in μs
ESP.deepSleep(300e6-micros()-deep_sleep_time_compensation); // because of microseconds; micros() is reset on wake-up