Strona 1 z 2

Storage - czyli przechowywanie danych w urządzeniach

: pt wrz 11, 2020 8:41 pm
autor: klew
Niedawno do biblioteki SuplaDevice na Arduino IDE zostały dodane klasy typu Supla::Storage. Na razie są tam dwie implementacje:

Kod: Zaznacz cały

#include <supla/storage/eeprom.h>
oraz

Kod: Zaznacz cały

#include <supla/storage/fram_spi.h>
Ta pierwsza pracuje na wbudowanej pamięci EEPROM (na Arduino Mega) oraz na pamięci flash (ESP8266, ESP32).
Ta druga wymaga zewnętrznego urządzenia Adafruit FRAM SPI (w google łatwo znaleźć instrukcję podłączenia).
W tej chwili zapis do EEPROM/Flash jest robiony co 10 s, ale zapisuje tylko, gdy jest taka potrzeba. Ten domyślny czas będzie wydłużony (pewnie na 3-5 min). EEPROM/Flash trzeba oszczędzać, bo z reguły działa do około 100 000 zapisów. Dlatego wszystkim polecam doinstalować sobie pamięć FRAM (aktualnie wspieramy Adafruit FRAM SPI - jeśli ktoś ma inną kostkę, to dajcie znać). FRAM jest praktycznie niezniszczalny i bardzo szybki. Dlatego tutaj zapis jest realizowany co 1 s (o ile jest taka potrzeba).

Podstawowa obsługa Storage jest bardzo prosta. Wystarczy dodać odpowiedni include (jeden z dwóch opisanych wyżej) i potem stworzyć instancję odpowiedniej klasy (jedna z poniższych):

Kod: Zaznacz cały

// Hardware SPI
Supla::FramSpi fram(FRAM_CS, SUPLA_STORAGE_OFFSET);
// Software SPI
Supla::FramSpi fram(24, 22, 23, FRAM_CS, SUPLA_STORAGE_OFFSET); // <- sofrware spi, piny (SCK, MISO, MOSI, CS)
// EEPROM / Flash
Supla::Eeprom eeprom(SUPLA_STORAGE_OFFSET);
OFFSET oznacza adres, od którego zaczynamy zapis (domyślnie 0, ale można ustawić inny).

Tak wyposażony program będzie sobie zapisywał różne dane do pamięci trwałej (np. liczniki impulsów - zapiszą ilość impulsów, rolety zapiszą czas otwierania/zamykania oraz pozycję rolety, kolejne rzeczy będą dodane wkrótce).

Obsługa Storage będzie w najbliższym czasie rozbudowywana (np. sprawdzanie CRC, duplikowanie niektórych zapisów, aby się zabezpieczyć przed utratą danych, dodawanie nowych urządzeń przechowujących stan).

Re: Storage - czyli przechowywanie danych w urządzeniach

: czw paź 01, 2020 12:52 pm
autor: lukfud
Widzę, że dorzuciłeś zapis stanu przekaźników. Opiszesz w wolnej chwili?

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 7:53 am
autor: lukfud
@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 7:54 am
autor: klew
lukfud pisze:
śr paź 07, 2020 7:53 am
@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Nie. Jeśli podasz wartość mniejszą od 1000, to ustawia 1000, czyli 1 s.

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 7:59 am
autor: lukfud
klew pisze:
śr paź 07, 2020 7:54 am
lukfud pisze:
śr paź 07, 2020 7:53 am
@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Nie. Jeśli podasz wartość mniejszą od 1000, to ustawia 1000, czyli 1 s.
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 8:04 am
autor: klew
lukfud pisze:
śr paź 07, 2020 7:59 am
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.
Spójność z czym? ;)

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 8:08 am
autor: lukfud
klew pisze:
śr paź 07, 2020 8:04 am
lukfud pisze:
śr paź 07, 2020 7:59 am
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.
Spójność z czym? ;)
Jeśli nie użyję metody

Kod: Zaznacz cały

setStateSavePeriod(SUPLA_EEPROM_WRITING_PERIOD);
zapis będzie co 3 min., a jeśli użyję z wpisanym zerem to minuta. Dlaczego tak? :)

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 8:33 am
autor: Goral64
lukfud pisze:
śr paź 07, 2020 8:08 am
Jeśli nie użyję metody

Kod: Zaznacz cały

setStateSavePeriod(SUPLA_EEPROM_WRITING_PERIOD);
zapis będzie co 3 min., a jeśli użyję z wpisanym zerem to minuta. Dlaczego tak? :)
Jeśli z zerem to sekunda.
Pytanie czy tu zero powinno ustawiać domyślną czy najmniejszą możliwą wartość? A może powinno generować błąd, że wartość minimalna to 1000?

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 9:02 am
autor: lukfud
Goral64 pisze:
śr paź 07, 2020 8:33 am
Jeśli z zerem to sekunda.
Pytanie czy tu zero powinno ustawiać domyślną czy najmniejszą możliwą wartość? A może powinno generować błąd, że wartość minimalna to 1000?
Tak, sekunda (o niej myślałem), dzięki.
Jeśli domyślnie @klew wstawił 3 minuty, to zero mogłoby wskazywać na tą właśnie wartość ;)

Re: Storage - czyli przechowywanie danych w urządzeniach

: śr paź 07, 2020 10:02 am
autor: Goral64
lukfud pisze:
śr paź 07, 2020 9:02 am
Jeśli domyślnie @klew wstawił 3 minuty, to zero mogłoby wskazywać na tą właśnie wartość ;)
Będę się upierał, że brak wartości powinien przywoływać wartość domyślną :) Podanie jakiejkolwiek innej wartości powinno ustawiać tę wartość pod warunkiem, że jest w prawidłowym przedziale.
Czyli:

Kod: Zaznacz cały

setStateSavePeriod(1000); // 1 sekunda
setStateSavePeriod(0); // błąd (lub też wyłączenie autozapisu statusu)
setStateSavePeriod(); // wartość domyślna 180000 czyli 3 min