KLOP - Ogólny kanał licznikowy - Działający przykład

iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

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 ;-)
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

@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?
.
KLOP0.png
You do not have the required permissions to view the files attached to this post.
User avatar
klew
Posts: 9221
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

iM@rek wrote: Mon Apr 15, 2024 6:39 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?
.
KLOP0.png
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
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

Dzięki za radę.
Tego się niestety obawiałem...
Dobra, popróbuję.
Swoją drogą - ciekawe, czy ktoś w ogóle tego (KLOPa) używa...
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

@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.

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
    }
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.

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);
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...
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

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:

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
I to samo, ale z IC:

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
Ale później, w momencie zmiany wartości licznika:
KLOP bez IC: (nie ma zapisów xWrote, tylko zmiana wartości kanału)

Code: Select all

Channel(4) value changed to 45.00
a KLOP z IC: (zmiana wartości i zapis do FRAM xWrote)

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
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?
krycha88
Posts: 5374
Joined: Fri Nov 16, 2018 7:25 am

Post

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/
User avatar
klew
Posts: 9221
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

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
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

krycha88 wrote: Thu Apr 18, 2024 7:27 pm 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.
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ę.
iM@rek
Posts: 343
Joined: Thu Feb 09, 2023 1:25 pm

Post

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 )
Najwyraźniej źle zrozumiałem - pisałeś o resecie czasu, ale nie dotarło do mnie, że KLOP nie przechowuje/ zapisuje zliczanych wartości.
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?

Return to “Ogólna dyskusja”