Arduino JSON i nRF24L01

JSON to lekki i dość uniwersalny sposób wymiany danych komputerowych. Nie znalazłem tutorialu, który pokazałby jak przesyłać tego typu dane przez sieć opartą o moduł radiowy nRF24L01. O nRF24l01 pisałem wielokrotnie. Wykorzystując ciekawą bibliotekę bblanchon ArduinoJson i korzystając z pomocy niezawodnych kolegów z forum elektroda.pl udało mi się napisać program na arduino (TX) i nodeMCU (RX) które pokazują jak prosto można korzystać z dobrodziejstw formatu JSON. W przykładzie przesyłana jest prosta struktura danych:

temp: 35.33
hum: 77.77
light: 198 
batt: 3.33 

TX JSON – arduino

/*
  TX Json, arduino Nano, nRF24l01
*/
#include <ArduinoJson.h>
#include <SPI.h>
#include <Wire.h>
#include <RF24.h>
#include <RF24Network.h>

#include <Timers.h>
Timers <1> akcja;


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)

void setup() {

  Serial.begin(115200);
  SPI.begin();
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  network.begin(2, this_node);  //(channel, node address)
  akcja.attach(0, 5000, wyslij_co5sek);  // inicjalizacja procesu
}

void loop() {
  network.update();
  akcja.process();  //pooling timers
}

// ======================== FUNKCJE ===============================
void wyslij_co5sek() {

  //wlasny podprogram do wykonania co 5s biblioteka Timers.h
  DynamicJsonDocument doc(200);

  doc["temp"] = 33.33 + random(10);
  doc["hum"] = 77.77;
  doc["light"] = 198;
  doc["batt"] = 3.33;

  String output = "";

  serializeJson(doc, output); // tworzenie dokumentu Json w zmiennej output
  Serial.println(output);

  RF24NetworkHeader header(node00);     // (Address where the data is going)
  bool ok = network.write(header, output.c_str(), output.length()); // Send the data
  if (ok) {
    Serial.println("Poszło do node00");
  } else {
    Serial.println("Brak kontaktu z node00!");
  }
}

RX JSON – nodeMCU ESP8266

/*
   RX JSON, nodeMCU ESP8266

*/
#include <SPI.h>
#include <Wire.h>
#include <RF24.h>
#include <RF24Network.h>
#include <ArduinoJson.h>


RF24 radio(2, 0);               // D4, D3 nRF24L01 (CE,CSN), D1, D2 zwolnione dla I2C 
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)

char incomingData[64];

void setup() {

  Serial.begin(115200);
  SPI.begin();
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  network.begin(2, 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

    if (header.from_node == 1) {    // If data comes from Node 01
      Serial.println("Przyszło z node01");
      //Serial.println(incomingData);

      // ================== sekcja Json =================
      //StaticJsonDocument<200> doc;
      DynamicJsonDocument doc(200);
      DeserializationError error = deserializeJson(doc, incomingData);
      if (error) {
        Serial.print(F("ESP deserializeJson() failed: "));
        Serial.println(error.c_str());
        return;
      }
      serializeJsonPretty(doc, Serial);
      Serial.println();
      float hum = doc["hum"];
      Serial.print("Wilgotność = ");
      Serial.println(hum);
      Serial.println();
    }
  }
}

W formacie JSON wygląda ona tak:

“temp”: 35.33, 
“hum”: 77.77, 
“light”: 198, 
“batt”: 3.33 

Odwołanie do dowolnego elementu struktury po wywołaniu metody deserializeJson(doc, incomingData) wygląda tak:

 float temperatura = doc["temp"];
  Serial.print("Temperatura = ");
  Serial.println(temp);
  Serial.println();

LINKI

Dodaj komentarz