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);
  }
}

Dodaj komentarz