完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
由于要做一个天气时钟,天气数据肯定要通过互联网获得,其中涉及到时钟的部分也用互联网去解决省掉一个ds1302时钟模块,并可以测试 学习api获取并解析的效果。
但是在学习过程中大量的百度搜索资料发现都是按照博主自己的情况写没有适合我的,因此将这次学习情况记录下来,经供参考。 硬件:ESP8266-12f 开发板:ESP8266 D1 mini 开发环境:arduino IDE 基础硬件配置不做分享,百度一大把,关键词:“如何在arduino上开发esp8266”。 软件部分:1.测试wifi拉取功能,从示例中拉取BasicHttpClient例程, WiFiMulti.addAP("SSID", "PASSWORD"); //修改wifi账号密码 if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) //将其中双引号部分替换成自己的api的网址 //如http://quan.suning.com/getSysTime.do,苏宁时间api 上传后即可打开串口获得数据,一般情况会获得如下信息, {"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"} 即代表单片机成功从网络上获取到信息。 2.解析数据 通过arduino库安装器,安装arduinoJson库(不会装的百度“如何安装arduinoJson库”),拉取例程 char json[] = "{"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}"; //此为要解析的Json格式数据, 这边有个坑,直接将api获得数据替换到里面发现编译错误,如{"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"},猜测是多个双引号发生了识别错误,因此这个库函数的作者在每个”之前加了。 const char* sensor = doc["sensor"]; long time = doc["time"]; double latitude = doc["data"][0]; double longitude = doc["data"][1]; //这是解析中最重要的部分, /*JSON格式一般为 * { * "XXXXX1":"xxxxxxx1", * "XXXXX2":"xxxxxxx2", * "XXXXX3":"xxxxxxx3", * "XXXXX4":"xxxxxxx4", * } (重要)* 解析需要xxxxxxx1数据的话,仅需const char* value = doc["XXXXX1"]; * 变量value中就存放着xxxxxxx1 * */ 3.api信息获取程序叠加Json解析程序 #include #include #include #include #include #include ESP8266WiFiMulti WiFiMulti; //ESP8266WiFiMulti 库函数实例化 可以允许简写WiFiMulti.xxx void setup(void) { Serial.begin(115200); //wifi初始化 WiFi.mode(WIFI_STA); WiFiMulti.addAP("kidscoding", "kidscoding123"); } void loop() { · if ((WiFiMulti.run() == WL_CONNECTED)) {//无线连接中... WiFiClient client; //初始化客户端 HTTPClient http; //HTTPClient库函数实例化 可以允许简写http.xxx if (http.begin(client, "http://quan.suning.com/getSysTime.do")) { http.GET(); //拉取网站信息 String payload = http.getString(); //拉取成字符串 StaticJsonDocument<200> doc; //json格式解析设置字符串长度 deserializeJson(doc, payload);//json格式解析设置 const char* sysTime1 = doc["sysTime1"]; /*JSON格式一般为 * { * "XXXXX1":"xxxxxxx1", * "XXXXX2":"xxxxxxx2", * "XXXXX3":"xxxxxxx3", * "XXXXX4":"xxxxxxx4", * } * 解析需要xxxxxxx1数据的话,仅需const char* value = doc["XXXXX1"]; * 变量value中就存放着xxxxxxx1 * */ Serial.println(sysTime1); http.end(); } delay(1000); } } 正常上传的话就可以获取当前时间信息,不过是一串的,还需要一个个分开。 |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1179浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 16:23 , Processed in 0.909618 second(s), Total 44, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号