РЕШЕНО Не хочет присваивать переменной значение из json ответа

Тема в разделе "ESP8266, ESP32", создана пользователем Mamedov.rustam88, 12 янв 2020.

  1. Доброго времени суток, я новичек .. помогите ПОЖАЛУЙСТА ..
    Имеется структура (struct) переменным которой присваиваются значения из json ответа вот все хорошо кроме одной переменной (parametrPogody.citiNames) которая должна содержать строковое значение , вот не принимает значение и все .
    Никаких ошибок не выдает, я не знаю куда копать ПОМОГИТЕ ПОЖАЛУЙСТА

    Весь скетч
    Код (C++):
    #include <ArduinoJson.h>
    #include <ESP8266WiFi.h>

    const char* ssid     = "ssid";
    const char* password = "000000";


    const char* host = "api.openweathermap.org";
    String line;

    typedef struct {
      String citiNames;
      float  temperatura;
      float  atmosDavlenie;
      int    vlajnost;
      float  scorostVetra;
      int    naprovVetra;
    }        structPogody;

    structPogody parametrPogody;

    void setup() {
      Serial.begin(115200);
      delay(10);


      // We start by connecting to a WiFi network

      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid);

      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }

      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      delay(200);
      jsonGet();
    }

    void loop() {
      /// отправка в Serial названия города
      Serial.print("name:");              
      Serial.println(parametrPogody.citiNames);

      float tempK = parametrPogody.temperatura ;                   // достаем температуру из структуры main
      float tempC = tempK - 273.15;                              // переводим кельвины в цельси
      Serial.print("temp: ");
      Serial.print(tempC);                                      // отправляем значение в сериал
      Serial.println(" C");

      int pressurehPa = parametrPogody.atmosDavlenie;
      float pressure = pressurehPa / 1.333;
      Serial.print("pressure: ");
      Serial.print(pressure);
      Serial.println(" mmHc");

      Serial.print("humidity: ");
      Serial.print(parametrPogody.vlajnost);
      Serial.println(" %");

      Serial.print("wind speed: ");
      Serial.print(parametrPogody.scorostVetra);
      Serial.println(" m/s");


      Serial.print("wind deg :");
      Serial.println(parametrPogody.naprovVetra);


      Serial.println();
      Serial.println();
      delay(60000);
      jsonGet();

    }


    void jsonGet() {

      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int httpPort = 80;
      unsigned int rest = 0;
      while (!client.connect(host, httpPort)) {
        rest++;
        Serial.println("connection failed");
        delay(5000);
        if(rest >= 5) ESP.restart();
      }

      if (client.connected()) {
        client.println("GET /data/2.5/weather?id=520555&appid=957711c01c891444d306d699911a722e HTTP/1.1");
        client.println("Host: api.openweathermap.org");
        client.println("Connection: close");
        client.println();
      }

      // wait for data to be available
      unsigned long timeout = millis();
      while (client.available() == 0) {
        if (millis() - timeout > 5000) {
          Serial.println(">>> Client Timeout !");
          timeout = millis();
        }
      }

      // Read all the lines of the reply from server and print them to Serial
      while (client.available()) {
        line = client.readStringUntil('\r');
      }
      Serial.println(line);
      int dlina = line.length();
      Serial.println(dlina);
      StaticJsonDocument<500> docJson;                     // Создаем буфер
      if(deserializeJson(docJson, line)) Serial.println("deserialize OK!");

      /*Поскольку в JSON нет информации о нужном типе, приведение приходится делать вручную .as<ТУТ ТИП>()*/
      parametrPogody.citiNames     = docJson["name"].as<char*>();
      parametrPogody.temperatura   = docJson["main"]["temp"].as<float>();
      parametrPogody.atmosDavlenie = docJson["main"]["pressure"].as<float>();
      parametrPogody.vlajnost      = docJson["main"]["humidity"].as<int>();
      parametrPogody.scorostVetra  = docJson["wind"]["speed"].as<float>();
      parametrPogody.naprovVetra   = docJson["wind"]["deg"].as<int>();
    }
    Вот содержимое Json ответа
    Код (C++):
    {"coord":{"lon":44,"lat":56.33},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":272.08,"feels_like":268.39,"temp_min":272.04,"temp_max":272.15,"pressure":1013,"humidity":92},"visibility":10000,"wind":{"speed":2,"deg":290},"clouds":{"all":75},"dt":1578737654,"sys":{"type":1,"id":9037,"country":"RU","sunrise":1578720715,"sunset":1578747053},"timezone":10800,"id":520555,"name":"Nizhniy Novgorod","cod":200}
     
    Вот на скриншоте видно что переменная parametrPogody.citiNames пустая хотя в json ответе она присутствует..
    Скетч и Json ответ прикрепил как файл
     

    Вложения:

    • kompil.jpg
      kompil.jpg
      Размер файла:
      193,6 КБ
      Просмотров:
      244
    • json_otvet.h
      Размер файла:
      477 байт
      Просмотров:
      239
    • pogoda.ino
      Размер файла:
      3,8 КБ
      Просмотров:
      245
    Последнее редактирование: 12 янв 2020
  2. NikitOS

    NikitOS Король шутов Администратор

    А почему тут char? Может все же string?

    ЗЫ: названия переменных на английском пишите, от транслита глаза кровоточат
     
  3. я там и String подставлял , в место значения null получал, сейчас еще раз проверю..
     
  4. Вот..
     

    Вложения:

    • String.jpg
      String.jpg
      Размер файла:
      192,4 КБ
      Просмотров:
      249
  5. parovoZZ

    parovoZZ Гуру

    А стринги разве можно в структуру засовывать? Оно же неопределённой длины.
     
  6. Я сейчас переменной из структуры просто передал текст и он присвоился (прилагаю скриншот ), я новичек не особо чувствую разницу строки массивы все эти тонкости..
     

    Вложения:

    • test_text.jpg
      test_text.jpg
      Размер файла:
      177,9 КБ
      Просмотров:
      239
  7. Проблема решена, был указан не правильный обьем json буфера
    StaticJsonDocument<850> docJson;