• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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)."
 
Сверху Снизу