乐鑫技术交流
直播中

汪潇潇

7年用户 806经验值
私信 关注
[问答]

如何使用Openweathermap和0.96英寸oled来制作一个小气象站?

我是 ESP8266 的新手。我想通过使用 Openweathermap 和 0.96 英寸 oled 来尝试一个小气象站。当我尝试编译代码时,出现此错误。怎么了?
调用使用属性错误声明的“HTTPClient::begin”:过时的 API,使用 ::begin(WiFiClient, url)

回帖(1)

chumowei

2024-1-13 14:58:19
这个错误是因为HTTPClient库最近进行了更新,使用旧版API会导致错误。您需要更新您的代码,以使用新的HTTPClient API。您可以使用以下代码:

```c++
#include
#include
#include
#include
#include

#define OLED_RESET 0
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

String city = "your_city_name"; // the city name you want weather data for
String country = "your_country_code"; // the country code of the city you want weather data for, e.g. "US"

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Weather for");
  display.setCursor(0,10);
  display.println(city);
  display.setCursor(0,20);
  display.println(country);
  display.setCursor(0,30);
  display.println("Loading...");
  display.display();
}

void loop() {
  HTTPClient http;
  String url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + country + "&units=metric&APPID=your_API_key";
  http.begin(url);

  int httpCode = http.GET();
  if (httpCode > 0) {
    String payload = http.getString();
    Serial.println(payload);

    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Temp:" + (String) getTemperature(payload) + "C");
    display.setCursor(0, 10);
    display.println("Humidity:" + (String) getHumidity(payload) + "%");
    display.setCursor(0, 20);
    display.println("Pressure:" + (String) getPressure(payload) + "hPa");
    display.setCursor(0, 30);
    display.println("Weather:" + getWeather(payload));
    display.display();

  } else {
    Serial.println("Error getting weather data.");
  }

  http.end();
  delay(60000); // update every minute
}

float getTemperature(String payload) {
  int start = payload.indexOf(""temp":") + 7;
  int end = payload.indexOf(",",start);
  return (payload.substring(start,end).toFloat());
}

float getHumidity(String payload) {
  int start = payload.indexOf(""humidity":") + 11;
  int end = payload.indexOf(",",start);
  return (payload.substring(start,end).toFloat());
}

float getPressure(String payload) {
  int start = payload.indexOf(""pressure":") + 11;
  int end = payload.indexOf(",",start);
  return (payload.substring(start,end).toFloat());
}

String getWeather(String payload) {
  int start = payload.indexOf("description":"") + 14;
  int end = payload.indexOf(""",start);
  return payload.substring(start,end);
}
```

注意,您需要替换代码中的“your_SSID”和“your_PASSWORD”以与您的网络连接匹配,还需要将“your_city_name”和“your_country_code”更改为您所需的城市和国家代码。您还需要提供一个Openweathermap API密钥,可以在Openweathermap网站上注册以获取此密钥。替换“your_API_key”以使用您的API密钥。

这段代码使用HTTPClient库从Openweathermap API获取实时天气数据,并将其显示在0.96英寸OLED屏幕上。代码中的getTemperature,getHumidity,getPressure和getWeather函数从API响应中提取相应的值。此代码将每分钟更新一次屏幕内容,以获取最新的天气信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分