SCD41 na SuplaDevice przez KPOP - jak wyciągac dane

User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Dobra, ja jestem ślepy.
Chat wyłapał :)

Poniżej porada :D

Przyczyna crasha nie jest w LCD, tylko w wskaźniku `scd4x`.

Masz globalnie:

Code: Select all

Supla::Sensor::SCD4x *scd4x = nullptr;
A w `setup()` robisz:

Code: Select all

auto scd4x = new Supla::Sensor::SCD4x();
To tworzy lokalną zmienną `scd4x`, która zasłania globalną. Globalna dalej zostaje `nullptr`, więc po ~5 s w `loop()` dereferencjonujesz `nullptr`:

Code: Select all

lcd.print(scd4x->getChannel()->getValueDouble(), DEC);
Efekt: reset/crash.

Poprawka

1. W `setup()` przypisz do globalnej (bez `auto`):

Code: Select all

   scd4x = new Supla::Sensor::SCD4x();
   
2. Drugi parametr `lcd.print(x, ...)` dla float/double to liczba miejsc po przecinku, a nie `DEC`. Użyj np. `2`.

Minimalnie poprawione fragmenty

Code: Select all

void setup() {
...
scd4x = new Supla::Sensor::SCD4x();   // <-- WAŻNE: bez auto
...
}

void loop() {
SuplaDevice.iterate();

if (millis() - lastRead > 5000) {
lastRead = millis();

```
if (scd4x && scd4x->getChannel()) {
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print(scd4x->getChannel()->getValueDouble(), 2);
}
```

}
}
Jeśli po tym dalej będą resety, wtedy dopiero warto sprawdzać I2C/LCD (adres 0x27/0x3F, pull-upy, przewody), ale w tym kodzie konkretny crash wynika z cienia (shadowing) `scd4x` w `setup()`.
Najlepsze suple dla Twojego domu :mrgreen:
Marian1544
Posts: 64
Joined: Sat Aug 28, 2021 4:45 pm

Post

Działa, dzięki :D
Tak chodziło o auto przy wskaźniku.

Co prawda lcd.print(scd4x->getChannel()->getValueDouble(), 2); daje wynik zero.
Ale z scd4x->getCO2() jest już ok.

Tylko dalej nie rozumiem czemu dla czujnika DHT getChannel()->getValueDouble() działało, mimo że w bibliotece są metody getTemp{}.

Rozumiem że to getTemp{} czyta bezpośrednio z czujnika, a getChannel()->getValueDouble() z jakiegoś tymczasowego rejestru Supli.
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

Najlepiej pobierać tak:

Code: Select all

scd4x->getCO2channel()->getCalculatedValue();
Przynajmniej tak mi tłumaczył swego czasu @klew :-)

Z kolei:

Code: Select all

scd4x->getChannel()->getValueDouble()
pobiera wartość z kanału TemperaturoCiśnienia, więc na pewno nie to co chcesz. Nie mówiąc o tym, że tam powinieneś pobierać raczej oddzielnie temperaturę i ciśnienie (nie wiem dokładnie co tu jest w tym momencie zwracane, trzeba by przeanalizować therm_hygro_meter.h/cpp).

DHT jest prościutkim czujnikiem, który podaje tylko jedną wartość, dlatego wszystkie funkcje zawsze podają to samo.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
Marian1544
Posts: 64
Joined: Sat Aug 28, 2021 4:45 pm

Post

Code: Select all

scd4x->getCO2channel()->getCalculatedValue()
@malarz
O na to bym nie wpadł, dzięki :)

Wykminiłem pozostałe, więc jest już komplet.
scd4x->getChannel()->getValueDoubleFirst() - temperatura
scd4x->getChannel()->getValueDoubleSecond() - wilgotność
scd4x->getCO2channel()->getCalculatedValue() - CO2

Użycie zapytań typu scd4x->getTemp() generuje chyba jakieś kolizje:

Code: Select all

Channel(1) value changed to 1278.00
Send: [53 55 50 4C 41 17 16 00 00 00 67 00 00 00 0E 00 00 00 01 00 00 00 00 00 00 00 00 00 00 F8 93 40 ]
Send: [53 55 50 4C 41 ]
SCD4x read error
Channel(0) value changed to temp(23.79), humi(35.69)
Send: [53 55 50 4C 41 17 17 00 00 00 67 00 00 00 0E 00 00 00 00 00 00 00 00 00 EA 5C 00 00 6A 8B 00 00 ]
Send: [53 55 50 4C 41 ]
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Ogólnie polecam czytanie plików źródłowych - szczególnie .h - tam widać jakie są dostępne metody. Czasem nawet jakiś opis funkcji się znajdzie.
Jest też dokumentacja generowana z doxygena - tam można kliknąć na klasę i przeglądać (link jest w readme na GitHub supla-device
Najlepsze suple dla Twojego domu :mrgreen:
Marian1544
Posts: 64
Joined: Sat Aug 28, 2021 4:45 pm

Post

@klew
Przeglądałem pliki nagłówkowe, ale na razie idzie dość opornie.
Nawet teraz nie wiem gdzie znaleźć ten getCO2channel()->getCalculatedValue()


Jeszcze odnośnie SCD41, czy ta biblioteka umożliwia ustawienie wysokości pomiaru?
User avatar
vajera
Posts: 7290
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

Marian1544 wrote: Fri Jan 23, 2026 6:32 pm @klew
Przeglądałem pliki nagłówkowe, ale na razie idzie dość opornie.
Nawet teraz nie wiem gdzie znaleźć ten getCO2channel()->getCalculatedValue()

Code: Select all

genral_purpose_channel_base.h
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
Marian1544
Posts: 64
Joined: Sat Aug 28, 2021 4:45 pm

Post

Racja, dzięki.

Widzę że FreeCommanderem daje się szukać w plikach.
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

Marian1544 wrote: Fri Jan 23, 2026 6:32 pm @klew
Przeglądałem pliki nagłówkowe, ale na razie idzie dość opornie.
Nawet teraz nie wiem gdzie znaleźć ten getCO2channel()->getCalculatedValue()


Jeszcze odnośnie SCD41, czy ta biblioteka umożliwia ustawienie wysokości pomiaru?
getCO2channel() tam jest :-)

getCalculatedValue() jestw GPMbase, i jest to funkcja zwracająca prawie to samo co getCO2(), ale po przeliczeniach ustawianych w cloudzie (a więc nie rzeczywisty odczyt, ale to co widać w apce)
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

Marian1544 wrote: Fri Jan 23, 2026 5:12 pm Użycie zapytań typu scd4x->getTemp() generuje chyba jakieś kolizje:
To jest bardzo prosta funkcja, zwraca wartość zmiennej, w której jest przechowywany ostatni rzeczywisty pomiar.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.

Return to “supla-dev”