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

时间:2018-03-16 20:17:49

标签: arduino esp8266 arduino-esp8266 esp32

我有一个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,以便更好地可视化问题:

enter image description here

如果ESP8266无法完成,ESP32可能有帮助吗?

1 个答案:

答案 0 :(得分: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中的时间。