Wpis z mikrobloga

Mirki od #arduino #cpp #c etc. Poczebuję zrobić funkcję, która będzie wywoływana w różnych miejscach kodu i ma za zadanie zaraportować stan danego czujnika. Czasami będzie to sama temperatura, czasami temperatura i wilgotność, czasami temp/wilg/czujka + inne czujniki. Generalnie ilość danych różna. W jaki sposób rozwiązać kwestię deklaracji void'a? Stałe okazuje się być tylko void jakasfunckja (int nr czujki, nr_hardware... {reszta to już czasem: int, czasem float, czasem char char char etc.) Any gut ajdias?
  • 18
@pneumokok: do tego w ramach funckji, przed wysyłką, musi powstać jedna długa zmienna char* z tymi wszystkimi wartościami osadzonymi w formacie JSON... a na arduino nawet sprintf z float'em nie działa.
@pneumokok: Nie do końca rozumiem pytanie. Jeśli funkcja ma zareportować stan czujnika to dlaczego chcesz jej podawać wartości, które ma zareportować?

Ja bym to zrobił mniej więcej tak:

void raport(id_czujnika, buf, buf_size){
// tu wołasz odpowiednie funkcje raportujące czujników
}
Dlaczego chcesz output w json? Piszesz na pewno w cpp? Nie miałem bezpośredniej styczności z arduino, ale większość biblioteki standardowej powinna być dostępna.
@KrzaQ2: generalnie kod wygląda tak, że na mikrokontrolerze jest pętla loop(), która odpytuje rx/tx od modułu 2.4GHz i:

- jeżeli dostaje paczkę z node'a np .o nr 3, to:

- odczytaj 'temperatura' z payloadu (float)

- odczytaj 'wilgotnosc' (float)

- odczytaj 'czujkaruchu' (int 1/0)

- odczytaj 'swiatlomierz' (long)

wyslij(3, 123, temperatura, wilgotnosc, czujkaruchu, swiatlomierz...)

Z czego to tylko przykład dla czujki nr 3, a 4ka moze miec np. zuzycie watt (int)
@KrzaQ2: teraz nie mogę, niemniej jednak piszę na windowsowym, a wrzuca raspberry'owe, ale to nie ma znaczenia jak kod do kitu jest. ;-)

generalnie biblioteki są nieco okrojone (brak %f w sprintf, które rozwiązałoby problem) etc.

może wielokrotna inicjacja funkcji? coś w stylu

void funkcja (param 1, 2, 3, 4, 5)

void funkcja (param 1, 2, 3, 4)

void funkcja (param 1, 2, 3)

...
@KrzaQ2: nie mogę, bo przesyłam je już do brokera MQTT i tam czeka podpięty odbiorca czekający na JSONa ;-)

pokombinuję dtostrf i będę wszystko jako parametry char* podawał. Arduino MEGA ma jakiś-tam zapas pamięci, może wystarczy.
@pneumokok: Niech każdy czujnik zwraca dane w określonym rozmiarze: int id, int size, uchar data, data ... i niech ma je zawsze po pomiarze, by dane były aktualne. Wywołasz swoją funkcję, która zadecyduje, które dane przetrawić.

@Analityk: funkcja ma być wywoływana przez czujnik, czyli:

1. czujnik1 -> centralka, komunikat: e, centralka, pakiet dla CIebie. temperatura: 25.5, wilgotność 85.35, luxów 250 a czujka ruchu 0.

2. centralka -> internet (wywołuje funkcję sendData), raport: t: 25.5, hum: 85.35, ldr 250, pir 0

3. czujnik 2 - centralka, komunikat: e, centralka, pakiet dla Ciebie: 180;1134.3123

4. centralka -> internet, (wywołuje funkcję sendData) raport: watt: 180, licznik: 1134.3123
@pneumokok: Ja to bym zrobił uniwersalny format danych, nawet niech ich będzie więcej, zaoszczędzisz pewnie SRAM na uC i czas na przetwarzanie. A dla serwera to będzie pestka wydobyć konkretne wartości.