Размер JsonData становится нулевым через некоторое время работы в ESP8266 - PullRequest
1 голос
/ 11 апреля 2020

Я строю связанный с nodemcu 1.0 (модуль ESP-12E) проект, который считывает данные и анализирует их в Json Object и передает объект в rpi через MQTT. Моя проблема в том, что после одной или двух минут работы объект Json поврежден, и jsonData.size () выводит данные с ожидаемого размера от json до 0.

Вот мой код:

#include <ArduinoJson.h>
#include "Adafruit_MQTT.h" 
#include "Adafruit_MQTT_Client.h" 
#include <Wire.h>
#include <MCP3008.h>

//define pin connections
#define CS_PIN D8
#define CLOCK_PIN D5
#define MOSI_PIN D7
#define MISO_PIN D6

// WiFi
// Make sure to update this for your own WiFi network!
const char* ssid = "NameOfNetwork";
const char* wifi_password = "walakokabalohaha";

// MQTT
// Make sure to update this for your own MQTT Broker!
const char* mqtt_server = "192.168.4.1";
const char* mqtt_topic = "test";
const char* mqtt_username = "username";
const char* mqtt_password = "Kakkakka123";
// The client id identifies the ESP8266 device. Think of it a bit like a hostname (Or just a name, like Greg).
const char* clientID = "Client ID";

MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);

// Initialise the WiFi and MQTT Client objects
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, mqtt_server, 1883, mqtt_username, mqtt_password);
Adafruit_MQTT_Publish sensorPub = Adafruit_MQTT_Publish(&mqtt, "test");
//Adafruit_MQTT_Subscribe sensorSub = Adafruit_MQTT_Subscribe(&mqtt, "sensor");
DynamicJsonBuffer jsonBuffer;

void setup(void)
{
Serial.begin(115200);
WiFi.mode(WIFI_STA);
setupWifi();
// Connect to MQTT Broker
MQTT_connect();
delay(500);
}

void loop(void)
{
  transmitJsonData(getSensorData());

delay(300);
}
void setupWifi(){
  Serial.print("Connecting to ");
  Serial.println(ssid);

  // Connect to the WiFi
  WiFi.begin(ssid, wifi_password);

  // Wait until the connection has been confirmed before continuing
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // Debugging - Output the IP Address of the ESP8266
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

}

void MQTT_connect(){
  uint8_t retries = 3; 
  int8_t ret; 
  while((ret = mqtt.connect()) !=0 ) {
    Serial.println("Connection to MQTT Broker failed...");
    mqtt.disconnect();
    delay(5000);
    retries--;
    if(retries == 0){
      ESP.wdtDisable();
      while(1);
    }
  }
  Serial.println("Connected to MQTT Broker!");
}

JsonObject& getSensorData(){
    float index_data = adc.readADC(0);
    float ring_data = adc.readADC(1);
    float middle_data = adc.readADC(2);
    float point_data = adc.readADC(3);
    float thumb_data = adc.readADC(4);

//    StaticJsonBuffer<300> jsonBuffer;
    JsonObject& sensorData = jsonBuffer.createObject();
    sensorData["index_finger"] = String (index_data);
    sensorData["ring_finger"] = String (ring_data);
    sensorData["middle_finger"] = String (middle_data);
    sensorData["point_finger"] = String (point_data);
    sensorData["thumb_finger"] = String(thumb_data);

    Serial.println(sensorData["index_finger"].as<char*>());
    Serial.println(sensorData["ring_finger"].as<char*>());
    Serial.println(sensorData["middle_finger"].as<char*>());
    Serial.println(sensorData["point_finger"].as<char*>());
    Serial.println(sensorData["thumb_finger"].as<char*>());
    Serial.println(sensorData.size());

    return sensorData;
}

void transmitJsonData(JsonObject& data){
//    Serial.println("Transmitting data...");

    String sPayload = "";
    data.printTo(sPayload);
    char* cPayload = &sPayload[0u];

    if(!sensorPub.publish(cPayload))
        Serial.println("Transmit failed!");
    else
        Serial.println("Transmit successful.");
}

Я новичок в построении nodemcu и не знаю, в чем причина проблемы.

1 Ответ

0 голосов
/ 11 апреля 2020

очистка jsonBuffer с помощью вызова jsonBuffer.clear () устранила проблему, как предлагал г-н Максим.

...