Хранение настроек в памяти Базового устройства

Привет! Если Вам посчастливилось подержать в руках микроконтроллер ESP32 (мне посчастливилось больше и у меня в руках M5Stack) от китайской компании ESPRESSIF, то этот пост, возможно, будет полезен.



Бывает ситуация, когда необходимо сохранить какие-то параметры в энергонезависимой памяти (например: подсчитывать количество включений устройства за всё время или сохранять настройки Wi-Fi). Это можно сделать с лёгкостью с помощью библиотеки Preferences.


Объявим экземпляр класса Preferences, а там видно будет...


Первое, что мы должны сделать — это создать связку ключей путём вызова метода begin с парой аргументов (но можно только с одним первым): именем связки и флагом "только для чтения".


Чтобы сохранить строковое значение в памяти, нужно передать ключ и само значение в метод, имя которого состоит из двух частей: первой — put и второй — имени типа, например: String. Всё ясно и понятно. Правда, есть ещё "сырые" байты без обжарки, которым никто не хочет присвоить тип. В таком случае метод принимает ещё и третий аргумент с количеством этих байтов. С этой процедурой вроде всё.


После того, как значение было записано, можно его прочесть с помощью метода (имя которого аналогично предыдущему), где первая часть будет get. Данный метод возвращает значение для ключа соответственного типа. Помните про случай с байтами? Если Вы не знаете (или не помните) сколько байт лежит по ключу, то дёргайте метод getBytesLength с единственным аргументом — ключом, она всё посчитает и вернёт количество в size_t.


Если Вы хотите удалить определённый ключ из связки, то отдайте его единственным аргументом методу remove.


Хотите навести настоящий марафет и очистить ВСЮ связку? Вызывайте без всяких аргументов метод clear!


Когда Вы пожелаете завершить работу со связкой, то вызовите метод end без каких-либо аргументов.


В общем поддерживаются следующие типы: Char, UChar, Short, UShort, Int, UInt, Long, ULong, Long64, ULong64, Float, Double, Bool, String и Bytes.


Понимаю, что хочется чего-то кода, поэтому вот скетч. Скетч подсчитывает количество включений устройства и выводит его на дисплей:


#include <M5Stack.h>
#include <Preferences.h>

Preferences preferences;
const char* key = "OnOff";
uint32_t count;

void setup() {
  m5.begin();
  preferences.begin("MyKeyChain");
  count = preferences.getUInt(key);
  preferences.putUInt(key, count + 1);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.println("Hello, Habr!");
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("M5Stack Turned On:");
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(TFT_RED);
  M5.Lcd.println(count);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("times");
}

void loop() { }

Ссылочка на библиотеку прилагается.

Комментарии 7

    0
    тоже недавно приехала ESP32. подзавис на этапе выбора IDE. в чём под неё писать и компилировать практичнее?
      +2
      привет! VScode или ATOM с Platformio.
        0

        А я сейчас накидал себе в корзину на aliexpress кучу вещей, связанных микроконтроллерами, в том числе nodemcu, это тот, что на esp8266, и вижу что на него и esp32 есть react.js, firebase и библиотека для построения автоматической ячеистой топологии, с одной esp выходящей в сеть. К этому остаётся решить проблему динамического ip. И меня очень интригует перспектива того что можно на основе этого сделать. Вот только думаю, вытянет ли nodemcu? Ибо если это реально будет объеденить — получится стек для потрясающей садовой системы, где ты расставляешь в нужных местах участка nodemcu на аккумуляторах, проводящие большую часть времени в глубоком сне, и планов снимающие показания с одним, ведущим, миконтроллером, с react.js, firebase, и дирижированием всей системы, предоставляющий юзер френдли интерфейс SPA приложения с обилием инфографики.
        Хотя может просто надо дать денег blynk, что б хватило на много графиков и фич.
        Как же чешутся руки проверить. Жаль, что не вижу ничего подобного.

          0
          Посмотрите в сторону mongoose os. В ней всё есть и можно на js дописывать.
          а по поводу графиков, сейчас обкатывают связку (так как всё было под рукой)
          Esp32->mqtt->php-mysql->ELK->grafana
          mqtt — протокол
          ELK — elastic search, logstash, kibana.

          image
          Это так, в виде развлечения
        +1
        Мне зашел platformio + clion
        Команды, которые пригодятся

        pio run -t upload; pio serialports monitor -b 115200
        pip install -U platformio
        platformio init --ide clion --board esp32dev
        https://platformio.org/lib/search?query=mqtt
        pio lib install "PubSubClient"
        platformio lib install "DHT sensor library"


        И для внешних (не ардуино ide) для nvs памяти нужно вызывать nvs_flash_init(); до настройки WiFi

        И по поводу стектрейса (EspStackTraceDecoder ищем на github), пригодится:
        java -jar EspStackTraceDecoder.jar C:/cygwin/bin/addr2line.exe ./.pio/build/esp32dev/firmware.elf ./dump.txt
        в dump.txt что то вроде (из порта выкидывает):
        0x4009118c:0x3ffe3980 0x400913bd:0x3ffe39a0 0x4008d71f:0x3ffe39c0 0x40130259:0x3ffe39e0 0x40086aba:0x3ffe3a00 0x400864fd:0x3ffe3a20 0x40086777:0x3ffe3a70 0x4012ff95:0x3ffe3aa0 0x4013015e:0x3ffe3ad0 0x401301b3:0x3ffe3af0 0x400e4423:0x3ffe3b10 0x400e4482:0x3ffe3b30 0x400d1473:0x3ffe3b50 0x400d155d:0x3ffe3b70 0x400d19a1:0x3ffe3b90 0x400d19cc:0x3ffe3bb0 0x400dbdff:0x3ffe3bd0 0x40081dcd:0x3ffe3bf0 0x40081fdc:0x3ffe3c20 0x40079053:0x3ffe3c40 0x400790b9:0x3ffe3c70 0x400790c4:0x3ffe3ca0 0x4007928d:0x3ffe3cc0 0x400806de:0x3ffe3df0 0x40007c31:0x3ffe3eb0 0x4000073d:0x3ffe3f20
        0

        документацию читать нынче не модно? гляньте https://docs.espressif.com/projects/esp-idf/en/latest/index.html там все по полочкам разложено.

          0

          не все начинающие могут понять, что там написано)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое