• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Интернет термометр на базе Яндекс погода

Silver1616

New member
Всем привет, делаю проект интернет термометра на базе NodeMCU. Использую библиотеки

C++:
#include <SPI.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <LCD_1602_RUS.h>
#include <LiquidCrystal_I2C.h>
Сам код
C++:
const char* ssid     = "****";                 //имя точки доступа
const char* password = "****";               //пароль wifi

const char* host = "api.openweathermap.org";
String line;
void setup() {
  lcd.init();                                       //инициализация LCD (подготовка к работе)
  lcd.backlight();                                  //включение подсветки
  Serial.begin(115200);                             //скорость передачи данных
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  jsonGet();                                        //запускаем функцию
}

void jsonGet() {

   WiFiClient client;

  const char* host = "api.openweathermap.org";
  const int httpPort = 80;
  if (!client.connect(host, httpPort))
  {
    Serial.println("connection failed");
    return;
  }
  //Пишем в line строку адреса запроса


  client.println("GET /data/2.5/weather?q=Adler&appid=22468a8530fc45261a0d7a4b22cb14c3&lang=ru&units=metric HTTP/1.1");
  client.println("Host: api.openweathermap.org");
  client.println("Connection: close");
  client.println();

  delay(1500);
  // Read all the lines of the reply from server and print them to Serial
  while(client.available())
  {
    line = client.readStringUntil('\r');
  }

  Serial.print(line);
  Serial.println();
  Serial.println("closing connection");

}

void loop() {
 
   StaticJsonBuffer<2000> jsonBuffer;                   // буфер на 2000 символов
   JsonObject& root = jsonBuffer.parseObject(line);     // отправляем String
   if (!root.success())
   {
      Serial.println("parseObject() failed");           // если ошибка, пишем об этом
      jsonGet();                                        // обращаемся к серверу еще раз
      return;                                           // и теперь по новой парсим
   }

Код рабочий для сервиса api.openweathermap.org , но при подключении к API Яндекса не работает. Нужно отправить GET запрос с ключом авторизации. У яндекса нет хоста и порта который бы возвращал статус 200 для установки соединения. Вопрос как с NODE MCV отправить GET запрос с заголовком не устанавливая предварительное соединение ?

C++:
  const char* host = "api.openweathermap.org";

  const int httpPort = 80;

  if (!client.connect(host, httpPort))

  {

    Serial.println("connection failed");

    return;

  }
 

enjoynering

Well-known member
json буфер на 2кб для openweathermap.org избыточен - текщая погода оттуда весит около 500 байт. так что 1024 хватит за глаза.
 

enjoynering

Well-known member
Ну для таких вещей лучше использовать не голую библиотеку ESP8266WiFi.h , а ESP8266HTTPClient.h. с ней можно получать http codes типа 200, 404 и тд и ещё до вызова arduinojson отсекать битые ответы.
 
Сверху Снизу