Úvodní omáčka - klidně odstavec přeskočte
Jak v alarmu, meteostanici, řízení domu potřebuji posílat vícero informací - na druhé straně je roztřídit. Zatím jsem to dle příkladů řešil nějakým "tříděním" v přijímací stanici/centrální jednotce. Problém to nikdy nebyl, až do stavby meteostanic. Už jich funguje 8, a na přenos dat od čidel každý chtěl něco jiného (RFM69xx, HC12 a podobné, nRF24, cokoliv co funguje jako séroivá linka). Na meteostanici držím jeden kod a druhy přenosu mám ve funkcích, tudíž to na přijímací straně pěkně kyne.
Pak jsem objevil náhodou metodu pomocí STRUCT ...
Co to řeší:
- posílání více hodnot/informací po komunikaci najednou, v jednom balíku.
- automatické jednoduché "roztřídění" na jednotlivé informace na straně příjmu.
Na vysílací i přijímací straně MUSÍ být stejně vytvořená struktura dat. Třeba takto:
Kód: Vybrat vše
// kod neřeší knihovny, proměnné - jen nastińuje princip
// struktura pro odesilani z ext.cidla musi byt identicka
// jako struktura pro prijem z tohoto cidla
// jednotlivé proměnné jsou ještě jednou nadefinovány mimo strukturu pro vyčítání z čidel
// - z historických důvodů, budu to rušit a data ukládat do packet.xxxx hned po vyčtení
typedef struct { // struktura paketu pro odeslání
uint32_t sensorId; // ID senzoru
float T; // teplota
int H; // vlhkost
int P; // tlak
int W; // rychlost větru
int G; // maximalni rychlost vetru za tento den
int B; // smer vetru
int R; // srazky - kumulativne za cely den
int RR; // srazky -prumer za hodinu
int S; // svit slunce - W/m2
int UV; // UV index
int SS; // svit slunce za den - minut
int CC; // oblacnost
} dataPacket;
Kód: Vybrat vše
//---------------------------------------------------------------------------------
// Odeslani dat na zakladnu - nRF24
//---------------------------------------------------------------------------------
void OdeslatData(){
dataPacket packet;
packet.sensorId = sensorId; // načtení čerstvých dat co vyčetly senzory - každý senzor je samostatná funkce
packet.T = T; // jen nastiňuji potřebu vložit data, klidně hne dpo vyčtení z čidla, zde z proměnné
packet.P = P;
packet.W = W;
packet.G = G;
packet.B = B;
packet.R = R;
packet.RR = RR;
packet.S = S;
packet.UV = UV;
packet.SS = SS;
packet.CC = CC;
radio.write(&packet, sizeof(dataPacket)); //odeslani
delay(10*sizeof(dataPacket)); //zatim netusim kolik minimalne postacuje
}
Kód: Vybrat vše
if (radio.available()) {
radio.read(&packet, sizeof(dataPacket));
delay(10*sizeof(dataPacket)); // asi není potřeba
Serial.print("Prijato ID= ");
Serial.println(packet.sensorId);
Serial.print("Teplota T= ");
Serial.println(packet.T);
Serial.print("Tlaka P= ");
Serial.println(packet.P);
Serial.print("Vlhkost H= ");
Serial.println(packet.H);
// a tak dale
jediné co netuším je max. delka "paketu" a spolehlivost při větším objemu dat.