• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Использование RTC-памяти и режим глубокого сна.

p-a-h-a

Member
Из эксперементов: ESP8266 когда просыпается то сама подключается с DHCP, а вот если в Setup вставить WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); то DHCP отключен и соединение происходит быстрее. Пики на графике - DHCP, ровная линия - примерно 190 мс millis без DHCP.
1611144115566.png
 

nikolz

Well-known member
Из эксперементов: ESP8266 когда просыпается то сама подключается с DHCP, а вот если в Setup вставить WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); то DHCP отключен и соединение происходит быстрее. Пики на графике - DHCP, ровная линия - примерно 190 мс millis без DHCP.
читайте об это здесь:
 

CodeNameHawk

Moderator
Команда форума
Из эксперементов: ESP8266 когда просыпается то сама подключается с DHCP, а вот если в Setup вставить WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); то DHCP отключен и соединение происходит быстрее.
Попробуйте еще добавить это
WiFi.begin(ssid, password, channel, bssid, connect)
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-class.html?highlight=wifi.begin
 

p-a-h-a

Member
Написал библиотеку для использования RTC. Можно сохранять любые типы данных любого размера (не более 508 байт) с проверкой crc32. Данные автоматически выравниваются по 4 байта. Вот пример. Вдруг кому пригодиться. Сначала нужно выделить память под все переменные, потом можно читать/писать.
C++:
#include <Arduino.h>
#include <esp8266RTCmemory.h>

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.printf("RTC free space = %d byte.\n", esp8266RTCmemory::freeSpace());//Свободная память
  int8_t arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // масив. Не кратен 4 байтам
  esp8266RTCmemory RTC(sizeof(arr));                // выделяю память в ртс при создании экземпляра. Займет 12 байт в RTC
  Serial.printf("RTC free space = %d byte.\n", esp8266RTCmemory::freeSpace());
  RTC.write(arr); // запоминаю в ртс. Функция возвращает true/false
  int8_t newArr[sizeof(arr)];//Новый массив, куда будем восстанавливать данные из RTC
  RTC.read(newArr); // читаю из ртс в новый массив. Функция возвращает true/false что сообщает о корректности считанных данных
  for (int i = 0; i < (int)sizeof(arr); i++)
  {
    Serial.printf("newArr[%d]=%d\n", i, newArr[i]);
  }
 
  byte x = 5;
  esp8266RTCmemory rtc2(sizeof(x)); //Займет 4 байта в RTC
  Serial.printf("RTC free space = %d byte.\n", esp8266RTCmemory::freeSpace());
  rtc2.write(x);
  byte y = 0;
  rtc2.read(y);
  Serial.printf("rtc2= %d\n", y);

  typedef struct __attribute__((packed, aligned(1)))
  {
    uint32_t var1 : 1;
    uint32_t var2 : 2;  
    uint32_t var3 : 3;  
    uint32_t var4 : 11; 
    uint32_t var5 : 5; 
    uint32_t var6 : 7; 
  } B;                  
  B b;
  B c;
  b.var1 = 1;
  b.var2 = 2;
  b.var3 = 3;
  b.var4 = 4;
  b.var5 = 5;
  b.var6 = 6;
  esp8266RTCmemory rtc3(sizeof(b)); //Займет 4 байта в RTC
  Serial.printf("RTC free space = %d byte.\n", esp8266RTCmemory::freeSpace());
  rtc3.write(b);
  rtc3.read(c);
  Serial.printf("%d, %d, %d, %d, %d, %d\n", c.var1, c.var2, c.var3, c.var4, c.var5, c.var6);
}

void loop()
{
  delay(1000);
}
 

Вложения

p-a-h-a

Member
Допилил библиотеку. Особенно удобно стало при необходимости сохранения простых переменных. Теперь с экземпляром можно обращаться как с переменной. Функции сохранения структур остались. Все есть в примерах.
C++:
#include <esp8266RTCmemory.h>
esp8266RTCmemory numberReboots(sizeof(int32_t)); // Создаем экземпляр класса, с которым будем работать как с переменной
esp8266RTCmemory doubleValue(sizeof(double));// Еще один

void setup()
{
    Serial.begin(74880); // как и у лога ESP
    if (numberReboots.crcOk() == false)//Проверяем контрольную сумму в RTC памяти у любого экземпляра.
    {
        Serial.printf("\nПервая загрузка или сбой!\n");
        numberReboots = 0; // Обязательно присвоить значение для записи crc при первом включении
        doubleValue = 0.0;
    }
    else
    {
        numberReboots++; // не работает для переменных с плавающей точкой
        if (numberReboots % 4 == 0)// Каждую 4ю загрузку увеличиваем doubleValue.
        {
            doubleValue += 0.5;
        }
        Serial.printf("\nЗагрузка № %d doubleValue = %f\n", (int32_t)numberReboots, (double)doubleValue);
    }
    ESP.deepSleep(5e6);
}
void loop() {}
 

Вложения

enjoynering

Well-known member
Главное, чтобы эта структура не занимала больше 512 байт в памяти.

не правильно тк внезапно arduino esp8266 использует часть RTC для своих нужд:

Код:
    - RTC memory layout:
      |<--system data (256-bytes)-->|<--OTA (128-bytes)|--user data (512-bytes)-->|
                                    0                  31                         127

первые 256-байт используются системными переменными и к ним доступа нет. итого пользователю доступно 512-байт с 4-х битным адресным пространством. те получаем 128 ячеек, от 0 до 127 по 4-бита каждая. но есть нюанс... если вы используете OTA то пер 128-байт (0...31 ячейка) будут затерты служебной информацией OTA. те получаем, что безопасно можно использовать только 256-байт (ячейки 31..127).

Код:
ESP.rtcUserMemoryWrite(32, dataBuffer, sizeof(dataBuffer)); //запись в ячеку 32

все это есть в дока на arduino esp8266, но кто их щас читает.
 

enjoynering

Well-known member
в текст закралась очепятка. конечно "...безопасно можно использовать только 256-байт (ячейки 32..127)."
 
Сверху Снизу