Sieć nRF24 i przesyłanie struktur

/*
Nadajnik
*/

/*
Nadajnik
*/
#include <RF24.h>
#include <RF24Network.h>


RF24 radio(7, 8);               // nRF24L01 (CE,CSN)
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 00;   // Address of this node in Octal format ( 04,031, etc)
const uint16_t node01 = 01; // (Address where the data is going)

struct package
  {
    float temp = 11.11;
    float hum = 22.22;
    uint16_t light = 33;
    uint16_t batt = 44; 
  };
typedef struct package Package;
Package data;

void setup() {

  Serial.begin(9600);

//  SPI.begin();
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  network.begin(32, this_node);  //(channel, node address)
}

void loop() {

  network.update();

  RF24NetworkHeader header(node01);     // (Address where the data is going)
  bool ok = network.write(header, &data, sizeof(data)); // Send the data
  Serial.println("sending array...");
  delay(1000);
}
/*
 * Odbiornik
 * 
 */

#include <RF24.h>
#include <RF24Network.h>

RF24 radio(7, 8); 
RF24Network network(radio);      // Include the radio in the network
const uint16_t this_node = 01;   // Address of this node in Octal format ( 04,031, etc)
//const uint16_t node00 = 00;      // (Address where the data is going)

struct package
  {
    float temp = 11.11;
    float hum = 22.22;
    uint16_t light = 33;
    uint16_t batt = 44; 
  };
typedef struct package Package;
Package incomingData;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  network.begin(32, this_node); //(channel, node address)
}

void loop() {
  
  network.update();
  while ( network.available() ) {     // Is there any incoming data?
    RF24NetworkHeader header;

    network.read(header, &incomingData, sizeof(incomingData)); // Read the incoming data
    
      Serial.println("Struktura, 4 elementy:");
      Serial.println(incomingData.temp);
      Serial.println(incomingData.hum);
      Serial.println(incomingData.light);
      Serial.println(incomingData.batt);
      Serial.println("Koniec");

  }

}

Pożyteczna funkcja, która wysyła dane, w tym przypadku strukturę package składającą się z dwóch elementów: koloru i jasności diody RGB, do węzła nodeNumber.

deklaracja struktury

struct package // paczka danych wychodzących: kolor i jasność
{
  uint32_t c = 0xFF3333;
  uint16_t b = 100;
};
typedef struct package Package;
Package sendData;
...

funkcja

RF24SendData(to_node, sendData);

deklaracja funkcji

// funkcja wysyła strukturę do konkretnego węzła nRF24
void RF24SendData(uint16_t nodeNumber, package dataValue)
{
  RF24NetworkHeader header(nodeNumber);     // (adres węzła do którego wysyłamy dane)
  bool ok = network.write(header, &dataValue, sizeof(dataValue)); // wysyłanie danych
  if (ok) {
    Serial.println("Poszło!");
    Serial.println(dataValue.c, HEX);
    Serial.println(dataValue.b);
  }
}

Struktura, przykład dodawania zmiennych typu string, funkcja strcpy

Jeśli w strukturze mamy tablicę typu char dodanie lub zamianę elementu można wykonać używając funkcji strcpy

// Arduino Uno

struct buttons
{
  int color[3];
  int positions[4];
  char stringi[20];
  void (*fn)();
};

// Declare the functions here, or use prototyping
void func1();
void func2();

buttons test[] =
{
  { {0, 0, 0},    {0, 0, 100, 100}, "Oryginalny tekst",  func1 },
  { {40, 40, 40}, {50, 50, 10, 10}, "Drugi tekst", func2 },
};

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println(__FILE__);
  Serial.println(__DATE__);
  printf("\n\tNazwa pliku: %s\n\tData kompilacji: %s\n", __FILE__, __DATE__);
  Serial.println("Calling the functions:");
  Serial.println( test[0].stringi);
  test[0].fn();
  test[1].fn();
}

void loop()
{
}

void func1()
{

  Serial.println("Wykonywana func1");
  strcpy(test[0].stringi, "Skopiowany tekst");

}

void func2()
{
  Serial.println("Wykonywana func2");
  Serial.println( test[0].stringi);
}
LINKI

Dodaj komentarz