Часы, календарь, погода на esp32 + lcd2004

Тема в разделе "Глядите, что я сделал", создана пользователем issaom, 26 авг 2020.

  1. issaom

    issaom Гуру

    Просто часы и погода с сайта https://openweathermap.org/
    • время, день недели, число, месяц (синхронизируется в момент включения и потом один раз в сутки через Интернет)
    • температура и влажность в помещении
    • текущая погода (обновляется раз в 10 минут) температура, влажность,
      скорость и направление ветра, атмосферное давление (мм.рт.ст.), город, время восхода и заката солнца
    1.jpg

    2.jpg

    Код (C++):
    #include <WiFi.h>
    #include <HTTPClient.h>
    #include <ArduinoJson.h>
    #include "time.h"
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x3F, 20, 4);           // у переходника дисплея адрес 0x3F
    #include "iRusFont.h"
    #include "Adafruit_SHT31.h"
    Adafruit_SHT31 sht31 = Adafruit_SHT31();      // объект для работы с датчиком

    const char* ssid     = "";                                     // ssid
    const char* password = "";                                // пароль

    const char* ntpServer = "pool.ntp.org";       // сервер времени
    const long  gmtOffset_sec = 10800;            // 3600*3=10800 (UTC+3) Москва
    const int   daylightOffset_sec = 0;               // переход на летнее время

    String openWeatherMapApiKey = "";     // ApiKey
    String cityID = "";                                   // ID города

    // Выделить буфер для документа JSON
    // Внутри скобок 200-это емкость пула памяти в байтах
    // Не забудьте изменить это значение, чтобы оно соответствовало вашему документу JSON.

    StaticJsonDocument<801> doc;
    String jsonBuffer;

    // массив строк месяцы
    const char *months[]  = {
      "Января",   // 0  mem 4
      "Февраля",  // 1  mem 4
      "Марта",    // 2  mem 2
      "Апреля",   // 3  mem 3
      "Мая",      // 4  mem 2
      "Июня",     // 5  mem 4
      "Июля",     // 6  mem 4
      "Августа",  // 7  mem 3
      "Сентября", // 8  mem 4
      "Октября",  // 9  mem 4
      "Ноября",   // 10 mem 3
      "Декабря",  // 11 mem 4
    };

    // массив строк - дни недели
    const char *weekday[]  = {
      "Вс",   // 0
      "Пн",   // 1
      "Вт",   // 2
      "Ср",   // 3
      "Чт",   // 4
      "Пт",   // 5
      "Сб",   // 6
    };

    String S = "";                                // для всякой хренотени
    unsigned long previousMillis = 0;             // предыдущее значение времени
    const long interval = 500;                    // интервал переключений
    uint8_t sec05 = 0;                            // для отсчета полсекунды
    uint8_t  minOWCount = 0;                      // для отсчета минут для запроса openweathermap
    const uint8_t minOW = 10;                     // запрашивать погоду каждые 10 минут
    uint16_t  minDTCount = 0;                     // для отсчета минут для синхронизации времени
    const uint16_t minDT = 1440;                  // синхронизировать время каждые 24*60= 1440 минут (сутки)

    void setup()
    {
      Serial.begin(115200);
      sht31.begin(0x44);                          // инициализация датчика темп/влажн
      lcd.init();                                 // инициализация дисплея
      lcd.backlight();                            // включаем подсветку
      rusClear();                                 // очистка экрана

      iPrintString ("Подключаемся к", 0, 0);      // текст, столбец, строка
      iPrintString (ssid, 0, 1);                  // ssid
      WiFi.begin(ssid, password);

      lcd.setCursor(0, 2);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        lcd.print('.');
      }
      lcd.setCursor(0, 3);                        // Печатаем IP - шник
      lcd.print("IP:");
      lcd.print(WiFi.localIP());
      delay(4000);
      rusClear();
      configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);  // Синхронизируем внутренние часы с временем из интернета
      printWeather ();                                           // просим погоду
    }

    void loop()
    {

      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;
        sec05++;
        // раз в полсекунды мигаем точками
        if (sec05 & 1) iPrintString (":", 2, 0); else iPrintString (" ", 2, 0);

        // раз в одну секунду обновляем время и температуру
        if (sec05 & 1) {
          printTH ();
          printLocalTime();
        }

        // прошла одна минута
        if (sec05 >= 120) {
          sec05 = 0;
          minOWCount++;
          minDTCount++;

        //Прошло 10 минут
          if (minOWCount >= minOW) {
            minOWCount = 0;
            // печатаем погоду
            printWeather();
          }

          //Прошло 1440 минут (сутки)
          if (minDTCount >= minDT) {
            minDTCount = 0;
            //синхронизируем время
            configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
          }
        }
      }

    }

    String httpGETRequest(const char* serverName) {
      HTTPClient http;
      // Your IP address with path or Domain name with URL path
      http.begin(serverName);
      // Send HTTP POST request
      int httpResponseCode = http.GET();
      String payload = "{}";
      if (httpResponseCode > 0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        payload = http.getString();
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
      return payload;
    }

    void printWeather () {
      // проверяем подключение
      if (WiFi.status() == WL_CONNECTED) {

        // Формируем строку для получения API
        String serverPath = "http://api.openweathermap.org/data/2.5/weather?id=" + cityID + "&appid=" + openWeatherMapApiKey;
        // Запрашиваем строку json
        jsonBuffer = httpGETRequest(serverPath.c_str());
        Serial.println(jsonBuffer);
        deserializeJson(doc, jsonBuffer);

        JsonObject main = doc["main"];
        float main_temp = main["temp"];                      // температура Кельвины
        int8_t tempC = round(main_temp - 273.15);            // температура С
        int main_pressure = main["pressure"];                // давление hPa
        uint16_t pressureMM = round(main_pressure * 0.75);   // давление мм рт столба
        pressureMM = pressureMM - 11;                        // х/з
        int main_humidity = main["humidity"];                // влажность
        float wind_speed = doc["wind"]["speed"];             // скорость ветра
        int wind_deg = doc["wind"]["deg"];                   // направление ветра

        lcd.setCursor (11, 1);
        lcd.print("         ");
        lcd.setCursor (11, 1);
        if (tempC == 0) lcd.print(' ');
        if (tempC > 0) lcd.print('+');
        lcd.print(tempC);
        lcd.print('C');
        lcd.print(' ');
        lcd.print(main_humidity);
        lcd.print('%');

        lcd.setCursor (0, 2);
        lcd.print(wind_speed, 1);
        lcd.print("M/C");

        // скорость и направление ветра
        uint8_t z = 0;
        if (wind_speed >= 10) z = 8; else z = 7;
        if (wind_deg >= 0 && wind_deg <= 22) iPrintString    ("C ",  z, 2);
        if (wind_deg >= 23 && wind_deg <= 67) iPrintString   ("CB",  z, 2);
        if (wind_deg >= 68 && wind_deg <= 112) iPrintString  ("B ",  z, 2);
        if (wind_deg >= 113 && wind_deg <= 157) iPrintString ("ЮВ",  z, 2);
        if (wind_deg >= 158 && wind_deg <= 202) iPrintString ("Ю ",  z, 2);
        if (wind_deg >= 203 && wind_deg <= 247) iPrintString ("Ю3",  z, 2);
        if (wind_deg >= 248 && wind_deg <= 292) iPrintString ("3 ",  z, 2);
        if (wind_deg >= 293 && wind_deg <= 337) iPrintString ("С3",  z, 2);
        if (wind_deg >= 338 && wind_deg <= 360) iPrintString ("С ",  z, 2);

        // давление в мм рт. ст.
        lcd.setCursor (11, 2);
        lcd.print(pressureMM);
        lcd.print("MM");

        // Название города
        lcd.setCursor (0, 3);
        const char* name = doc["name"];            // "Cherepovets"
        lcd.print(name);

        lcd.setCursor (10, 3);
        lcd.print(' ');

        JsonObject sys = doc["sys"];
        long sys_sunrise = sys["sunrise"];         // Восход
        // Указатель, в который будет помещен адрес структуры с
        // преобразованным временем
        struct tm *my_time;
        //Преобразуем sys_sunrise в структуру
        my_time  = localtime (&sys_sunrise);
        lcd.setCursor (11, 3);
        lcd.print(my_time, "%H");
        lcd.print(my_time, "%M");

        long sys_sunset = sys["sunset"];           // Закат
        //Преобразуем sys_sunset в структуру
        my_time  = localtime (&sys_sunset);

        lcd.print(' ');
        lcd.print(my_time, "%H");
        lcd.print(my_time, "%M");

      } else {
        //нету подключения к ЛВС
      }

      struct tm timeinfo;
      if (!getLocalTime(&timeinfo)) {
        Serial.println("Failed to obtain time");
        return;
      }
    }

    void printTH () {
      float t = sht31.readTemperature();            // считываем температуру
      S = "+" + String(t, 1) + "C";                 // округляем до 10-х
      iPrintString (S, 0, 1);                       // текст, столбец, строка
      float h = sht31.readHumidity();               // считываем влажность
      S = String(h, 0) + "%";                       // окуругляем до целых
      iPrintString (S, 7, 1);                       // текст, столбец, строка
    }

    void printLocalTime() {
      struct tm timeinfo;
      if (!getLocalTime(&timeinfo)) {
        Serial.println("Failed to obtain time");
        return;
      }
      lcd.setCursor(0, 0);
      lcd.print(&timeinfo, "%H");
      lcd.setCursor(3, 0);
      lcd.print(&timeinfo, "%M");
      lcd.print(' ');
      iPrintString (weekday[timeinfo.tm_wday], 6, 0);      // день недели
      lcd.print(' ');
      lcd.print(timeinfo.tm_mday);                         // день месяца
      if (timeinfo.tm_mday < 10) iPrintString (months[timeinfo.tm_mon], 11, 0);
      else iPrintString (months[timeinfo.tm_mon], 12, 0);  // название месяца
    }
     
    samand587, Mihail78, OldKryptos и 4 другим нравится это.
  2. issaom

    issaom Гуру

    Руссификатор для ESP32 и LCD2004 без кириллицы
    Код (C++):
    // счетчик создаваемых символов
    uint8_t numberCreateChar = 0;
    // массив для хранения уже созданных символов
    uint8_t saveCreateChar [] = {0, 0, 0, 0, 0, 0, 0, 0};
    // Набор изображений кириллических символов только для отуствующих
    const uint8_t RUSsymbol[] {
      //Б 0
      0b11111,
      0b10000,
      0b10000,
      0b11110,
      0b10001,
      0b10001,
      0b11110,
      0b00000,
      //Г 1
      0b11111,
      0b10000,
      0b10000,
      0b10000,
      0b10000,
      0b10000,
      0b10000,
      0b00000,
      //Д 2
      0b00110,
      0b01010,
      0b01010,
      0b01010,
      0b01010,
      0b01010,
      0b11111,
      0b10001,
      //Ж 3
      0b10101,
      0b10101,
      0b10101,
      0b01110,
      0b10101,
      0b10101,
      0b10101,
      0b00000,
      //З 4
      0b01110,
      0b10001,
      0b00001,
      0b00110,
      0b00001,
      0b10001,
      0b01110,
      0b00000,
      //И 5
      0b10001,
      0b10001,
      0b10001,
      0b10011,
      0b10101,
      0b11001,
      0b10001,
      0b00000,
      //Й 6
      0b10101,
      0b10001,
      0b10001,
      0b10011,
      0b10101,
      0b11001,
      0b10001,
      0b00000,
      //Л 7
      0b00111,
      0b01001,
      0b01001,
      0b01001,
      0b01001,
      0b01001,
      0b10001,
      0b00000,
      //П 8
      0b11111,
      0b10001,
      0b10001,
      0b10001,
      0b10001,
      0b10001,
      0b10001,
      0b00000,
      //У 9
      0b10001,
      0b10001,
      0b10001,
      0b01111,
      0b00001,
      0b10001,
      0b01110,
      0b00000,
      //Ф 10
      0b00100,
      0b01110,
      0b10101,
      0b10101,
      0b10101,
      0b01110,
      0b00100,
      0b00000,
      //Ц 11
      0b10010,
      0b10010,
      0b10010,
      0b10010,
      0b10010,
      0b10010,
      0b11111,
      0b00001,
      //Ч 12
      0b10001,
      0b10001,
      0b10001,
      0b01111,
      0b00001,
      0b00001,
      0b00001,
      0b00000,
      //Ш 13
      0b10001,
      0b10001,
      0b10001,
      0b10101,
      0b10101,
      0b10101,
      0b11111,
      0b00000,
      //Щ 14
      0b10001,
      0b10001,
      0b10001,
      0b10101,
      0b10101,
      0b10101,
      0b11111,
      0b00001,
      //Ъ 15
      0b11000,
      0b01000,
      0b01000,
      0b01110,
      0b01001,
      0b01001,
      0b01110,
      0b00000,
      //Ы 16
      0b10001,
      0b10001,
      0b10001,
      0b11101,
      0b10011,
      0b10011,
      0b11101,
      0b00000,
      //Ь 17
      0b10000,
      0b10000,
      0b10000,
      0b11110,
      0b10001,
      0b10001,
      0b11110,
      0b00000,
      //Э 18
      0b01110,
      0b10001,
      0b00001,
      0b00111,
      0b00001,
      0b10001,
      0b01110,
      0b00000,
      //Ю 19
      0b10010,
      0b10101,
      0b10101,
      0b11101,
      0b10101,
      0b10101,
      0b10010,
      0b00000,
      //Я 20
      0b01111,
      0b10001,
      0b10001,
      0b01111,
      0b00101,
      0b01001,
      0b10001,
      0b00000,
      //б 21
      0b00011,
      0b01100,
      0b10000,
      0b11110,
      0b10001,
      0b10001,
      0b01110,
      0b00000,
      //в 22
      0b00000,
      0b00000,
      0b11110,
      0b10001,
      0b11110,
      0b10001,
      0b11110,
      0b00000,
      //г 23
      0b00000,
      0b00000,
      0b11110,
      0b10000,
      0b10000,
      0b10000,
      0b10000,
      0b00000,
      //д 24
      0b00000,
      0b00000,
      0b00110,
      0b01010,
      0b01010,
      0b01010,
      0b11111,
      0b10001,
      //ж 25
      0b00000,
      0b00000,
      0b10101,
      0b10101,
      0b01110,
      0b10101,
      0b10101,
      0b00000,
      //з 26
      0b00000,
      0b00000,
      0b01110,
      0b10001,
      0b00110,
      0b10001,
      0b01110,
      0b00000,
      //и 27
      0b00000,
      0b00000,
      0b10001,
      0b10011,
      0b10101,
      0b11001,
      0b10001,
      0b00000,
      //й 28
      0b01010,
      0b00100,
      0b10001,
      0b10011,
      0b10101,
      0b11001,
      0b10001,
      0b00000,
      //к 29
      0b00000,
      0b00000,
      0b10010,
      0b10100,
      0b11000,
      0b10100,
      0b10010,
      0b00000,
      //л 30
      0b00000,
      0b00000,
      0b00111,
      0b01001,
      0b01001,
      0b01001,
      0b10001,
      0b00000,
      //м 31
      0b00000,
      0b00000,
      0b10001,
      0b11011,
      0b10101,
      0b10001,
      0b10001,
      0b00000,
      //н 32
      0b00000,
      0b00000,
      0b10001,
      0b10001,
      0b11111,
      0b10001,
      0b10001,
      0b00000,
      //п 33
      0b00000,
      0b00000,
      0b11111,
      0b10001,
      0b10001,
      0b10001,
      0b10001,
      0b00000,
      //т 34
      0b00000,
      0b00000,
      0b11111,
      0b00100,
      0b00100,
      0b00100,
      0b00100,
      0b00000,
      //ф 35
      0b00000,
      0b00000,
      0b00100,
      0b01110,
      0b10101,
      0b01110,
      0b00100,
      0b00000,
      //ц 36
      0b00000,
      0b00000,
      0b10010,
      0b10010,
      0b10010,
      0b10010,
      0b11111,
      0b00001,
      //ч 37
      0b00000,
      0b00000,
      0b10001,
      0b10001,
      0b01111,
      0b00001,
      0b00001,
      0b00000,
      //ш 38
      0b00000,
      0b00000,
      0b10101,
      0b10101,
      0b10101,
      0b10101,
      0b11111,
      0b00000,
      //щ 39
      0b00000,
      0b00000,
      0b10101,
      0b10101,
      0b10101,
      0b10101,
      0b11111,
      0b00001,
      //ъ 40
      0b00000,
      0b00000,
      0b11000,
      0b01000,
      0b01110,
      0b01001,
      0b01110,
      0b00000,
      //ы 41
      0b00000,
      0b00000,
      0b10001,
      0b10001,
      0b11101,
      0b10011,
      0b11101,
      0b00000,
      //ь 42
      0b00000,
      0b00000,
      0b10000,
      0b10000,
      0b11110,
      0b10001,
      0b11110,
      0b00000,
      //э 43
      0b00000,
      0b00000,
      0b01110,
      0b10001,
      0b00111,
      0b10001,
      0b01110,
      0b00000,
      //ю 44
      0b00000,
      0b00000,
      0b10010,
      0b10101,
      0b11101,
      0b10101,
      0b10010,
      0b00000,
      //я 45
      0b00000,
      0b00000,
      0b01111,
      0b10001,
      0b01111,
      0b00101,
      0b01001,
      0b00000
    };

    // функция перекодировки символов из UTF-8
    // Если аналог символа есть в Английском языке возвращаем символ ASCII
    // Иначе возвращаем символ подмены - номер в начале массива
    uint8_t searchChar (uint8_t s) {
      switch (s) {
        case 144: return 'A'; break;  // А +
        case 145: return 130; break;  // Б -
        case 146: return 'B'; break;  // В +
        case 147: return 131; break;  // Г -
        case 148: return 132; break;  // Д -
        case 149: return 'E'; break;  // Е +
        case 150: return 133; break;  // Ж -
        case 151: return 134; break;  // З -
        case 152: return 135; break;  // И -
        case 153: return 136; break;  // Й -
        case 154: return 'K'; break;  // К +
        case 155: return 137; break;  // Л -
        case 156: return 'M'; break;  // М +
        case 157: return 'H'; break;  // Н +
        case 158: return 'O'; break;  // О +
        case 159: return 138; break;  // П -
        case 160: return 'P'; break;  // Р +
        case 161: return 'C'; break;  // С +
        case 162: return 'T'; break;  // Т +
        case 163: return 139; break;  // У -
        case 164: return 140; break;  // Ф -
        case 165: return 'X'; break;  // Х +
        case 166: return 141; break;  // Ц -
        case 167: return 142; break;  // Ч -
        case 168: return 143; break;  // Ш -
        case 169: return 144; break;  // Щ -
        case 170: return 145; break;  // Ъ -
        case 171: return 146; break;  // Ы -
        case 172: return 147; break;  // Ь -
        case 173: return 148; break;  // Э -
        case 174: return 149; break;  // Ю -
        case 175: return 150; break;  // Я ---
        case 176: return 'a'; break;  // а +
        case 177: return 151; break;  // б -
        case 178: return 152; break;  // в -
        case 179: return 153; break;  // г -
        case 180: return 154; break;  // д -
        case 181: return 'e'; break;  // е +
        case 182: return 155; break;  // ж -
        case 183: return 156; break;  // з -
        case 184: return 157; break;  // и -
        case 185: return 158; break;  // й -
        case 186: return 159; break;  // к -
        case 187: return 160; break;  // л -
        case 188: return 161; break;  // м -
        case 189: return 162; break;  // н -
        case 190: return 'o'; break;  // о +
        case 191: return 163; break;  // п -
        case 128: return 'p'; break;  // р +
        case 129: return 'c'; break;  // с -
        case 130: return 164; break;  // т -
        case 131: return 'y'; break;  // у +
        case 132: return 165; break;  // ф -
        case 133: return 'x'; break;  // х +
        case 134: return 166; break;  // ц -
        case 135: return 167; break;  // ч -
        case 136: return 168; break;  // ш -
        case 137: return 169; break;  // щ -
        case 138: return 170; break;  // ъ -
        case 139: return 171; break;  // ы -
        case 140: return 172; break;  // ь -
        case 141: return 173; break;  // э -
        case 142: return 174; break;  // ю -
        case 143: return 175; break;  // я -
        default:  return s;   break;  // ASCII 32....127
      }
    }

    // перед распечаткой нового экрана сбрасываем генератор на 0
    void rusClear () {
      numberCreateChar = 0;
      for (uint8_t k = 0; k < 8; k++) saveCreateChar[k] = 0;
      lcd.clear();
    }


    void iPrintString (String S, uint8_t col, uint8_t row) {
      // отрезаем старший байт UTF-8 в строке символов
      for (int i = 0; i < S.length(); i++) {
        uint8_t st = S.charAt(i);
        if (st == 208) continue;  //старший байт идем нахер
        if (st == 209) continue;  //старший байт идем нахер
        // ищем код нужного символа
        uint8_t j = searchChar(st);

        // пришел стандартный символ ASCII или аналог русской буквы
        if (j < 128) {
          lcd.setCursor(col, row);
          lcd.write(j);
          col++;
        }

        // требуется замена символа
        if (j >= 130) {
          int8_t z = 0;
          // Ищем в массиве символ и если он есть печатаем и выходим
          for (z = 0; z < 8; z++) {
            if  (saveCreateChar[z] ==  j) {
              lcd.setCursor(col, row);
              lcd.write(z);
              col++;
              z = -1;
              break;
            }
          }

          if (z == -1)  continue;  //остальное в цикле не выполняем

          // Ничего не нашли - создаем массив для создания символа
          uint8_t bufChar[8]  = {0, 0, 0, 0, 0, 0, 0, 0};
          // загружаем символ в промежуточный массив
          for (uint8_t k = 0; k < 8; k++) bufChar[k] = RUSsymbol[k + ((j - 130) * 8)];
          // запоминаем какой символ уже забахали
          saveCreateChar [numberCreateChar] = j;
          // создаем символ в дисплее
          lcd.createChar(numberCreateChar, bufChar);
          lcd.setCursor(col, row);
          lcd.write(numberCreateChar);
          col++;
          numberCreateChar ++;

          // отладка посмотреть сколько памяти
          // съедает выводимый текст
          // lcd.setCursor(19, 3);
          // lcd.print(numberCreateChar);

          if (numberCreateChar >= 8) {

            numberCreateChar = 0;
          }
        }
      }
    }
     
  3. issaom

    issaom Гуру

    видео для тех кому мало фото

     
    samand587, Airbus, NikitOS и 2 другим нравится это.
  4. Deniskyn

    Deniskyn Гик

    Судя по фото дисплей у вас не совсем обычный.... кассовое или подобное оборудование? маркировка есть на нем?
     
  5. issaom

    issaom Гуру

    Покупал его на Алике вот он - жалко только что он без кириллицы.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Город как определяет? Город—Череповец?
     
  7. issaom

    issaom Гуру

    Ага - это то что API отдает пока для проверки, потом может на курс валют поменяю.....
     
  8. Deniskyn

    Deniskyn Гик

    Проект ваш зачетный, но мне кажется логичнее было бы выводить основную часть времени большие часы, а данные с датчиков и погоду например по нажатию кнопки.....
     
  9. issaom

    issaom Гуру

    Я специально брал балшой дисплей чтобы не клацать... Кухня маленькая - все читается на ура с любой точки )))
    IMG_20200830_153921.jpg
     
  10. Un_ka

    Un_ka Гуру

    Корпус бы ему. Контакты макетки смотрятся топорно за таким дисплеем.
    Я бы в первую очередь сделал корпус под дисплей и не использовал громадную макету.
    Какой ток потребляет? Гасится ли экран на ночь или с потерей WiFi?
     
  11. issaom

    issaom Гуру

    Это еще не окончательный вариант - может чего туда еще докину на макетку. (собственно поэтому я и не травлю платы - всегда можно взять паяльник и чего нибудь добавить)
     
  12. andr_us

    andr_us Нуб

    Здравствуйте. Я перешел сюда с Дзена по рекомендации Автора. Я попытался повторить данный проект. Со сборкой и компиляцией проблем не возникло. Проблема появилась в том, что сама программа не может получить данные от метеосервиса. Если я ввожу api.openweathermap.org/data... в адресную строку браузера, то данные браузер получает. Те же данные, но запрошенные ЕСП32 отклика не получают. В монитор порта выводится сообщение: {"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."}. Но, ключи идентичны. Не пойму, в чем дело.
     
  13. issaom

    issaom Гуру

    Вы их сюда подставляете ?

    Код (C++):
    String openWeatherMapApiKey = ""; // ApiKey
    String cityID = ""; // ID города
     
  14. andr_us

    andr_us Нуб

    Да, сюда.
     
  15. issaom

    issaom Гуру

    Попробуйте этот вариант - он еще должен будет строку запроса погоды выкинуть в com порт - сравните её с Вашей
     

    Вложения:

  16. andr_us

    andr_us Нуб

    Спасибо, завтра попробую.
     
  17. andr_us

    andr_us Нуб

    Доброе утро! Попробовал. Результат тот же :(
    11:22:40.714 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    11:22:40.714 -> configsip: 0, SPIWP:0xee
    11:22:40.714 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    11:22:40.714 -> mode:DIO, clock div:1
    11:22:40.714 -> load:0x3fff0018,len:4
    11:22:40.714 -> load:0x3fff001c,len:1216
    11:22:40.714 -> ho 0 tail 12 room 4
    11:22:40.748 -> load:0x40078000,len:9720
    11:22:40.748 -> ho 0 tail 12 room 4
    11:22:40.748 -> load:0x40080400,len:6352
    11:22:40.748 -> entry 0x400806b8
    11:22:47.463 ->
    11:22:47.596 -> HTTP Response code: 401
    11:22:47.596 -> {"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."}
    11:25:27.599 ->
    11:25:27.901 -> HTTP Response code: 401
    11:25:27.901 -> {"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."}
    11:35:27.481 -> {"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."}
    11:35:27.617 -> HTTP Response code: 401
    11:35:27.617 -> {"cod":401, "message": "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."}
     
    Последнее редактирование: 16 янв 2021
  18. andr_us

    andr_us Нуб

    Все, наконец-то разобрался, в чем проблема. Я не редактировал строку, следующую за: // Формируем строку для получения API (строка №157). Думал, что она формируется программно. Однако, нет. Пришлось ее редактировать. И заработало.
     
  19. issaom

    issaom Гуру

    Ну... я х/з у меня она программно и формируется.... я её в своей программе не редактировал перед прошивкой....
     
  20. andr_us

    andr_us Нуб

    Тогда я не понимаю, почему данные не портируются в эту строку? Кстати, название города тоже. Пришлось его принудительно вписывать