a rozważysz zapis z wyborem do flash'a i Fram'u ?klew wrote: Thu Mar 05, 2020 10:39 amOgólnie tak. Zostało mi jeszcze parę rzeczy do przepisania "po nowemu" i wtedy między innymi zajmę się też zapisywaniem konfiguracji i stanów.krycha88 wrote: Thu Mar 05, 2020 10:22 am Czy planujesz dodać opcję przywracania stanu przekaźnika po restarcie ESP?
Dla niektórych kanałów jest to konieczne (np. rolety, liczniki impulsów). Zapamiętanie stanu przekaźnika będzie opcjonalne.
Obsługa przycisków w SuplaDevice
-
- Posts: 2063
- Joined: Sun Feb 28, 2016 12:27 pm
- Location: Orzesze
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
Wezmę udział w Supla Offline Party 2024
Wezmę udział w Supla Offline Party 2024

-
- Posts: 19432
- Joined: Tue Jan 19, 2016 9:26 am
- Location: Paczków
Sugeruję abstrakcyjną klasę "Storage" na bazie której zostaną utworzone np. klasy StorageEEPROM i StorageFRAM. Wtedy w zależności co użyjesz to tam się zapisze.
-
- Posts: 10485
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Tak, planowałem opcję EEPROM i FRAM. Dodatkowo z dwoma wariantami zapisu danych: często i rzadko - ze względu na specyfikę tych dwóch rodzajów pamięci.
Przykładowo stan rolet może być zapisany 1-2 min po ostatnich operacjach zmieniających ich pozycję, tak aby po ewentualnej awarii zasilania mieć informację o pozycji rolet i jednocześnie nie pisać za często do pamięci. Z drugiej strony przy FRAM można pisać aktualny stan na bieżąco.
Podobnie liczniki impulsów - EEPROM trzeba oszczędzać, a FRAM-u nie.
Przykładowo stan rolet może być zapisany 1-2 min po ostatnich operacjach zmieniających ich pozycję, tak aby po ewentualnej awarii zasilania mieć informację o pozycji rolet i jednocześnie nie pisać za często do pamięci. Z drugiej strony przy FRAM można pisać aktualny stan na bieżąco.
Podobnie liczniki impulsów - EEPROM trzeba oszczędzać, a FRAM-u nie.
-
- Posts: 5456
- Joined: Fri Nov 16, 2018 7:25 am
Czy coś się zmieniło? bo nie chce mi się ten przykład skompilowaćklew wrote: Sat Feb 15, 2020 9:03 am Wczoraj dodałem pierwszy zarys obsługi przycisków. Kod na razie jest na moim githubie: https://github.com/klew/arduino
Na chwilę obecną pojawiła się tam klasa Supla::Control::Button z obsługą dwóch zdarzeń "ON_PRESS" i "ON_RELEASE".
Przycisk może na razie pracować z klasą Supla::Control::Relay i wywoływać akcje TURN_ON, TURN_OFF i TOGGLE.
To tylko zarys wsparcia przycisków i będzie to jeszcze rozbudowane.Code: Select all
#include <SuplaDevice.h> #include <supla/control/relay.h> #include <supla/network/esp_wifi.h> #include <supla/control/button.h> Supla::ESPWifi wifi("ssid", "password"); const char* srv_addr = "svr1.supla.org"; const char* srv_email = "email@email.com"; Supla::Control::Relay relay(D9); Supla::Control::Button button(D13, true); void setup() { Serial.begin(115200); uint8_t mac[6]; WiFi.macAddress(mac); char GUID[SUPLA_GUID_SIZE] = { ... }; char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {...}; button.willTrigger(relay, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE); // button.willTrigger(relay, Supla::Control::Button::ON_RELEASE, Supla::Control::Relay::TURN_OFF); SuplaDevice.begin(GUID,srv_addr,srv_email,AUTHKEY); } void loop() { SuplaDevice.iterate(); }
Logika przycisku też działa na odwrót na chwilę obecną
Do przycisku będzie można przypisać dodolne akcje i dowolną ilość triggerowanych obiektów.
Nawet termostat da się na tym zrobić ;P - ale o tym później.

Code: Select all
Primary_GUI_nexo:40:63: error: 'TOGGLE' is not a member of 'Supla::Control::Relay'
button.willTrigger(relay, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE);
^
exit status 1
'ON_PRESS' is not a member of 'Supla::Control::Button'
https://gui-generic-builder.supla.io/
-
- Posts: 10485
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Tak, zmieniło siękrycha88 wrote: Fri May 22, 2020 10:17 am Czy coś się zmieniło? bo nie chce mi się ten przykład skompilować![]()

Wyrzuć namespace'y i zostaw tylko "Supla::ON_PRESS", itd. Wyedytowałem też przykład z pierwszego posta.
-
- Posts: 5456
- Joined: Fri Nov 16, 2018 7:25 am
Działaklew wrote: Fri May 22, 2020 10:21 amTak, zmieniło siękrycha88 wrote: Fri May 22, 2020 10:17 am Czy coś się zmieniło? bo nie chce mi się ten przykład skompilować![]()
. Przeniosłem enumy od zdarzeń i akcji do osobnego pliku, aby ich nie definiować w przycisku, prezkaźniku itd.
Wyrzuć namespace'y i zostaw tylko "Supla::ON_PRESS", itd. Wyedytowałem też przykład z pierwszego posta.

Chciałbym obsługę przycisku zrobić wywołując jedną metodę coś w stylu addRelayButton(RELAY_PIN, BUTTON_PIN, TYPE_BTN_MONOSTABLE) aby docelowo napisać do tego obsługę GUI.
Przekształciłem kod tak aby wykorzystać vectory
Code: Select all
std::vector <Supla::Control::Relay> relay;
std::vector <Supla::Control::Button> button;
relay.push_back(Supla::Control::Relay(5));
button.push_back(Supla::Control::Button(0, true));
button[0].willTrigger(relay[0], Supla::ON_PRESS, Supla::TOGGLE);
Code: Select all
Decoding stack results
0x40100275: millis() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_wiring.cpp line 185
0x40100290: millis() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_wiring.cpp line 188
0x40201598: Supla::Control::Button::iterateAlways() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\src/supla/control/button.h line 45
0x40208a7b: SuplaDeviceClass::iterate() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\src\SuplaDevice.cpp line 890
0x40201644: loop() at C:\Users\kryst\Documents\Arduino\Primary_GUI_nexo/Primary_GUI_nexo.ino line 55
0x40211048: loop_wrapper() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 180

https://gui-generic-builder.supla.io/
-
- Posts: 5456
- Joined: Fri Nov 16, 2018 7:25 am
A zabrakłoklew wrote: Fri May 22, 2020 2:05 pm Wywołanie konstruktora nie alokuje pamięci na obiekt. Daj tam jakieś "new"![]()

Code: Select all
std::vector <Supla::Control::Relay *> relay;
std::vector <Supla::Control::Button *> button;
relay.push_back(new Supla::Control::Relay(5));
button.push_back(new Supla::Control::Button(0, true));

Code: Select all
button[0]->willTrigger(relay[0], Supla::ON_PRESS, Supla::TOGGLE);
https://gui-generic-builder.supla.io/
-
- Posts: 5456
- Joined: Fri Nov 16, 2018 7:25 am
klew wrote: Fri May 22, 2020 9:11 pm Metoda przyjmuje referencję na obiekt, więc trzeba wskaźnik potraktować gwiazdką *
Code: Select all
std::vector <Supla::Control::Relay *> relay;
std::vector <Supla::Control::Button *> button;
void setup() {
relay.push_back(new Supla::Control::Relay(5));
button.push_back(new Supla::Control::Button(0, true));
button[0]->willTrigger(*relay[0], Supla::ON_PRESS, Supla::TOGGLE);
}
https://gui-generic-builder.supla.io/