czwartek, 26 maja 2016

Prezentacja i przesyłanie danych w nadajnikach MySensors

Dzisiaj opiszę jak odbywa się przesyłanie danych z nadajników MySensors do bramki MySensors i do Domoticz.

Najnowsza biblioteka MySensors wersja 1.5 -> Link używa dwóch głównych klas:
MySensor i MyMessage

Inicjalizacja danych - MyMessage

MyMessage tworzy kontener do przechowywania danych, aby można było je wysłać do bramki MySensors, wpisujemy je zawsze na początku programu.

Polecenie MyMessage wygląda tak: MyMessage msg(child-sensor-id, rodzaj-zmiennej);

W nawiasie child-sensor-id identyfikuje podłączony czujnik, definiujemy go na początku programu poleceniem:

#define nazwa kolejny numer czujnika

Czyli, gdy mamy np. kilka czujników np. temperatury i wilgotności, to na początku programu definiujemy:

#define child_id_temp 1
#define child_id_wilg 2

Na stronie MySensors napisali -> Link, że gdy mamy tylko jeden czujnik, to przy definicji ilości czujników wpisujemy 0, czyli np. #define child-id 0.

Druga wartość podana w nawiasie określa rodzaj zmiennych, jakie będą przesyłane do bramki MySensors, mamy je określone na stronie -> Link w czwartej kolumnie

Przykładowo dla czujnika temperatury i wilgotności, będzie to wyglądać tak:

MyMessage msgtemp(child_id_temp, V_TEMP);
MyMessage msgwilg(child_id_wilg, V_HUM);

Po MyMessage nadajemy sobie dowolną nazwę, czyli jak wyżej, dla temperatury: msgtemp, a dla wilgotności: msgwilg

Te dane wpisujemy zawsze na początku programu, przed void setup()

UWAGA!!!
Przed wpisem MyMessage należy umieścić wpis:

MySensor gw;

Prezentacja - gw.present

Czujniki podłączane do nadajnika MySensors muszą najpierw przedstawić (zaprezentować) dane do kontrolera, odbywa się, to poleceniem:

gw.present(child-sensor-id, typ-czujnika);

Typy czujników są określone na stronie -> Link w pierwszej kolumnie, czyli dla powyższego przykładu, dla czujnika temperatury i wilgotności, polecenie będzie wyglądać tak:

gw.present(child_id_temp, S_TEMP);
gw.present(child_id_wilg, S_HUM);

Prezentację wpisujemy w void setup() czyli instrukcjach, które wykonywane są tylko raz na początku programu.

Dane jakie należy wpisać dla różnych rodzajów czujników podane są w poniższej tabeli


Inicjowanie gw.begin ()

Polecenie:

gw.begin();

uruchamia bibliotekę MySensors, odbiera dane z kontrolera i zapisuje w statycznej pamięci eproom Arduino, dane te są kasowane, po restarcie Arduino.

Polecenie gw.begin; umieszczamy przed prezentacją gw.preset w void setup().

Import bibliotek MySensors
Aby nasz program działał poprawnie na samym początku kodu programu należy umieścić wpis importujący biblioteki MySensors, czyli:



Przesyłanie danych - gw.send(msg.set(dane));

Polecenie to przesyła dane do bramki MySensors i dalej do Domoticz, umieszczamy je w pętli void loop()

W tym przykładzie będzie, to wyglądać tak:
gw.send(msgtemp.set(temp, 1));
gw.send(msgwilg.set(wilg, 1));


Kod programu dla nadajnika MySensors, w którym wykorzystałem typowy program do odczytu z czujnika DHT11 będzie wyglądał tak:


Kod do pobrania stąd -> Link

Myślę, że teraz każdy będzie mógł sobie napisać sam program, do odczytu dowolnych czujników z nadajnika MySensors

10 komentarzy:

  1. Mam pytanko - piszesz tu o podłączeniu do Ardino, a czy na Rpi też będzie to działać? Swoją przygodę z maliną dopiero zaczynam i nie wiem zbyt wiele :)

    OdpowiedzUsuń
  2. To jest do czujników MySensors, czyli połączeniu Arduino z NRF24L01. Czujnik MySEnsors łączy się bezprzewodowo z bramką MySensors podłączoną do Rasberry Pi.

    OdpowiedzUsuń
  3. Nie moge się dopatrzeć jak to jest z bezpieczeństwem przesyłanych danych? czy jest to jakoś szyfrowane czy sąsiad też bedzie mógł mi zgasić światło w pokoju? Jeszcze jedno pytanie, jeżeli wyśle polecenie do włącznika, to dostaję jakieś potwierdzenie, że faktycznie zmienił stan czy tylko polecenie leci ślepo w eter?

    OdpowiedzUsuń
    Odpowiedzi
    1. Jeżeli łączysz się lokalnie po sieci lan lub wifi, to Ci sąsiad nie wejdzie na Domoticz, bo nie ma dostępu do sieci lokalnej i wifi. Łącząc się zdalnie należy podać login i hasło, aby wejść do Domoticz. Hasła i loginu do Domoticz nie zna więc nikt Ci nie wejdzie.

      Usuń
    2. Chodziło mi o bezpieczeństwo komunikacji na poziomie MySensors, między czujnikami a bramką. A co z potwierdzeniem odebrania polecenia?

      Usuń
    3. Można włączyć szyfrowanie połączenia, jest o tym gdzieś napisane na MySensors. Potwierdzenie odebrania nie jest potrzebne przy włącznikach, bo włączamy albo stan niski albo wysoki na pinie i jest to widoczne w Domoticz.

      Usuń
    4. Jeśli chodzi o szyfrowanie, to poszukaj pliku MyConfig.h w skopiowanej bibliotece MySensors w katalogu Arduino. W tym pliku jest coś napisane o szyfrowaniu, cytat:
      // Enable this for encryption of packets
      //#define RFM69_ENABLE_ENCRYPTION
      #define RFM69_ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!

      Usuń
    5. Świetnie, że szyfrowanie jest dostępne, bo to według mnie podstawa przy poważnym zastosowaniu komunikacji radiowej. A propo potwierdzenia odebranej wiadomości, co się stanie, gdy np. moduł włącznika zostanie odłączony od zasilania a będziemy chcieli zapalić lampę? Czy w jakikolwiek sposób dowiemy się, że coś jest nie tak, czy w domoticzu komenda zostanie wysłana i stan lampy zmieni się na włączony?

      Usuń
  4. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  5. Domoticz oczywiście posiada taką funkcjonalność, która poinformuje Cię o braku komunikacji z urządzeniami.

    OdpowiedzUsuń