利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)
前期准备:
注册心知天气,获取API密钥 https://www.seniverse.com
生成API请求地址,北京今天和未来4天的预报请求地址如下:
https://api.seniverse.com/v3/weather/daily.json?key=your_API
_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5
需要的库:
// Libraries
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
ArduinoJson提供的在线助手很好用,帮助生成很多解析代码。https://arduinojson.org/v5/assistant/
程序流程如下:
代码如下:
// Libraries
#include <ESP8266WiFi.h>
#include <ArduinoJson.h> //使用ArduinoJson库
// WiFi settings
const char* ssid = "***";
const char* password = "***";
// API server
const char* host = "api.seniverse.com";
void setup() {// SerialSerial.begin(115200);delay(10);// We start by connecting to a WiFi networkSerial.println();Serial.println();Serial.print("Connecting to WIFI");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}
void loop() {// Connect to APISerial.print("connecting to XinZhi");Serial.println(host);// Use WiFiClient class to create TCP connectionsWiFiClient client;const int httpPort = 80;if (!client.connect(host, httpPort)) {Serial.println("connection failed");return;}// We now create a URI for the requestString url = "/v3/weather/daily.json?key=your-key&location=shanghai&language=zh-Hans&unit=c&start=0&days=3";Serial.print("Requesting URL: ");Serial.println(url);// This will send the request to the serverclient.print(String("GET ") + url + " HTTP/1.1\r\n" +"Host: " + host + "\r\n" +"Connection: close\r\n\r\n");delay(100);// Read all the lines of the reply from server and print them to SerialString weather_data;while (client.available()) {String line = client.readStringUntil('\r');weather_data += line;}client.stop();Serial.println();Serial.println("closing connection");// Process weather_jsonSerial.println();//Serial.println("weather_data: ");// Serial.println(weather_data);// Convert to JSONString json_weather_data;int jsonIndex;for (int i = 0; i < weather_data.length(); i++) {if (weather_data[i] == '{') {jsonIndex = i;break;}}// Get JSON datajson_weather_data = weather_data.substring(jsonIndex);Serial.println();Serial.println("json_weather_data: ");Serial.println(json_weather_data);//利用arduinoJson库解析心知返回的json天气数据//可以利用 https://arduinojson.org/v5/assistant/ Arduinojson助手生成相关json解析代码 很方便!!!const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3 * JSON_OBJECT_SIZE(12) + 700;DynamicJsonBuffer jsonBuffer(capacity);const char* json = "{\"results\":[{\"location\":{\"id\":\"WTW3SJ5ZBJUY\",\"name\":\"上海\",\"country\":\"CN\",\"path\":\"上海,上海,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"daily\":[{\"date\":\"2019-02-11\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"阴\",\"code_night\":\"9\",\"high\":\"7\",\"low\":\"2\",\"precip\":\"\",\"wind_direction\":\"东北\",\"wind_direction_degree\":\"45\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2019-02-12\",\"text_day\":\"中雨\",\"code_day\":\"14\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"9\",\"low\":\"4\",\"precip\":\"\",\"wind_direction\":\"东\",\"wind_direction_degree\":\"90\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2019-02-13\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"中雨\",\"code_night\":\"14\",\"high\":\"10\",\"low\":\"7\",\"precip\":\"\",\"wind_direction\":\"东北\",\"wind_direction_degree\":\"45\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"}],\"last_update\":\"2019-02-11T08:00:00+08:00\"}]}";JsonObject& root = jsonBuffer.parseObject(json_weather_data);JsonObject& results_0 = root["results"][0];JsonObject& results_0_location = results_0["location"];const char* results_0_location_id = results_0_location["id"]; // "WTW3SJ5ZBJUY"const char* results_0_location_name = results_0_location["name"]; // "上海"const char* results_0_location_country = results_0_location["country"]; // "CN"const char* results_0_location_path = results_0_location["path"]; // "上海,上海,中国"const char* results_0_location_timezone = results_0_location["timezone"]; // "Asia/Shanghai"const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "+08:00"JsonArray& results_0_daily = results_0["daily"];JsonObject& results_0_daily_0 = results_0_daily[0];const char* results_0_daily_0_date = results_0_daily_0["date"]; // "2019-02-11"const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; // "多云"const char* results_0_daily_0_code_day = results_0_daily_0["code_day"]; // "4"const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; // "阴"const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; // "9"const char* results_0_daily_0_high = results_0_daily_0["high"]; // "7"const char* results_0_daily_0_low = results_0_daily_0["low"]; // "2"const char* results_0_daily_0_precip = results_0_daily_0["precip"]; // ""const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; // "东北"const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"]; // "45"const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"]; // "10"const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"]; // "2"JsonObject& results_0_daily_1 = results_0_daily[1];const char* results_0_daily_1_date = results_0_daily_1["date"]; // "2019-02-12"const char* results_0_daily_1_text_day = results_0_daily_1["text_day"]; // "中雨"const char* results_0_daily_1_code_day = results_0_daily_1["code_day"]; // "14"const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; // "小雨"const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; // "13"const char* results_0_daily_1_high = results_0_daily_1["high"]; // "9"const char* results_0_daily_1_low = results_0_daily_1["low"]; // "4"const char* results_0_daily_1_precip = results_0_daily_1["precip"]; // ""const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"]; // "东"const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; // "90"const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"]; // "10"const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"]; // "2"JsonObject& results_0_daily_2 = results_0_daily[2];const char* results_0_daily_2_date = results_0_daily_2["date"]; // "2019-02-13"const char* results_0_daily_2_text_day = results_0_daily_2["text_day"]; // "小雨"const char* results_0_daily_2_code_day = results_0_daily_2["code_day"]; // "13"const char* results_0_daily_2_text_night = results_0_daily_2["text_night"]; // "中雨"const char* results_0_daily_2_code_night = results_0_daily_2["code_night"]; // "14"const char* results_0_daily_2_high = results_0_daily_2["high"]; // "10"const char* results_0_daily_2_low = results_0_daily_2["low"]; // "7"const char* results_0_daily_2_precip = results_0_daily_2["precip"]; // ""const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; // "东北"const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; // "45"const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"]; // "10"const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; // "2"const char* results_0_last_update = results_0["last_update"]; // "2019-02-11T08:00:00+08:00" // Test if parsing succeeds.if (!root.success()) {Serial.println("parseObject() failed");return;}// .Serial.println();Serial.print("上海今天天气: ");Serial.println(results_0_daily_0_text_day);Serial.print("上海明天天气: ");Serial.println(results_0_daily_1_text_day);// Wait 5 secondsdelay(5000);
}
后续增加:
利用液晶屏显示天气信息
利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)相关推荐
- STM32使用ESP8266模块AT指令连接心知天气API获取天气信息
由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...
- Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...
- c语言获取天气信息示例(通过心知天气api获取)
关于curl/curl.h库的使用,参考下述内容: VS2010编译libcurl库并简单使用(c语言)_西晋的no1的博客-CSDN博客 1.先在心知天气注册,获取私钥: https://www. ...
- 心知天气api接口怎么用?
心知天气是什么?心知天气提供API吗? 心知天气是国内领先的气象服务商,由中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据.天气监控机器人.气象数据可视化产品, ...
- 心知天气api,根据城市名/id查询天气
心知天气api可以根据城市名/id查询天气,向开发者提供的准确.稳定.丰富的天气数据云服务. 接口名称:心知天气api 接口平台:聚合数据 接口地址:http://v.juhe.cn/weather/ ...
- 心知天气API如何调用与json数据如何显示
心知天气官网:https://www.seniverse.com/doc 首先需要注册获得密钥和ID. 因为我不是会员,这里就简单介绍下,怎么调用并显示. Json数据如下图所示: { results ...
- Android实现-心知天气API接口开发(天气预报app)
自己开发app之心知天气APP程序代码粘贴即可用.完整代码附最后. 一.环境配置和素材准备 第一步:去知心天气注册开发者账号查看自己的token.注册好登录进去--控制台---免费版--秘钥.这里的秘 ...
- 【python】必应api获取壁纸信息+修改桌面+倒计时显示
1.0版本 一.获取壁纸路径 使用request对必应壁纸的api进行访问,获取图片路径,并下载到本地,api地址的说明参考:starsion大佬的文章 顺便做了个封装,代码如下所示: 其中: 1.d ...
- 树莓派搭建Blynk(国外开源物联网平台)+esp8266(airkiss)连接blink+esp8266获取温湿度获取心知天气,获取ntc时间通过u8g2库驱动ssd1306_oled9.6显示
下面的教程都是实测可以运行的,过程中查询借阅了好多大佬的经验,本着分享的精神如果能让后来人在这些基础事情上少浪费一些时间或者能够给予一些启发,那我的目的也就达到啦~ 一.树莓派搭建本地Blynk服务器 ...
最新文章
- 荣获CHINA TOP cited paper award 2021的神经工程领域顶级期刊的论文汇总
- WebConfig 加密解密的原理是什么?
- 莫烦Pytorch神经网络第三章代码修改
- Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError ClassNotFoundException
- 50个Android开发技巧(02 延迟载入和避免反复渲染视图)
- 终级免杀之PcShare Vs KV2006
- 5款cpu温度检测工具,让你时刻关注mac的工作情况!
- js跨域问题 ajax跨域问题?
- HTML5教程7-实战:调色板
- 复合梯形公式matlab代码,复合梯形公式
- 第10节 文件共享服务器—创建/访问共享文件及禁用共享服务
- 1389: 程序员PIPI II
- python图片水印
- 部落卫队 2281
- 谷歌浏览器将ssd盘上的缓存目录迁移至机械硬盘
- Word Embeddings 学习笔记
- google财经板块股票信息查看的猜想
- 【Paper】A Comparative Evaluation of Unsupervised Anomaly Detection Algorithms for Multivariate Data
- Kevgir(Kevg)通关记录
- 浅谈一下如何进行一次数据调研
热门文章
- iPhone X搭载3D感测功能,VCSEL是个什么鬼?
- ubutun 滑动 触控板_Ubuntu下触控板手势调节软件xSwipe
- scratch设计跑酷游戏_我如何使用Scratch设计游戏
- 浏览器查找文献\论文\资料\文档的小技巧
- Qt 之 事件总线模型
- win远程桌面连接无显示器Ubuntu(22.04.1 LTS)
- Android之APP跳转到权限设置界面适配华为、小米、vivo等
- 表白套路计算机公式,数学情话大全浪漫情话套路句子 数学情话表白公式短句说说合集...
- Vue项目实战——实现一个任务清单(学以致用,两小时带你巩固和强化Vue知识点)
- 微信小程序:页面传递中文出现乱码