Здравствуйте.
При использовании EEPROM с модулем NodeMCU периодически сбрасывается сохраненное значение в ячейке памяти после очередного пробуждения модуля от сна. Некоторое время все работает нормально, счетчик с переменной N увеличивается, но в какой-то момент (обычно более 100 пробуждений) счетчик сбрасывается в 0. Один раз сбросился в -1. После того как сбросится, значение в памяти начинает скакать вверх-вниз при каждом пробуждении. Заливаю скетч в модуль, все начинает работать нормально некоторое время.
Прошу прощения за длинный код, специально не стал обрезать лишнее, вдруг в этом причина. На рисунке ситуация после сброса счетчика в памяти. Параллельно вывожу информацию на дисплей, там такие же ошибочные значения счетчика. Подскажите, пожалуйста, что не так?
При использовании EEPROM с модулем NodeMCU периодически сбрасывается сохраненное значение в ячейке памяти после очередного пробуждения модуля от сна. Некоторое время все работает нормально, счетчик с переменной N увеличивается, но в какой-то момент (обычно более 100 пробуждений) счетчик сбрасывается в 0. Один раз сбросился в -1. После того как сбросится, значение в памяти начинает скакать вверх-вниз при каждом пробуждении. Заливаю скетч в модуль, все начинает работать нормально некоторое время.
Прошу прощения за длинный код, специально не стал обрезать лишнее, вдруг в этом причина. На рисунке ситуация после сброса счетчика в памяти. Параллельно вывожу информацию на дисплей, там такие же ошибочные значения счетчика. Подскажите, пожалуйста, что не так?
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <EEPROM.h>
#include <GyverOLED.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
WiFiClient client;
const char* mySSID = "****";
const char* mySSIDpass = "*****";
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "****";
int n, k, l, l1, l2;
int Time = 900000000;
IPAddress ip(192,168,0,37);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress dns1(77,88,8,8);
IPAddress dns2(8,8,8,8);
void setup()
{
WiFi.mode(WIFI_STA);
WiFi.config(ip, gateway, subnet, dns1, dns2);
WiFi.disconnect();
delay(100);
WiFi.begin(mySSID, mySSIDpass);
oled.init();
oled.clear();
oled.setScale(2);
oled.setContrast(5);
oled.home();
Serial.begin(74880);
EEPROM.begin(256);
/*k = 0; Первоначальная инициализация счетчиков
l = 0;
l1 = 0;
l2 = 0;
EEPROM.put(10, k);
EEPROM.put(20, l);
EEPROM.put(30, l1);
EEPROM.put(40, l2);
EEPROM.commit();*/
EEPROM.get(10, k);
EEPROM.get(20, l);
EEPROM.get(30, l1);
EEPROM.get(40, l2);
n = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
oled.print(".");
n++;
if (n > 60)
{
l++; //Увеличение счетчика ошибок при подключении к WiFi
oled.clear();
oled.home();
oled.print("Error WiFi");
EEPROM.put(20, l);
EEPROM.commit();
delay(1000);
ESP.deepSleep(Time);
}
}
oled.clear();
oled.home();
oled.print("Connect");
oled.setCursor(0, 2);
String s = String(k) + " " + String(l) + " " + String(l1) + " " + String(l2);
oled.print(s);
timeClient.begin();
timeClient.setTimeOffset(10800);
delay(100);
}
void loop()
{
timeClient.update();
int currentHour = timeClient.getHours();
int currentMinute = timeClient.getMinutes();
String s;
if (currentHour < 10) s = "0" + String(currentHour);
else s = String(currentHour);
if (currentMinute < 10) s = s + ":" + "0" + String(currentMinute);
else s = s + ":" + String(currentMinute);
EEPROM.get(10, k);
k++; //Увеличение счетчика удачных подключени к WiFi
EEPROM.put(10, k);
EEPROM.commit();
updateThingSpeak("field5=" + String(k));
delay(5000);
oled.setCursor(0, 6);
oled.print(s);
delay(100);
ESP.deepSleep(Time);
}
void updateThingSpeak(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
if (client.connected())
{
oled.setCursor(0, 4);
oled.print("update th");
}
else
{
oled.setCursor(0, 4);
oled.print("error th");
l2++; //Увеличение счетчика ошибок при обновлениии данных на сайте
EEPROM.put(40, l2);
EEPROM.commit();
}
}
else
{
oled.setCursor(0, 4);
oled.print("error th");
l2++; //Увеличение счетчика ошибок при обновлениии данных на сайте
EEPROM.put(40, l2);
EEPROM.commit();
}
}
Вложения
-
55.3 KB Просмотры: 0