我是 ESP8266 的新手。我想通过使用 Openweathermap 和 0.96 英寸 oled 来尝试一个小气象站。当我尝试编译代码时,出现此错误。怎么了?
调用使用属性错误声明的“HTTPClient::begin”:过时的 API,使用 ::begin(WiFiClient, url)
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响应中提取相应的值。此代码将每分钟更新一次屏幕内容,以获取最新的天气信息。
这个错误是因为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响应中提取相应的值。此代码将每分钟更新一次屏幕内容,以获取最新的天气信息。
举报