Serial.print() doesn't print JSON object

I'm trying to read data from an IMU a send through mqtt. I'm reading data and putting inside a JSON object, in order to serialize it and send via ethernet. In order to debug I print the JSON object serialized on the Serial monitor, but the string correspondig to JSON does not appear on the monitor, while all others print() work fine. I'm using a custom board with an ATMega328 and programming it with ESP8266. I tried to write a sample program that print just a JSON object, and it work, but when I try to print it in the complete code it doesn't work. I also tried different solution, but nothing seems to work. Could someone help me? Thank you. I put my code below.

#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <SparkFunLSM9DS1.h>
#include <Arduino_JSON.h>

LSM9DS1 imu;
// Enter a MAC address for your controller below.
byte mac[] = {
    0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};

EthernetClient ethClient;
PubSubClient mqttClient(ethClient);
const char *server = "192.168.0.109";
const int port = 1883;
float gx, gy, gz, ax, ay, az, mx, my, mz;

#define PRINT_CALCULATED
//#define PRINT_RAW
#define PRINT_SPEED 500 // 500 ms between prints
static unsigned long lastPrint = 0; // Keep track of print time

#define DECLINATION -8.58 // Declination (degrees) in Boulder, CO.

//Function definitions
void printGyro();
void printAccel();
void printMag();

void setup()
{
  Ethernet.init(10); // SCSn pin
  Serial.begin(128000);

  Wire.begin();

  if (imu.begin((uint8_t)0x6a, (uint8_t)0x1c, Wire) == false) // with no arguments, this uses default addresses (AG:0x6B, M:0x1E) and i2c port (Wire).
  {
    Serial.println("Failed to communicate with LSM9DS1.");
    Serial.println("Double-check wiring.");
    Serial.println("Default settings in this sketch will " \
                   "work for an out of the box LSM9DS1 " \
                   "Breakout, but may need to be modified " \
                   "if the board jumpers are.");
    while (1);
  }
  // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0){
    Serial.println("Failed to configure Ethernet using DHCP");
    if (Ethernet.hardwareStatus() == EthernetNoHardware){
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    }
    else if (Ethernet.linkStatus() == LinkOFF){
      Serial.println("Ethernet cable is not connected.");
    }
    // no point in carrying on, so do nothing forevermore:
    while (true){
      delay(1);
    }
  }
  // print your local IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

  mqttClient.setServer(server, port);
  if (mqttClient.connect("atmega")){
    Serial.println("Connection has been established, well done");
  }
  else{
    Serial.println("Looks like the server connection failed...");
  }
}

void loop()
{
    switch (Ethernet.maintain()){
  case 1:
    //renewed fail
    Serial.println("Error: renewed fail");
    break;

  case 2:
    //renewed success
    Serial.println("Renewed success");
    //print your local IP address:
    Serial.print("My IP address: ");
    Serial.println(Ethernet.localIP());
    break;

  case 3:
    //rebind fail
    Serial.println("Error: rebind fail");
    break;

  case 4:
    //rebind success
    Serial.println("Rebind success");
    //print your local IP address:
    Serial.print("My IP address: ");
    Serial.println(Ethernet.localIP());
    break;

  default:
    //nothing happened
    break;
  }
  // Update the sensor values whenever new data is available
  if ( imu.gyroAvailable() )
  {
    // To read from the gyroscope,  first call the
    // readGyro() function. When it exits, it'll update the
    // gx, gy, and gz variables with the most current data.
    imu.readGyro();
  }
  if ( imu.accelAvailable() )
  {
    // To read from the accelerometer, first call the
    // readAccel() function. When it exits, it'll update the
    // ax, ay, and az variables with the most current data.
    imu.readAccel();
  }
  if ( imu.magAvailable() )
  {
    // To read from the magnetometer, first call the
    // readMag() function. When it exits, it'll update the
    // mx, my, and mz variables with the most current data.
    imu.readMag();
  }
  
  if ((lastPrint + PRINT_SPEED) < millis())
  {
    printGyro();  // Print "G: gx, gy, gz"
    printAccel(); // Print "A: ax, ay, az"
    printMag();   // Print "M: mx, my, mz"

//============================================================================
    JSONVar doc;
    doc["gx"] = String(gx);
    doc["gy"] = String(gy);            
    doc["gz"] = String(gz);
    String tmp = JSON.stringify(doc);
    Serial.print("Value: ");
    Serial.println(tmp);                 //This line doesn't print
//=============================================================================
    
    /*char ax_str[6], ay_str[6], az_str[6];
    char mx_str[6], my_str[6], mz_str[6];
    
    dtostrf(ax, 4, 3, ax_str);
    dtostrf(ay, 4, 3, ay_str);
    dtostrf(az, 4, 3, az_str);
    dtostrf(mx, 4, 3, mx_str);
    dtostrf(my, 4, 3, my_str);
    dtostrf(mz, 4, 3, mz_str);*/
    //sprintf(packet, "{\"gx\":%s,\"gy\":%s,\"gz\":%s,\"ax\":%s,\"ay\":%s,\"az\":%s,\"mx\":%s,\"my\":%s,\"mz\":%s}", gx_str, gy_str, gz_str, ax_str, ay_str, az_str, mx_str, my_str, mz_str);
    
    if (mqttClient.publish("imu", "packet.c_str()")){
      //Serial.println("Publish succeded!");
    }
    else{
      Serial.println("Publish failed!");
    }

    lastPrint = millis(); // Update lastPrint time
  }
  //delay(2000);
}

void printGyro()
{
  // Now we can use the gx, gy, and gz variables as we please.
  // Either print them as raw ADC values, or calculated in DPS.
  //Serial.print("G: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcGyro helper function to convert a raw ADC value to
  // DPS. Give the function the value that you want to convert.
  gx = imu.calcGyro(imu.gx);
  gy = imu.calcGyro(imu.gy);
  gz = imu.calcGyro(imu.gz);

#elif defined PRINT_RAW
  Serial.print(imu.gx);
  Serial.print(", ");
  Serial.print(imu.gy);
  Serial.print(", ");
  Serial.println(imu.gz);
#endif
}

void printAccel()
{
  // Now we can use the ax, ay, and az variables as we please.
  // Either print them as raw ADC values, or calculated in g's.
  //Serial.print("A: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcAccel helper function to convert a raw ADC value to
  // g's. Give the function the value that you want to convert.
  ax = imu.calcGyro(imu.ax);
  ay = imu.calcGyro(imu.ay);
  az = imu.calcGyro(imu.az);
  /*Serial.print(imu.calcAccel(imu.ax), 2);
  Serial.print(", ");
  Serial.print(imu.calcAccel(imu.ay), 2);
  Serial.print(", ");
  Serial.print(imu.calcAccel(imu.az), 2);
  Serial.println(" g");*/
#elif defined PRINT_RAW
  Serial.print(imu.ax);
  Serial.print(", ");
  Serial.print(imu.ay);
  Serial.print(", ");
  Serial.println(imu.az);
#endif

}

void printMag()
{
  // Now we can use the mx, my, and mz variables as we please.
  // Either print them as raw ADC values, or calculated in Gauss.
  //Serial.print("M: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcMag helper function to convert a raw ADC value to
  // Gauss. Give the function the value that you want to convert.
  mx = imu.calcGyro(imu.mx);
  my = imu.calcGyro(imu.my);
  mz = imu.calcGyro(imu.mz);
  /*Serial.print(imu.calcMag(imu.mx), 2);
  Serial.print(", ");
  Serial.print(imu.calcMag(imu.my), 2);
  Serial.print(", ");
  Serial.print(imu.calcMag(imu.mz), 2);
  Serial.println(" gauss");*/
#elif defined PRINT_RAW
  Serial.print(imu.mx);
  Serial.print(", ");
  Serial.print(imu.my);
  Serial.print(", ");
  Serial.println(imu.mz);
#endif
}

page

Decoding and Encoding JSON Arduino | Random Nerd Tutorials

Hi @fazooadmi
This code was printed correctly.
Something in your code or is not reaching the print routine,
or it is not generating the values correctly.

Printout: Value: {"gx":"15.56","gy":"12.67","gz":"34.78"}

#include <Arduino_JSON.h>
float gx, gy, gz, ax, ay, az, mx, my, mz;
void setup() {
  Serial.begin(115200);
  
  gx = 15.56;
  gy = 12.67;
  gz = 34.78;
  
  
  
  JSONVar doc;
  doc["gx"] = String(gx);
  doc["gy"] = String(gy);
  doc["gz"] = String(gz);
  String tmp = JSON.stringify(doc);
  Serial.print("Value: ");
  Serial.println(tmp);                 //This line doesn't print

}

void loop() {
  // put your main code here, to run repeatedly:

}

This post is identical to Serial.print() doesn't print JSON object serialized

Please explain what is going on