krycha88 wrote: Tue Feb 04, 2020 7:05 am
Przesiadam się powoli na nową bibliotekę SuplaDevice ale jak to zawsze są małe problemy. Bardzo prosto definiuje się nowe DSy DHT itd ale te czujniki to nie wszystko co może zaoferować nam alii
W starej bibliotece dodając obsługę nowego czujnik wystarczyło dodać callback odpowiednich funkcji i robić co się chce:
Code: Select all
SuplaDevice.setTemperatureCallback(&get_temperature);
SuplaDevice.setPressureCallback(&get_pressure);
SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
Jest też bardzo dużo przypadków, że za pomocą nich przekazuje się wiele innych wartości nie związanych z czujnikami
Mogę dopisać obsługę nowego czujnika i go wrzucić do SuplaDevice tylko wtedy zawsze trzeba udostępniać swoją bibliotekę do projektu a chyba nie o to chodzi.
Jak to ugryźć na nowej bibliotece?
Muszę to do readme dopisać
Wczoraj już komuś na priv pisałem jak sobie z tym poradzić.
To co trzeba zrobić, to dodać include do typu sensora, który nas interesuje (np. temperatura), potem stworzyć swoją klasę termometru, która dziedziczy po bazowej od termometru, a następnie napisać 2-3 metody. Poniżej przykład - zakładamy, że masz zmienną globalną (a fuj
) double temperatury[4] w której są trzymane 4 wartości temperatur (lub czegokolwiek innego). Na górze programu ino dodajemy:
Code: Select all
#include <supla/sensor/thermometer.h>
class MojMagicznyTermometr : public Supla::Sensor::Thermometer {
public:
MojMagicznyTermometr(int index) {
myIndex = index;
}
void onInit() {
channel.setNewValue(getValue());
}
double getValue() {
return temperatury[myIndex];
}
int myIndex;
}
I w setup tworzymy sobie tyle instancji ile chcemy:
Code: Select all
new MojMagicznyTermometr(0);
new MojMagicznyTermometr(1);
new MojMagicznyTermometr(2);
new MojMagicznyTermometr(3);
Sensory MojMagicznyTermoemtr zajmą kolejne numery kanałów (podobnie jak to było po staremu przy metodach SuplaDevice.add... )
Aktualna wersja biblioteki z metodami "po nowemu" i "po staremu" ma ograniczenie, że najpierw trzeba zdefiniować wszystkie kanały "po staremu", a potem dopiero "po nowemu". Jak coś zamieszasz, to może się crasheować i inne cuda mogą się dziać.
Jeszcze krótkie wyjaśnienie kodu:
W konstruktorze z reguły przypisujemy tylko wartośc do zmiennych, aby sensor wiedział jak został skonfigurowany (np. zapisujemy numery pinów, informację czy ma być internal pullup itd.)
Metoda onInit() jest wywoływana w SuplaDevice.setup() i tam powinno się znaleźć wszystko co konfiguruje pin, hw, a na koniec powinno wywołać "channel.setNewValue(getValue())" aby urządzenie przy rejestracji wysłało już pierwszy poprawny odczyt.
Metoda getValue() powinna zwrócić odczyt z naszego sensora - ten kod będzie wykonywany co 10 s (w przypadku termometru) - można ten interwał zmienić.
Różne typy sensorów mogą mieć różne metody do pobierania danych. Np. ThermHygroMeter używany przez klasę DHT ma dwie metody getTemp i getHumi - wystarczy zerknąć w pliki .h konkretnego sensora. Ale ogólnie dla wszystkich sensorów zwracających jedną wartość używałem getValue.
Kodu dla MojMagicznyTermometr nie kompilowałem, więc może się nie kompilować
. Jeśli komuś nie będzie to działało, to wieczorem poprawię.
Takie klasy z własnymi sensorami można trzymać w pliku ino, albo dorzucić własne pliki .h w swoim projekcie. Odradzam wrzucanie własnych plików do lokalnej kopii biblioteki, bo przy aktualizacji może się to rozjechać (np. skasujemy sobie pliki).
Jeśli ktoś pisze obsługę sensora do jakiegoś konkretnego urządzenia, to może to wrzucić do pliku .h i dodać do biblioteki, a następnie zrobić pull request do
https://github.com/SUPLA/arduino/tree/develop
Jeśli ktoś chce dodać obsługe jakiegoś sensora, to niech tylko dokładnie w komentarzach w pliku .h dopisze jaki HW jest tutaj obsługiwany i na jakim board to używał/testował. Proszę też dodawać informację jakie dodatkowe biblioteki są używane oraz skąd je pobrać.
Projekt używa też formatowania zdefiniowanego w clang-format (plik konfiguracyjny jest w repo) - także najlepiej przed stworzeniem pull request jest odpalić formatowanie na swoim kodzie.