0

I have an array of data from MQTT to Nodemcu. I deserialize that data to turn on/off the led indicator in Blynk. But the process is too slow. How can I make it fast?

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.println("Message arrived");
  Serial.println(mqtt_topic);
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  String payloadString = "";
  for (int i = 0; i < length; i++) {
    payloadString += (char)payload[i];
  }
  Serial.println(payloadString);
  DynamicJsonDocument doc(1024);
  doc.clear();
  DeserializationError error = deserializeJson(doc, payloadString);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  String id_standby;
  String id_run;
  String id_stop;
  String id_rgb1;
  String id_motor;
  String id_rgb2;
  String id_aplus;
  String id_bplus;
  bool v_standby;
  bool v_run;
  bool v_stop;
  bool v_rgb1;
  bool v_motor;
  bool v_rgb2;
  bool v_aplus;
  bool v_bplus;

  for (int i = 0; i < 5; i++) {
    String id = doc["values"][i]["id"];

    if (id == "Container Station.PLC.Stand_By") {
      String id_s = doc["values"][i]["id"];
      id_standby = id_s;
      bool v_s = doc["values"][i]["v"];
      v_standby = v_s;
      Serial.println("id standby :" + String(id_standby));
      Serial.println("value standby :" + String(v_standby));
      if (v_standby == true) {
        // Set pin virtual V8 menjadi HIGH
        Blynk.virtualWrite(V8, HIGH);
      }
      if (v_standby == false) {
        // Set pin virtual V8 menjadi HIGH
        Blynk.virtualWrite(V8, LOW);
      }
    }

    if (id == "Container Station.PLC.Run") {
      String id_r = doc["values"][i]["id"];
      id_run = id_r;
      bool v_r = doc["values"][i]["v"];
      v_run = v_r;
      Serial.println("id run :" + String(id_run));
      Serial.println("value run :" + String(v_run));
      if (v_run == true) {
        Blynk.virtualWrite (V7, HIGH);
      }
      if (v_run == false) {
        Blynk.virtualWrite(V7, LOW);
      }
    }

    if (id == "Container Station.PLC.RED_LED") {
      String id_st = doc["values"][i]["id"];
      id_stop = id_st;
      bool v_st = doc["values"][i]["v"];
      v_stop = v_st;
      Serial.println("id stop :" + String(id_stop));
      Serial.println("value stop :" + String(v_stop));
      if (v_stop == true) {
        // Set pin virtual V1 menjadi HIGH
        Blynk.virtualWrite(V11, HIGH);
      }
      if (v_stop == false) {
        // Set pin virtual V1 menjadi HIGH
        Blynk.virtualWrite(V11, LOW);
      }
    }

    if (id == "Container Station.PLC.RGB1") {
      String id_a = doc["values"][i]["id"];
      id_rgb1 = id_a;
      bool v_a = doc["values"][i]["v"];
      v_rgb1 = v_a;
      Serial.println("id auto :" + String(id_rgb1));
      Serial.println("value auto :" + String(v_rgb1));
      if (v_rgb1 == true) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V14, HIGH);
      }
      if (v_rgb1 == false) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V14, LOW);
      }
    }

    if (id == "Container Station.PLC.Motor") {
      String id_m = doc["values"][i]["id"];
      id_motor = id_m;
      bool v_m = doc["values"][i]["v"];
      v_motor = v_m;
      Serial.println("id motor :" + String(id_motor));
      Serial.println("value motor :" + String(v_motor));
      if (v_motor == true) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V4, HIGH);
      }
      if (v_motor == false) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V4, LOW);
      }
    }

    if (id == "Container Station.PLC.RGB2") {
      String id_r = doc["values"][i]["id"];
      id_rgb2 = id_r;
      bool v_r = doc["values"][i]["v"];
      v_rgb2 = v_r;
      Serial.println("id motor :" + String(id_rgb2));
      Serial.println("value motor :" + String(v_rgb2));
      if (v_rgb2 == true) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V15, HIGH);
      }
      if (v_rgb2 == false) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V15, LOW);
      }
    }

    if (id == "Container Station.PLC.A_Plus") {
      String id_ap = doc["values"][i]["id"];
      id_aplus = id_ap;
      bool v_ap = doc["values"][i]["v"];
      v_aplus = v_ap;
      Serial.println("id motor :" + String(id_aplus));
      Serial.println("value motor :" + String(v_aplus));
      if (v_aplus == true) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V5, HIGH);
      }
      if (v_aplus == false) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V5, LOW);
      }
    }

    if (id == "Container Station.PLC.B_Plus") {
      String id_bp = doc["values"][i]["id"];
      id_bplus = id_bp;
      bool v_bp = doc["values"][i]["v"];
      v_bplus = v_bp;
      Serial.println("id motor :" + String(id_bplus));
      Serial.println("value motor :" + String(v_bplus));
      if (v_bplus == true) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V6, HIGH);
      }
      if (v_bplus == false) {
        // Set pin virtual V4 menjadi HIGH
        Blynk.virtualWrite(V6, LOW);
      }
    }

  }
}

I have tried to add the millis to the program but ot won't work, and i tried to add jsonbuffer but it's not working too. And i hope that the deserialize process will be faster

0 Answers0