在ESP8266中运行一段时间后,JsonData大小变为零

问题描述 投票:1回答:1

我正在构建一个与nodemcu 1.0(ESP-12E模块)相关的项目,该项目读取数据并将其解析为Json Object,然后通过MQTT将对象传输到rpi。我的问题是,运行一两分钟后,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的新成员,不知道是什么原因引起的。

c++ arduino esp8266 arduino-esp8266
1个回答
0
投票

通过调用jsonBuffer.clear()清除jsonBuffer可以解决Maxim先生建议的问题。

© www.soinside.com 2019 - 2024. All rights reserved.