Witam,
chcę wykorzystać możliwości KLOP.
Poszukuję działającego przykładu, bo jestem za słaby, żeby to w rozsądnym czasie ogarnąć.
Generalnie chcę liczyć impulsy, czy to przepływającej wody, czy kręcącego się anemometru, czy padającego deszczu itp.
Robię to na standardowym liczniku impulsów, ale ma to swoje ograniczenia, które mają szanse zniknąć w KLOPie.
Może któryś z kolegów już to uruchomił i zechce się podzielić wiedzą?
No bo z początkiem roku był post z fajnym zdjęciem viewtopic.php?t=14671, ale potem rozwinięty został tylko KPOP, a o KLOPie zapomniano
KLOP - Ogólny kanał licznikowy - Działający przykład
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
@Klew:
Ok, udało mi się podłączyć KLOP do GG Krychy.
Mam w Supla.org piękny, nowy Kanał Licznikowy Ogólnego Przeznaczenia
Ale jak mam mu teraz powiedzieć, że ma korzystać z impulsów podawanych na jakieś GPIO?
Czyli - jak podpiąć źródło impulsów?
.
Ok, udało mi się podłączyć KLOP do GG Krychy.
Mam w Supla.org piękny, nowy Kanał Licznikowy Ogólnego Przeznaczenia
Ale jak mam mu teraz powiedzieć, że ma korzystać z impulsów podawanych na jakieś GPIO?
Czyli - jak podpiąć źródło impulsów?
.
You do not have the required permissions to view the files attached to this post.
-
- Posts: 9214
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Nie da się mu nic powiedzieć
Tam są gotowe interfejsy do zwiększenia licznika o 1 lub do ustawienia konkretnej wartości.
Natomiast musiałbyś napisać kod który czyta stan gpio i liczy impulsy. Zobacz sobie na implementację impulse_counter.cpp - tam w zasadzie wszystko jest
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
Dzięki za radę.
Tego się niestety obawiałem...
Dobra, popróbuję.
Swoją drogą - ciekawe, czy ktoś w ogóle tego (KLOPa) używa...
Tego się niestety obawiałem...
Dobra, popróbuję.
Swoją drogą - ciekawe, czy ktoś w ogóle tego (KLOPa) używa...
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
@Klew
Napisałem taką pętlę, która co 5 sekund zwiększa stan licznika.
Działa, ale po każdym resecie, czy też nawet podłączeniu/rozłączeniu monitora łącza szeregowego, licznik się zeruje.
Dopisałem ten kawałek dla licznika do działającego skryptu dołożonego do GG Krychy88. Tam miałem min. 4 kanały KPOP, wszystko działało. Posługując się analogią do przykładu KPOP, dołożyłem kilka poniższych linii do skryptu.
Zapis jest ustawiony do FRAM, o ile to ma znaczenie. W monitorze widać, że znajduje FRAM, czyta (xRead), ale nie widzę zapisów (xWrite).
Wieczorem sprawdzę, co jest w pamięci FRAM, ale przy KPOPach było ok, więc chyba nie tu problem.
Czy brakuje jakiegoś zapisu do FRAM, a potem odczytu zapisanego we FRAM stanu po reboocie?
W skrypcie zablokowałem (testowo-chwilowo) cały kawałek związany z kanałami KPOP, żeby mi nie przeszkadzał.
Nie korzystam z Suplowych bibliotek, pewnie czegoś brakuje...
Napisałem taką pętlę, która co 5 sekund zwiększa stan licznika.
Działa, ale po każdym resecie, czy też nawet podłączeniu/rozłączeniu monitora łącza szeregowego, licznik się zeruje.
Code: Select all
Supla::GUI::begin();
}
void loop() {
const uint32_t now = millis();
static uint32_t lastTime = 0; //MZ static is oposit to "local"(reset out off function)
static uint32_t IC0Read = 0; // initial time for GPIO read time stamp
SuplaDevice.iterate();
if (millis() - lastTime > 1000) {
lastTime = millis();
}
P2Count = P2Count + 1; // licznik sekund do odczytu
if (P2Count >= 5) { // po zadanym czasie (5 sekund)
P2Count = 0; // zerowanie licznika czasu odczytu
// newIC0State = digitalRead(IC0Pin); //odczyt stanu GPIO
if (newIC0State == 1) { // alternative to GPIO read
newIC0State = 0; // everytime change
}
else {
newIC0State = 1;
}
if (newIC0State != oldIC0State) { // @State change
oldIC0State = newIC0State; // Save new state 4 late
if (newIC0State == 0) { // Change H->L detection only
IC0Value = IC0Value +1; // increment KLOP on every loop pass on H->L
klo0->setValue(IC0Value); // set new KLOP value
}
Code: Select all
#include <supla/sensor/general_purpose_meter.h>
...
Supla::Sensor::GeneralPurposeMeter *klo0 = nullptr;
...
klo0 = new Supla::Sensor::GeneralPurposeMeter();
klo0->setDefaultValueDivider(0);
klo0->setDefaultValueMultiplier(0);
klo0->setDefaultValueAdded(0);
klo0->setDefaultUnitBeforeValue("W sumie:");
klo0->setDefaultUnitAfterValue("imp.");
klo0->setDefaultValuePrecision(0);
klo0->setValue(20);
Wieczorem sprawdzę, co jest w pamięci FRAM, ale przy KPOPach było ok, więc chyba nie tu problem.
Czy brakuje jakiegoś zapisu do FRAM, a potem odczytu zapisanego we FRAM stanu po reboocie?
W skrypcie zablokowałem (testowo-chwilowo) cały kawałek związany z kanałami KPOP, żeby mi nie przeszkadzał.
Nie korzystam z Suplowych bibliotek, pewnie czegoś brakuje...
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
Trochę posprawdzałem i wydaje mi się, że kanał licznikowy KLOP nie korzysta w ogóle z FRAM.
Na tym samym szkicu GG (z KLOPem) dołożyłem zwykły "Impulse Counter" [skrót: IC] i pojawiły się odczyty i zapisy do FRAM.
Po wyłączeniu z kompilacji modułu IC, pamięć jest wykrywana, inicjowana, odczytywana,... ale na tym się kończy jej wykorzystanie.
.
Tak wygląda początek obsługi FRAM w wersji bez IC:
I to samo, ale z IC:
Ale później, w momencie zmiany wartości licznika:
KLOP bez IC: (nie ma zapisów xWrote, tylko zmiana wartości kanału)
a KLOP z IC: (zmiana wartości i zapis do FRAM xWrote)
Tyle, że do FRAM zapisuje się zmieniony stan IC, a nie KLOPa
Co zrobić, żeby KLOP zapisywał do FRAM i odczytywał z FRAM po restarcie?
Na tym samym szkicu GG (z KLOPem) dołożyłem zwykły "Impulse Counter" [skrót: IC] i pojawiły się odczyty i zapisy do FRAM.
Po wyłączeniu z kompilacji modułu IC, pamięć jest wykrywana, inicjowana, odczytywana,... ale na tym się kończy jej wykorzystanie.
.
Tak wygląda początek obsługi FRAM w wersji bez IC:
Code: Select all
Supla - starting initialization
I2C FRAM is connected at address: 0x50
Storage initialization
xReadStorage: 8; Read: [53 55 50 4C 41 1 0 1 ]
Storage: Number of sections 1
Reading section: 0
xReadStorage: 7; Read: [3 0 0 FF FF FF FF ]
Section type: 3; size: 0
storedCRC 65535, CRC calc 65535
...
Validating storage state section with current device configuration
Storage state section validation successful
Code: Select all
Creating Impulse Counter: impulsePin(14), delay(10 ms)
Supla - starting initialization
I2C FRAM is connected at address: 0x50
Storage initialization
xReadStorage: 8; Read: [53 55 50 4C 41 1 0 1 ]
Storage: Number of sections 1
Reading section: 0
xReadStorage: 7; Read: [3 8 0 41 F8 41 F8 ]
Section type: 3; size: 8
storedCRC 63553, CRC calc 63553
...
Validating storage state section with current device configuration
Storage state section validation successful
KLOP bez IC: (nie ma zapisów xWrote, tylko zmiana wartości kanału)
Code: Select all
Channel(4) value changed to 45.00
Code: Select all
Channel(6) value changed to 5 => to wartość IC
xWrote 8 bytes to storage at 63
xWrote 7 bytes to storage at 56
Channel(4) value changed to 161.00 => to wartość KLOP
Co zrobić, żeby KLOP zapisywał do FRAM i odczytywał z FRAM po restarcie?
-
- Posts: 5374
- Joined: Fri Nov 16, 2018 7:25 am
A gdzie przewracasz stan IC0Value przy starcie urządzenia? Bo jeżeli tego nie robisz to zwróć uwagę, że nadpisujesz zawsze zapisany stan przy starcie urządzenia.
https://gui-generic-builder.supla.io/
-
- Posts: 9214
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
KLOP nie ma implementacji zapamiętywania stanu i jego przywracania (pisałem Tobie o tym tutaj: viewtopic.php?p=178350#p178350 )
Widzimy się na Supla Offline Party - 19.10.2024
https://forum.supla.org/viewtopic.php?t=15820
https://forum.supla.org/viewtopic.php?t=15820
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
Nie przywracam stanu.
Nie wiem, skąd miałbym przywracać tę wartość, nie wiem, gdzie i jak jest zapisywana.
W monitorze tego nie widzę.
Przy IC są xWrote i pewnie przy restarcie są odczyty.
Przy KLOP tego nie widzę.
-
- Posts: 343
- Joined: Thu Feb 09, 2023 1:25 pm
Najwyraźniej źle zrozumiałem - pisałeś o resecie czasu, ale nie dotarło do mnie, że KLOP nie przechowuje/ zapisuje zliczanych wartości.klew wrote: ↑Thu Apr 18, 2024 7:55 pm KLOP nie ma implementacji zapamiętywania stanu i jego przywracania (pisałem Tobie o tym tutaj: viewtopic.php?p=178350#p178350 )
Czyli wychodzi na to, że jeśli nastąpi jakakolwiek przerwa w zasilaniu, to KLOP traci zliczoną wartość i zaczyna liczyć od nowa?
Czy dalej tego nie rozumiem...
Jak zapisuje się wartości, jak się je przywraca przy restarcie?
Czytałem o metodach onLoad/ onSave itd, które znalazłem w Element.h.
Poszedłem po takiej ścieżce:
1. Przykład ImpulseCounter.ino ->
2. #include <supla/sensor/impulse_counter.h> ->
3. #include <supla/channel_element.h> ->
4. #include "element.h" ->
5. metody "onLoad/ onSave" itd...
Chyba nie pozostaje mi nic innego jak analiza działania Impuls Counter po tym kontem.
Czy mam tego (zapisywania i odczytywania danych) szukać gdzie indziej?