ESP32-Ardunio 心知天气 hhtps 获取数据 +NTP对时
这里是用ESP32做了从机,一定周期打印 时间,天气数据。
编译环境是 vscode-PlatformIO
#include "Arduino.h"
#include <WiFi.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
// WiFi相关
const char *ssid = "233";
const char *password = "12345678";//心知天气 相关
String API = "SJ3cQqGjCfr2Ej1oS";
String CITY = "luoyang";// 定时器相关
u32_t cnt = 0;void Get_Now_Time() ; //NTP 获取当前时间/日期
void Get_Today_Weather(String api, String city) ;//https 获取当日天气
void Get_Rencent_Weather(String api, String city) ;//https 获取 今明后 三日天气void IRAM_ATTR Tim0_Handle(void) //定时器回调函数
{++cnt;if(cnt == 300) //五分钟一个循环{cnt =0;}
}void setup()
{Serial.begin(115200);Serial.println("串口初始化成功");hw_timer_t *tim0 = timerBegin(0, 8000, true); //建立定时器 //80MHZ 进行 8000预分频后 每秒 计数10000次timerAlarmWrite(tim0, 10000-1, true);//设置 自动重装载值 10000-1 timerAttachInterrupt(tim0, Tim0_Handle, true);//绑定定时器timerAlarmEnable(tim0);}void loop()
{switch (cnt) {case 3:if (WiFi.status() != WL_CONNECTED){WiFi.begin(ssid, password);vTaskDelay(100);}Serial.println("WiFi开启");++cnt;break;case 8:Serial.println("现在的时间是");Get_Now_Time();Serial.println("今天的天气是");Get_Today_Weather(API, CITY);Serial.println("近三天的天气是");Get_Rencent_Weather(API, CITY);++cnt;break;case 18:Serial.println("WiFi关闭");WiFi.disconnect(true); //关闭wifi ,降低功耗 WiFi.mode(WIFI_OFF);++cnt;default:break;}
}void Get_Now_Time()
{while (WiFi.status() != WL_CONNECTED){WiFi.begin(ssid, password);vTaskDelay(100);}configTime(3600 * 7, 3600, "us.pool.ntp.org");static struct tm timeinfo;if (!getLocalTime(&timeinfo)){if (!getLocalTime(&timeinfo))return;}Serial.println(&timeinfo, "#T-%Y-%m-%d-%w-%H:%M:%S");//我需要的 时间 年月日 + 星期几 + 时分秒vTaskDelay(2);
}
void Get_Today_Weather(String api, String city)
{while (WiFi.status() != WL_CONNECTED){WiFi.begin(ssid, password);vTaskDelay(100);}String url_xinzhi = "";url_xinzhi = "https://api.seniverse.com/v3/weather/now.json?key=";url_xinzhi += api;url_xinzhi += "&location=";url_xinzhi += city;url_xinzhi += "&language=en&unit=c";DynamicJsonDocument doc(2048); //分配内存,动态HTTPClient http;char data[100] = {"#w:"};http.begin(url_xinzhi);int httpGet = http.GET();if (httpGet > 0){if (httpGet == HTTP_CODE_OK){String json = http.getString();//Serial.println(json); //打印接受到的消息deserializeJson(doc, json);/* 从doc 中提取出 需要的数据 *//* code :天气码 temperature:气温 */strcat(data, doc["results"][0]["now"]["code"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["now"]["temperature"].as<const char *>());strcat(data, "$");Serial.println(data);//我需要的天气数据}}http.end();
}
void Get_Rencent_Weather(String api, String city)
{while (WiFi.status() != WL_CONNECTED){WiFi.begin(ssid, password);vTaskDelay(100);}String url_xinzhi = "";url_xinzhi = "https://api.seniverse.com/v3/weather/daily.json?key=";url_xinzhi += api;url_xinzhi += "&location=";url_xinzhi += city;url_xinzhi += "&language=en&unit=c";url_xinzhi += "&start=0&days=3";DynamicJsonDocument doc(2048); //分配内存,动态HTTPClient http;char data[100] = {"#W:"};http.begin(url_xinzhi);int httpGet = http.GET();if (httpGet > 0){if (httpGet == HTTP_CODE_OK){String json = http.getString();//Serial.println(json); //打印接收到的消息deserializeJson(doc, json);// JsonObject root = doc.as<JsonObject>();// JsonArray results = root["results"];// const char *a = results[0]["last_update"];// const char *b = results[0]["daily"][0]["text_day"];/* 从doc 中提取出 需要的数据 *//* code_day白天天气码,code_night晚上天气码 */strcat(data, doc["results"][0]["daily"][0]["code_day"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["daily"][1]["code_day"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["daily"][2]["code_day"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["daily"][0]["code_night"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["daily"][1]["code_night"].as<const char *>());strcat(data, ":");strcat(data, doc["results"][0]["daily"][2]["code_night"].as<const char *>());strcat(data, "$");Serial.println(data);}}http.end();
}/*BUG 如果程序编译没有报错, 并且烧录成功后,不止一次,多次弹出/打印出 下面文本这个其实就是 ESP32 Reset/复位时 会打印的信息
多次复位, 多为代码逻辑问题,引起了ESP32自动复位~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ets Jun 8 2016 00:22:57rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13132
load:0x40080400,len:3036
entry 0x400805e4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~如果是自带usb串口 的开发板,(烧录超级简单的示例程序 可以正常运行,说明板子一般是没问题的)那么可以肯定,(坚信不疑)一定(多数情况下)是: 代码的逻辑问题包括但不限于 变量生命周期错判,赋值时内存溢出,野指针,形参实参 数据类型错用,.........,看个人习惯了,这种错误一不留神就找出来了----------------------------------------------------------
检错步骤(建议):1.代码最好 功能化,模块化2.在 setup 函数第一句/最开始就 delay(5000);//延时5s3.在每一段代码块中,多设置例如Serial.println("标签 1.1 ##"); 的语句, 设置4.烧录完成后即刻打开串口,观察串口输出数据观察 自己设置的标签, 清楚知道程序运行到哪里了5.这时,突然打印出-上述文本-, 观察相隔最近的标签, 就是这附近出毛病了,6.修改完成成后,再次烧录运行,观察是否能正常运行到下一个标签处-------------------------------------------------------------------------分享下自己找了一天的bug,正常的String json = http.getString();deserializeJson(doc, json);错误的deserializeJson(doc, http.getString());可能原因:http.getString() 返回类型为 string算是个数组, c++/c 函数 返回 |函数内定义的| 数组类型数据,存不住,生命周期太短了,https://blog.csdn.net/qq_41989885/article/details/104932634
*/
心知天气返回数据 获取今日天气 url可以直接在 浏览器上面的访问框内输入这个 url,看看浏览器中显示的内容就是 返回数据https: //api.seniverse.com/v3/weather/now.json?key=SJ3cQqGjCfr2Ej1oS&location=luoyang&language=en&unit=c&start=0&days=5返回数据
HTTPGET is 200 //请求成功才返回下面数据{"results": [{"location": {"id": "WQPUYY7S4GV2","name": "Luoyang","country": "CN","path": "Luoyang,Luoyang,Henan,China","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"now": {"text": "Cloudy","code": "4","temperature": "29"},"last_update": "2022-08-02T12:34:30+08:00"}]
}获取今日起三天天气 url
//非vip用户最多获取近三日天气数据,记得自己注册一个心知天气账号,修改下 API ,也就是?可以直接在 浏览器上面的访问框内输入这个 url,看看浏览器中显示的内容就是 返回数据key=SJ3cQqGjCfr2Ej1oS ,这个要改称自己账号的API 私钥
https: //api.seniverse.com/v3/weather/now.json?key=SJ3cQqGjCfr2Ej1oS&location=luoyang&language=en&unit=c&start=0&days=3返回数据
HTTPGET is 200 //请求成功才返回下面数据{"results": [{"location": {"id": "WQPUYY7S4GV2","name": "Luoyang","country": "CN","path": "Luoyang,Luoyang,Henan,China","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"daily": [{"date": "2022-08-02","text_day": "Shower","code_day": "10","text_night": "Cloudy","code_night": "4","high": "34","low": "24","rainfall": "5.40","precip": "0.96","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "8.4","wind_scale": "2","humidity": "81"},{"date": "2022-08-03","text_day": "Shower","code_day": "10","text_night": "Cloudy","code_night": "4","high": "35","low": "25","rainfall": "5.40","precip": "0.96","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "8.4","wind_scale": "2","humidity": "84"},{"date": "2022-08-04","text_day": "Sunny","code_day": "0","text_night": "Clear","code_night": "1","high": "36","low": "26","rainfall": "0.00","precip": "0.00","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "3.0","wind_scale": "1","humidity": "83"}],"last_update": "2022-08-02T08:00:00+08:00"}]
}https: //api.seniverse.com/v3/weather/daily.json?key=SJ3cQqGjCfr2Ej1oS&location=luoyang&language=en&unit=c&start=0&days=5{"results": [{"location": {"id": "WQPUYY7S4GV2","name": "Luoyang","country": "CN","path": "Luoyang,Luoyang,Henan,China","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"now": {"text": "Cloudy","code": "4","temperature": "31"},"last_update": "2022-08-02T13:24:14+08:00"}]
}{"results": [{"location": {"id": "WQPUYY7S4GV2","name": "Luoyang","country": "CN","path": "Luoyang,Luoyang,Henan,China","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"daily": [{"date": "2022-08-02","text_day": "Shower","code_day": "10","text_night": "Cloudy","code_night": "4","high": "34","low": "24","rainfall": "5.40","precip": "0.96","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "8.4","wind_scale": "2","humidity": "81"},{"date": "2022-08-03","text_day": "Shower","code_day": "10","text_night": "Cloudy","code_night": "4","high": "35","low": "25","rainfall": "5.40","precip": "0.96","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "8.4","wind_scale": "2","humidity": "84"},{"date": "2022-08-04","text_day": "Sunny","code_day": "0","text_night": "Clear","code_night": "1","high": "36","low": "26","rainfall": "0.00","precip": "0.00","wind_direction": "SE","wind_direction_degree": "135","wind_speed": "3.0","wind_scale": "1","humidity": "83"}],"last_update": "2022-08-02T08:00:00+08:00"}]
}
还有一篇和这个有关
vscode Ardunio PlatformIO导入自己写的.c.h文件的正确方法_—=-_-=—的博客-CSDN博客
心知天气 常用接口:
天气实况 · 心知天气获取指定城市的天气实况。付费用户可获取全部数据,免费用...https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/nyiu3t
未来15天逐日天气预报和昨日天气 · 心知天气获取指定城市未来最多 15 天每天的白天和夜间预报,以...https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/sl6gvt
整点实况 · 心知天气获取全国所有市区县(3000+)的天气实况数据更新频率...https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/weather_obs
ESP32-Ardunio 心知天气 hhtps 获取数据 +NTP对时相关推荐
- 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)
前期准备: 注册心知天气,获取API密钥 https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...
- Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...
- 用cJSON解析心知天气返回的数据包
目录: 文章目录 调用天气API接口获取天气信息 解析天气信息字符串 测试结果 欢迎关注 后台网友留言,说参考这个链接 天气数据解析1–JSON格式数据 处理天气API接口返回的数据,中间遇到了点问题 ...
- STM32使用ESP8266模块AT指令连接心知天气API获取天气信息
由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...
- c语言获取天气信息示例(通过心知天气api获取)
关于curl/curl.h库的使用,参考下述内容: VS2010编译libcurl库并简单使用(c语言)_西晋的no1的博客-CSDN博客 1.先在心知天气注册,获取私钥: https://www. ...
- 树莓派搭建Blynk(国外开源物联网平台)+esp8266(airkiss)连接blink+esp8266获取温湿度获取心知天气,获取ntc时间通过u8g2库驱动ssd1306_oled9.6显示
下面的教程都是实测可以运行的,过程中查询借阅了好多大佬的经验,本着分享的精神如果能让后来人在这些基础事情上少浪费一些时间或者能够给予一些启发,那我的目的也就达到啦~ 一.树莓派搭建本地Blynk服务器 ...
- ESP32学习之JSON,和接入心知天气
注意:手机热点或者网络不能开5.0GHz频段和WIFI6,不然ESP32连不上 心知天气账号(免费版即可),网站:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 (seni ...
- ESP8266使用AT指令获取时间和心知天气
一.硬件:ESP8266,USB TO TTL模块,软件:串口调试助手 二.在心知官网注册账号:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 三.连接esp8266和us ...
- Esp8266 --深入分析官方json解析源码及如何使用json接口解析心知天气
什么是json? 懵逼回答:[参考菜鸟教程] a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) b.JSON 是轻量级的文本数据交 ...
- 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api
心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...
最新文章
- 阿里云首席科学家闵万里:我们为什么敢挑战一百年的制度,因为黑科技能为挽救生命抢来50%的可能性
- python图片的比例缩放、剪裁和下采样
- [转]Tomcat启动错误的几件事
- 一网打进Linux下那些查找命令
- 网域高科家具行业网站开发管理系统
- 如何进行并发测试_如何对网站进行测试?
- a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
- python列表去重函数_对python中两种列表元素去重函数性能的比较方法
- 【软件推荐】电脑控制手机软件Scrcpy
- android剪贴板数据来源,Android判断程序回到前台并获取剪贴板数据
- 国内外计算机视觉领域优秀研究团队汇总
- 算术平均数、几何平均数、调和平均数的、标准差、方差、正态分布、异常值噪声处理
- vc 写一个计算机功能,VC++的一个实例
- 在桌面计算机找不到光盘驱动,如何弹出DVD驱动器,没有按钮,我在计算机中找不到DVD驱动器...
- Qt设置鼠标光标样式
- 有一种爱 不能称之为爱情
- 2019年春节春晚红包大战战报!30亿!
- SQL Server 还原数据库
- 记录一次清理挖矿程序
- java基于微信小程序的电影院购票平台-计算机毕业设计