0

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

这曾经与我的旧草图一起工作,我在循环部分中有所有数据采集任务,并且我保持与 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 可能有帮助吗?

4

2 回答 2

1

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

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

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

在不需要高精度的地方,我建议采取一些样本并计算平均间隔误差。

以 5 分钟为间隔的示例:

excel计算截图

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
于 2021-08-22T17:41:04.047 回答
0

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

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 的时间中减去该时间。

于 2018-03-17T09:24:14.053 回答