/*
DeepSleepタイマーの精度を確認する
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#define SLEEP 3600 // 1時間
#define SLEEP 600 // 10分間
//#define SLEEP 60 // 1分間
// Update these with values suitable for your network.
const char* ssid = "アクセスポイントのSSID";
const char* password = "アクセスポイントのパスワード";
const char* mqtt_server = "MQTTブローカーのIPアドレス";
WiFiClient espClient;
PubSubClient client(espClient);
//RTC memory(512Byte)の定義
struct {
uint32_t counter;
uint8_t data[508];
} rtcData;
// Connect AP
void setup_wifi() {
// We start by connecting to a WiFi network
Serial.print("Wait for WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// Connect MQTT server
void server_connect() {
char clientid[20];
sprintf(clientid,"ESP8266-%06x",ESP.getChipId());
Serial.print("clientid=");
Serial.println(clientid);
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT
connection...");
// Attempt to connect
if (client.connect(clientid)) {
Serial.println("connected");
} else {
Serial.print("failed,
rc=");
Serial.print(client.state());
Serial.println(" try again
in 5 seconds");
// Wait 5 seconds before
retrying
delay(5000);
}
}
}
void setup() {
unsigned long startMillis = millis();
delay(100);
Serial.begin(115200);
Serial.println();
Serial.print("ESP.getResetReason()=");
Serial.println(ESP.getResetReason());
String resetReason = ESP.getResetReason();
/*
enum rst_reason {
REANSON_DEFAULT_RST = 0, // ノーマルスタート。電源オンなど。
REANSON_WDT_RST = 1, // ハードウェアウォッチドッグによるリセット
REANSON_EXCEPTION_RST = 2, //
例外によるリセット。GPIO状態は変化しない
REANSON_SOFT_WDT_RST = 3, //
ソフトウェアウォッチドッグによるリセット。GPIO状態は変化しない
REANSON_SOFT_RESTART = 4, //
ソフトウェアによるリセット。GPIO状態は変化しない
REANSON_DEEP_SLEEP_AWAKE= 5, // ディープスリープ復帰
REANSON_EXT_SYS_RST = 6, // 外部要因(RSTピン)によるリセット。
};
*/
rst_info *prst = ESP.getResetInfoPtr();
/*
struct rst_info{
uint32 reason;
uint32 exccause;
uint32 epc1;
uint32 epc2;
uint32 epc3;
uint32 excvaddr;
uint32 depc;
};
*/
Serial.print("reset reason=");
Serial.println(prst->reason);
// RTC memoryからデータを読み込む
if (ESP.rtcUserMemoryRead(0, (uint32_t*)
&rtcData, sizeof(rtcData))) {
Serial.println("rtcUserMemoryRead
Success");
if (prst->reason != 5) { // Not
REANSON_DEEP_SLEEP_AWAKE
rtcData.counter = 0;
} else {
rtcData.counter++;
}
} else {
Serial.println("rtcUserMemoryRead
Fail");
}
Serial.print("rtcData.counter=");
Serial.println(rtcData.counter);
// RTC memoryにデータを書き込む
if (ESP.rtcUserMemoryWrite(0, (uint32_t*)
&rtcData, sizeof(rtcData))) {
Serial.println("rtcUserMemoryWrite
Success");
} else {
Serial.println("rtcUserMemoryWrite
Fail");
}
setup_wifi();
Serial.println("Starting MQTT Client");
client.setServer(mqtt_server, 1883);
server_connect();
unsigned long connectedMillis = millis();
Serial.print("startMillis=");
Serial.print(startMillis);
Serial.print(" conectedMillis=");
Serial.print(connectedMillis);
// 接続までに必要な時間(Mill Sec)
unsigned long diffMillis =
connectedMillis-startMillis;
Serial.print(" diffMillis=");
Serial.println(diffMillis);
// 接続までに必要な時間を考慮したDeepSleep時間(Micro Sec)
uint32_t time_us = SLEEP * 1000 * 1000;
time_us = time_us - (diffMillis*1000);
Serial.print("time_us=");
Serial.println(time_us);
// MQTT publish
char topic[50];
char msg[50];
sprintf(topic,"DeepSleep/ESP8266-%06x",ESP.getChipId());
sprintf(msg,"%02x %d %d",rtcData.counter,
diffMillis, time_us);
Serial.println(msg);
client.publish(topic, msg);
client.disconnect();
WiFi.disconnect();
// DEEP SLEEPモード突入
Serial.println("DEEP SLEEP START!!");
ESP.deepSleep(time_us , WAKE_RF_DEFAULT);
delay(1000);
}
void loop() {
}
|