Serial Communication, transmisja szeregowa, Json

Źródło: Arduino to ESP8266 Data With Serial Communication Using Arduino IDE
Transmisja Szeregowa (Serial Communication) to łatwy sposób na rozszerzenie możliwości współpracy ESP8266 z większą ilością czujników, nRF24, wyświetlaczy itp. Albo też rozszerzenie możliwości dowolnej płytki Arduino o moduł sieciowy ESP8266. Jak zwykle ACROBOTIC wykonało świetną robotę, dodatkowo posługując się formatem Json przy przesyłaniu danych.

W DynamicJsonDocument() należy podać wielkość pamięci dynamicznej, która pomieści naszą strukturę. Przydatny jest do tego kalkulator:

Pamiętać trzeba żeby wpisać właściwą formę naszej struktury Json

{
"type": "response",
"light": 200,
"temp": -50.3,
"hum": 100.0
}

ACROBIOTIC

O kilku rzeczach trzeba tu pamiętać:

  • Po pierwsze konieczne jest zainstalowanie biblioteki ArduinoJson w wersji 6+. Wersje starsze nie będą działać.
  • Po drugie nie wolno łączyć TX z RX obu płytek przed załadowaniem programów. U mnie powodowało to przedziwne informacje o errorach. Jeśli mamy podłączone inne płytki przez USB, które wysyłają informacje przez Serial, też lepiej je odłączyć przy wysyłaniu skeczy.
  • Pamiętać też należy aby połączyć komputer z siecią WiFi zanim wpiszemy numer strony na którym wyświetlają się dane. Ja zapomniałem, bo mam sieć na kablu i było trochę nerwów.

Tak łączymy platformy:
TX <-> RX
RX <-> TX

Skecze Acrobotic

LINKI

Źródło: Arduino : Connecting Arduino UNO with ESP8266
Proste połączenie Arduino z ESP8266 przez serial (łączymy D3 Arduino z RX NodeMCU8266), wykorzystujące format Json, ale bez biblioteki. Płytki połączyłem przez moduł obniżający napięcie, ale można też bez, podobno ESP8266 wytrzymuje 5V na RX.

Nadajnik

#include <SoftwareSerial.h>
SoftwareSerial sw(2, 3); // RX, TX

int id=12;

void setup() {
 Serial.begin(115200);
 Serial.println("Interfacfing arduino with nodemcu");
 sw.begin(115200);
}

void loop() {
 Serial.println("Sending data to nodemcu");
 int adc=analogRead(A0);
 Serial.print("{\"sensorid\":");
 Serial.print(id);//sensor id
 Serial.print(",");
 Serial.print("\"adcValue\":");
 Serial.print(adc);//offset
 Serial.print("}");
 Serial.println();
 
 sw.print("{\"sensorid\":");
 sw.print(id);//sensor id
 sw.print(",");
 sw.print("\"adcValue\":");
 sw.print(adc);//offset
 sw.print("}");
 sw.println();
 delay(5000);
}

Odbiornik

void setup() {
  Serial.begin(115200);
}

void publishSerialData(char *serialData) {
  Serial.println(serialData);
}

void loop() {
  //client.loop();
  if (Serial.available() > 0) {
    char bfr[101];
    memset(bfr, 0, 101);
    Serial.readBytesUntil( '\n', bfr, 100);
    //Serial.println(bfr);
    publishSerialData(bfr);
  }
}

Sposób połączenia przez konwerter napięć

Połączenie w obie strony z Json

Łącząc kody HOW TO SERIAL COMMUNICATION BETWEEN NODE MCU AND ARDUINO z ACROBOTIC napisałem taki program, który używa połączenia szeregowego korzystając z biblioteki ArduinoJson v 6.0 :

Arduino part:

/*
  bismillah hir rahman nir raheem
  UNO/Nano = Pin 7 & Pin 8
  Note: Uno and ESP8266 cross connection
  https://github.com/acrobotic/Ai_Tips_ESP8266/tree/master/esp8266_arduino_comm
*/

#include <SoftwareSerial.h>
#include <millisDelay.h>
#include <ArduinoJson.h>

#define rx 7
#define tx 8

SoftwareSerial ArduinoUno(rx, tx); // RX, TX
millisDelay sendIt;

String f, g;
int i, j;

void setup() {
  Serial.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);
  ArduinoUno.begin(9600);

  sendIt.start(5000);
}

void loop() {
  delay(100);
  //=============== RX ==============

  String content = "";
  boolean messageReady = false;
  while (messageReady == false) { // blocking but that's ok
    while (ArduinoUno.available()) {
      content = ArduinoUno.readString();
    }
    messageReady = true;
  }
  if (content != "") {
    Serial.println();
    Serial.println(content);

    DynamicJsonDocument doc(1024);
    DeserializationError error = deserializeJson(doc, content);
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.c_str());
      messageReady = false;
      return;
    }
    serializeJsonPretty(doc, Serial);
    Serial.println();

  }

  //=============== TX ==============

  if (sendIt.isFinished()) {
    sendIt.repeat();

    DynamicJsonDocument doc(1024);
    doc["temp"] = 99.99;
    doc["hum"] = 88.88;
    doc["light"] = 198;
    doc["batt"] = 3.33;
    serializeJson(doc, ArduinoUno);

    Serial.println("Wysłano dane do NodeMCU");
    Serial.println();
  }
}

ESP8266 part:

/*
  bismillah hir rahman nir raheem
  ESP8266 = Pin D7 & Pin D8
  Note: Uno and ESP8266 cross connection
  https://github.com/acrobotic/Ai_Tips_ESP8266/tree/master/esp8266_arduino_comm
*/

#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <millisDelay.h>
#include <ArduinoJson.h>

millisDelay sendIt;

#define rx D7
#define tx D8

SoftwareSerial NodeMCU(rx, tx); //RX, TX

String f;

void setup() {
  Serial.begin(9600);
  NodeMCU.begin(9600);
  pinMode(rx, INPUT);
  pinMode(tx, OUTPUT);

  sendIt.start(4000);
}

void loop() {
  delay(100);
  //=============== RX ==============
  String content = "";
  boolean messageReady = false;
  while (messageReady == false) { // blocking but that's ok
    while (NodeMCU.available()) {
      content = NodeMCU.readString();
    }
    messageReady = true;
  }
  if (content != "") {
    Serial.println();
    Serial.println(content);
    Serial.println();

    DynamicJsonDocument doc(1024);
    DeserializationError error = deserializeJson(doc, content);
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.c_str());
      messageReady = false;
      return;
    }
    serializeJsonPretty(doc, Serial);
    Serial.println();
  }

  //=============== TX ==============

  if (sendIt.isFinished()) {
    sendIt.repeat();
    //    long i = (700000L);
    //    f = "z" + String(i);
    //    NodeMCU.println(f);
    //delay(100);
    DynamicJsonDocument doc(1024);

    doc["z"] = 700000L;
    serializeJson(doc, NodeMCU);
    Serial.println("Wysłano dane do Arduino");
    Serial.println();

  }
}

Dodaj komentarz