Глюки погодной станции на NodeMCU и OpenWeatherMap

Тема в разделе "ESP8266, ESP32", создана пользователем John_TheCF, 7 апр 2018.

  1. John_TheCF

    John_TheCF Нуб

    Сделал погодную станцию (пока что только получает данные о текущей погоде с OpenWeatherMap). При переключении "экранов" (в коде можно увидеть). Появляются вот такие артефакты, как на скриншоте. Скетч:
    Код (C++):
    #define MAXPAGE 2
    #define BUTTUP D5
    #define BUTTDOWN D4

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 20, 4);

    #include <ESP8266WiFi.h>
    #include <ESP8266HTTPClient.h>
    #include <ArduinoJson.h>

    const char* ssid     = "YourWiFi";
    const char* password = "wifipassword";
    const String server  = "api.openweathermap.org";
    const String lat     = "69";
    const String lon     = "69";
    const String appid   = "openweathermapkey";
    const String url     = "http://" + server + "/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&appid=" + appid;

    unsigned long lastConnectionTime = 0;
    unsigned long postingInterval = 1000;
    unsigned long lastpageupdate = 0;

    String httpData;

    struct weather_structure {
      unsigned int id;
      const char* main;
      const char* icon;
      const char* descript;
      float temp;
      float pressure;
      byte  humidity;
      float speed;
      float deg;
    };

    boolean swupdate = 0;
    boolean flagup = 0;
    boolean flagdown = 0;
    int maximum = MAXPAGE - 1;
    int page = 0;
    int lcdhumidity = 0;
     
    weather_structure weather;

    void setup() {
      pinMode(BUTTUP, INPUT);
      pinMode(BUTTDOWN, INPUT);
     
      lcd.init();
      lcd.backlight();
      lcd.setCursor(0, 0);
      lcd.print("Connecting to:");
      lcd.setCursor(0, 1);
      lcd.print(ssid);
      lcd.setCursor(0, 3);
      lcd.print("Please, wait...");
     
      Serial.begin(115200);
      Serial.print("\nConnecting to ");
      Serial.println(ssid);

      WiFi.begin(ssid, password);

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

      Serial.println("\nWiFi connected\nIP address: ");
      Serial.println(WiFi.localIP());
      Serial.println();
    }

    void loop() {
      if (WiFi.status() == WL_CONNECTED) {
        if (millis() < lastConnectionTime) lastConnectionTime = 0;
        if (millis() - lastConnectionTime > postingInterval or lastConnectionTime == 0) {
          if (httpRequest() and parseData()) {
            Serial.println("\nWeather");
            Serial.printf("id: %d\n", weather.id);
            Serial.printf("main: %s\n", weather.main);
            Serial.printf("description: %s\n", weather.descript);
            Serial.printf("icon: %s\n", weather.icon);
            Serial.printf("temp: %d celsius\n", round(weather.temp));
            Serial.printf("humidity: %d %\n", round(weather.humidity));
            Serial.printf("pressure: %d hPa or %d mmHg\n", round(weather.pressure), round(weather.pressure * 0.75));
            Serial.printf("wind's speed: %d\n", round(weather.speed));
            Serial.printf("wind's direction: %d\n", round(weather.deg));
            Serial.println();
            /*
             Available weather data:
             internet:
              weather.id Weather ID
              weather.main Main weather
              weather.descript Weather description
              weather.icon Weathter icon(?)
              weather.humidity Humidity
              weather.temp Air temperature in Celsius
              weather.pressure Air pressure in hPa (* 0.75 for mmHg)
              weather.speed Wind speed
              weather.deg Wind direction in degrees
             */

          }
        }
      }
      //buttons
      if (digitalRead(BUTTUP) == 1 && flagup == 0) {
        flagup = 1;
        page = page + 1;
        swupdate = 0;
      }
      else if (digitalRead(BUTTUP) == 0 && flagup == 1) {
        flagup = 0;
      }
      if (digitalRead(BUTTDOWN) == 1 && flagdown == 0) {
        flagdown = 1;
        page = page - 1;
        swupdate = 0;
      }
      else if (digitalRead(BUTTDOWN) == 0 && flagdown == 1) {
        flagdown = 0;
      }
      if (page > maximum) {
        page = 0;
      }
      if (page < 0) {
        page = maximum;
      }
      //page switching
      switch (page) {
        case 0:
          if (millis() - lastpageupdate >= 60000 || swupdate == 0) {
            swupdate = 1;
            lastpageupdate = millis();
            Serial.println(httpData);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Your_City weather");
            lcd.setCursor(0, 1);
            lcd.print("Temperature: ");
            lcd.setCursor(12, 1);
            Serial.println(weather.temp);
            lcd.print(weather.temp);
            lcd.print(" C");
            lcd.setCursor(0, 2);
            lcd.print("Wind: ");
            lcd.setCursor(6, 2);
            Serial.println(weather.speed);
            lcd.print(weather.speed);
            lcd.print(" m/sec");
            lcd.setCursor(0, 3);
            lcd.print("RH: ");
            Serial.println(weather.humidity);
            if (weather.humidity > 99) {
              lcdhumidity = 99;
            }
            else {
              lcdhumidity = round(weather.humidity);
            }
            Serial.println(lcdhumidity);
            lcd.print(lcdhumidity);
            lcd.print("%, ");
            Serial.println(weather.main);
            lcd.print(weather.main);
          }
          break;
        case 1:
          if (millis() - lastpageupdate >= 1000 || swupdate == 0) {
            swupdate = 1;
            lastpageupdate = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Hello World");
          }
          break;
        default:
          if (millis() - lastpageupdate >= 1000 || swupdate == 0) {
            swupdate = 1;
            lastpageupdate = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Invalid page number");
          }
          break;
      }
    }

    bool httpRequest() {
      HTTPClient client;
      bool find = false;
      //client.setTimeout(1000);
      Serial.print("Connecting ");
      client.begin(url);
      int httpCode = client.GET();

      if (httpCode > 0) {
        Serial.printf("successfully, code: %d\n", httpCode);
        if (httpCode == HTTP_CODE_OK) {
          httpData = client.getString();
          if (httpData.indexOf(F("\"main\":{\"temp\":")) > -1) {
            lastConnectionTime = millis();
            find = true;
          }
          else Serial.println("Failed, json string is not found");
        }
      }
      else Serial.printf("failed, error: %s\n", client.errorToString(httpCode).c_str());

      postingInterval = find ? 600L * 1000L : 60L * 1000L;
      client.end();

      return find;
    }

    bool parseData() {
      Serial.println(httpData);

      DynamicJsonBuffer jsonBuffer;
      JsonObject& root = jsonBuffer.parseObject(httpData);

      if (!root.success()) {
        Serial.println("Json parsing failed!");
        return false;
      }

      weather.id       = root["weather"][0]["id"];
      weather.main     = root["weather"][0]["main"];
      weather.descript = root["weather"][0]["description"];
      weather.icon     = root["weather"][0]["icon"];
      weather.temp     = root["main"]["temp"];
      weather.humidity = root["main"]["humidity"];
      weather.pressure = root["main"]["pressure"];
      weather.speed    = root["wind"]["speed"];
      weather.deg      = root["wind"]["deg"];

      httpData = "";
      return true;
    }
     
    Почему выводятся эти "артефакты" и как это исправить?
     

    Вложения: