Storage - czyli przechowywanie danych w urządzeniach

User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Niedawno do biblioteki SuplaDevice na Arduino IDE zostały dodane klasy typu Supla::Storage. Na razie są tam dwie implementacje:

Code: Select all

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

Code: Select all

#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):

Code: Select all

// 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).
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

Widzę, że dorzuciłeś zapis stanu przekaźników. Opiszesz w wolnej chwili?
https://www.facebook.com/groups/supladiy/
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

@klew, jeśli dodam metodę

Code: Select all

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Wed Oct 07, 2020 7:53 am @klew, jeśli dodam metodę

Code: Select all

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Nie. Jeśli podasz wartość mniejszą od 1000, to ustawia 1000, czyli 1 s.
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Wed Oct 07, 2020 7:54 am
lukfud wrote: Wed Oct 07, 2020 7:53 am @klew, jeśli dodam metodę

Code: Select all

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ść.
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Wed Oct 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? ;)
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Wed Oct 07, 2020 8:04 am
lukfud wrote: Wed Oct 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

Code: Select all

setStateSavePeriod(SUPLA_EEPROM_WRITING_PERIOD);
zapis będzie co 3 min., a jeśli użyję z wpisanym zerem to minuta. Dlaczego tak? :)
https://www.facebook.com/groups/supladiy/
User avatar
Goral64
Posts: 3152
Joined: Fri Dec 27, 2019 6:22 pm
Location: Żerniki Wrocławskie

Post

lukfud wrote: Wed Oct 07, 2020 8:08 am Jeśli nie użyję metody

Code: Select all

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?
Widzimy się na Supla Offline Party Season 2 :D

Image
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

Goral64 wrote: Wed Oct 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ść ;)
https://www.facebook.com/groups/supladiy/
User avatar
Goral64
Posts: 3152
Joined: Fri Dec 27, 2019 6:22 pm
Location: Żerniki Wrocławskie

Post

lukfud wrote: Wed Oct 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:

Code: Select all

setStateSavePeriod(1000); // 1 sekunda
setStateSavePeriod(0); // błąd (lub też wyłączenie autozapisu statusu)
setStateSavePeriod(); // wartość domyślna 180000 czyli 3 min
Widzimy się na Supla Offline Party Season 2 :D

Image

Return to “Arduino IDE”