• Система автоматизации с открытым исходным кодом на базе 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 отсекать битые ответы.
 
Сверху Снизу