logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak odczytać pogodę z OpenWeatherMap na ESP32-S2 Arduino?

klon111 07 Lip 2024 20:15 1182 4
REKLAMA
  • #1 21146489
    klon111
    Poziom 11  
    Posty: 140
    Ocena: 23
    Proszę o pomoc z odcztem pogody z serwera na przeglądarce odczytuje ok
    void odczytSerPog() {  
      WiFiClient client;
        HTTPClient httpPP; 
    String serverName ="http://api.openweathermap.org/data/2.5/weather?lat=52.01...";
    httpPP.begin(client, serverName ); 
          welcome +=  httpPP.getString();
       
         WebSerial.println(welcome);
               httpPP.end(); 
     }

    Odczyt z przegladarki
    {
    "coord": {
    "lon": 23.1,
    "lat": 52.01
    },
    "weather": [
    {
    "id": 802,
    "main": "Clouds",
    "description": "zachmurzenie małe",
    "icon": "03d"
    }
    ],
    "base": "stations",
    "main": {
    "temp": 20.24,
    "feels_like": 20.64,
    "temp_min": 20.24,
    "temp_max": 20.24,
    "pressure": 1014,
    "humidity": 89,
    "sea_level": 1014,
    "grnd_level": 997
    },
    "visibility": 4885,
    "wind": {
    "speed": 3.85,
    "deg": 333,
    "gust": 7.98
    },
    "clouds": {
    "all": 47
    },
    "dt": 1720375922,
    "sys": {
    "country": "PL",
    "sunrise": 1720318618,
    "sunset": 1720378066
    },
    "timezone": 7200,
    "id": 776175,
    "name": "Biała Podlaska",
    "cod": 200
    }
  • REKLAMA
  • #2 21146592
    michal.zd
    Poziom 31  
    Posty: 1709
    Pomógł: 85
    Ocena: 279
    Arduino ma parser obiektów json. Zobacz przykład:
    https://arduinojson.org/v6/example/parser/

    Albo najprościej użyj metody String::find do znalezienia słowa "temp", dostaniesz pierwszy indeks, potem jeszcze raz find znajdź przecinek ale od tego indeksu z pierwszego finda. Będziesz miał indeksy początku i końca, indeks początku od razu przestaw o te sześć plus jeden na dwukropek znaków do przodu i wówczas metoda substring wytnij interesujący cię fragment.
    Odpisuję z tabletu, więc nie rzucę kodem.
  • REKLAMA
  • #3 21147022
    michal.zd
    Poziom 31  
    Posty: 1709
    Pomógł: 85
    Ocena: 279
    
    float getWetherTemperature(std::string json)
    {
        std::string temperature;
        int positionbeg;
        int positionend;
        
        positionbeg = json.find("\"temp\"");
        if(positionbeg == std::string::npos) return -100; // pozycja nie znaleziona
        
        // szukam delimitera kolejnych elementów w json,
        // moze nie być przecinka, jesli to ostatni element w obiekcie, wówczas będzie klamerka
        positionend = json.find(",", positionbeg);
        if(positionend == std::string::npos) positionend = json.find("}", positionbeg);
        if(positionend == std::string::npos) return -100; // błędny json
        if(positionbeg >= positionend) return -100; // błędny json
        
        // wycinam odpowiedni kawałek i usuwam nazwe zmiennej
        temperature = json.substr(positionbeg, (positionend - positionbeg) );
        positionbeg = temperature.find(":");
        if(positionbeg == std::string::npos) return -100; // pozycja nie znaleziona
        temperature = temperature.substr(++positionbeg);
         
        std::cout << "string temperature [" << temperature << "]" << std::endl;
        
        return std::stof(temperature);
    }
    


    to kod dla normalnej biblioteki string, Arduino ma swój odpowiednik, ale chyba takie metody ma.
  • REKLAMA
  • #5 21366603
    interim
    Poziom 8  
    Posty: 67
    Pomógł: 2
    Ocena: 7
    Można z Ocena, ale można też ze stacji pogodowej zlokalizowanej blisko miejsca zamieszkania. Zwykle dokładność jest wyższa. Dodatkowo możemy uzyskać dane o jakości powietrza, PM2,5, PM10 itd. Malutki skrypt Python.
REKLAMA