ARDUINO 天气示例

这篇博客探讨了使用ARDUINO制作天气示例的实践过程,通过weather.ino文件详细展示了如何利用Arduino硬件获取并显示天气信息,是Arduino初学者了解环境监测的好资源。

ARDUINO 天气示例
weather.ino

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <Ticker.h>
WiFiClient client;
const char* ssid= "";
const char* password = "";
const char* host = "api.seniverse.com";
const char* APIKEY = "S5qOkmmMqKgBvsQDa";
const char* city = "foshan";
const char* language = "zh-Hans";
const char* uni="c";
const unsigned long BAUD_RATE = 115200;
const unsigned long HTTP_TIMEOUT = 2100;
const size_t MAX_CONTENT_SIZE = 2048;
bool skipResponseHeaders() {
char endOfHeaders[] = "\r\n\r\n";
client.setTimeout(HTTP_TIMEOUT);
bool ok = client.find(endOfHeaders);
if (!ok) {
Serial.println("No response or invalid response!");
}
return ok;
}
bool sendRequest(const char* host, const char* cityid, const char* apiKey) {
String GetUrl = "/v3/weather/now.json?key=";
GetUrl+= apiKey;
GetUrl+= "&location=";
GetUrl+= city;
GetUrl+= "&language=";
GetUrl+= language;
GetUrl+= "&unit=";
GetUrl+= uni;
client.print(String("GET ")+GetUrl+" HTTP/1.1\r\n" +"Host: "+host+"\r\n"+"Connection: close\r\n\r\n");

return true;
}
void readReponseContent(String &str) {
//size_t length = client.peekBytes(content, maxSize);
//String str="";
while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
        {
            if (client.available()) //如果有数据可读取
            {
                str+=client.readStringUntil('\n'); //读取数据到换行符
              
            }
        }
         DynamicJsonDocument doc(1024); 
  deserializeJson(doc, str);
    JsonObject obj = doc.as<JsonObject>();
    int tmp=obj["results"][0]["now"]["temperature"];
    Serial.println(tmp);
Serial.println("Get the data from Internet!");
Serial.println("Read Over!");
}
struct UserData {
char city[16];
char cnty[16];
char weather[32];
char temp[16];
char feel[16];
char hum[16];
char visi[16];
char udate[32];
};
bool parseUserData(String str, struct UserData &userData) {
           return false;
            DynamicJsonDocument doc(1024); 
  deserializeJson(doc, str);
    JsonObject obj = doc.as<JsonObject>();
strcpy(userData.city, obj["results"][0]["location"]["name"]);
strcpy(userData.cnty, obj["results"][0]["location"]["country"]);
strcpy(userData.weather, obj["results"][0]["now"]["text"]);
strcpy(userData.temp, obj["results"][0]["now"]["temperature"]);
strcpy(userData.feel, obj["results"][0]["now"]["feels_like"]);
strcpy(userData.hum, obj["results"][0]["now"]["humidity"]);
strcpy(userData.visi, obj["results"][0]["now"]["visibility"]);
strcpy(userData.udate, obj["results"][0]["last_update"]);
return true;
}
void printUserData(const struct  UserData  &userData) {
Serial.println("Print parsed data :");
Serial.print("City : ");
Serial.print(userData.city);
Serial.print(", \t");
Serial.print("Country : ");
Serial.println(userData.cnty);
Serial.print("Weather : ");
Serial.print(userData.weather);
Serial.print(",\t");
Serial.print("Temp : ");
Serial.print(userData.temp);
Serial.print(" C");
Serial.print(",\t");
Serial.print("Feel : ");
Serial.print(userData.feel);
Serial.print(" C");
Serial.print(",\t");
Serial.print("Humidity : ");
Serial.print(userData.hum);
Serial.print(" %");
Serial.print(",\t");
Serial.print("visibility : ");
Serial.print(userData.visi);
Serial.println(" km");
Serial.print("Last Updata : ");
Serial.print(userData.udate);
Serial.println("");
}
void stopConnect() {
Serial.println("Disconnect");
client.stop();
}
void setup(){
WiFi.mode(WIFI_STA);
Serial.begin(BAUD_RATE );
Serial.println();
Serial.print("connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
delay(500);
if(!client.connect(host, 80)) {
Serial.println("connection failed");
return;
}

if (sendRequest(host, city, APIKEY) && skipResponseHeaders()) {
char response[MAX_CONTENT_SIZE];
String str="";
readReponseContent(str);
UserData userData={0};
if (parseUserData(str, userData)) {
printUserData(userData);
}
}
stopConnect();
}
void loop(){
//delay(3000);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值