【已更新】ArduinoJson6结合blinker分析获取weather数据-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13284|回复: 26

[分享] 【已更新】ArduinoJson6结合blinker分析获取weather数据

[复制链接]
发表于 2019-7-28 11:56 | 显示全部楼层 |阅读模式
本帖最后由 zjssun 于 2020-1-18 16:26 编辑

在Blinker最新版本的库中我们看到它用了ArduinoJson6,图中的两个类是ArduinoJson6的类 Inked捕获1_LI.jpg
首先我们看看ArduinoJson5到ArduinoJson6到底改变了什么类(部分)

我们熟悉的DynamicJsonBuffer ;StaticJsonBuffer ;分别变为DynamicJsonDocument;和StaticJsonDocument;


JasonBuffer被JasonDocument取代,JasonDocument可看作是JasonBuffer和JasonVariant的结合。


补充内用:
ArduinoJson基本知识点:
①JsonDocument包含一个固定大小的内存池,带有单调分配器,可以将JSON文档存储在内存中
JsonDocument它有两种形式分别是:储存在堆栈中的StaticJsonDocument和储存在堆中的DynamicJsonDocument.
设置代码分别如下 用时根据自己需要输入一个函数即可。
[mw_shl_code=arduino,true]StaticJsonDocument <200> doc;

DynamicJsonDocument doc (200);[/mw_shl_code]
其中<>和()内的数字是指定内存池的容量,容量指的是分析的Json数据,数据可以的到
ArduinoJson助手里计算数据大小https://arduinojson.org/v6/assistant/
deserializeJson()该函数用来解析JSON输入并将结果放入JsonDocument.
   deserializeJson()有两个参数
    具体代码如下,假如有个Json数据data
    [mw_shl_code=arduino,true]deserializeJson(doc, data);[/mw_shl_code]
DeserializationError用来告诉我们为什么dserializeJson()desericalizeMsgPack()会失败    它是一个枚举型
    具体代码如下:
    [mw_shl_code=arduino,true]DeserializationError err = deserializeJson(doc, data);
if (err) {
    Serial.print(F("deserializeJson() failed: "))
    Serial.println(err.c_str())
}[/mw_shl_code]下面是一个基本的ArduinoJson6分析Json数据的代码
[mw_shl_code=arduino,true]#include <ArduinoJson.h>

void setup() {
    Serial.begin(9600);
    const char* input = "{\"sensor\":\"gps\",\"time\":13518,\"data\":[48.000222,2.30000222]}";
     StaticJsonDocument<256> doc;
     DeserializationError abc = deseralizeJson(doc, input);
     if(abc){
           Serial.print("ERROR:");
           Serial.print(abc.c_str());
           return;
     }
    const char* sensor = doc["sensor"];
    long time = doc["time"];
    float lat = doc["data"][0];
    float lot = doc["data"][1];
    Serial.println(sensor);
    Serial.println(time);
    Serial.println(lat, 6);
    Serial.println(lot, 6);
}
void loop(){
}[/mw_shl_code]
下面是ArduinoJson5到ArduinoJson6的代码变化

[mw_shl_code=arduino,true]//ArduinoJson5
StaticJsonBuffer<200> jsonBuffer;[/mw_shl_code][mw_shl_code=arduino,true]//ArduinoJson6
StaticJsonDocument<200> doc;[/mw_shl_code]

[mw_shl_code=arduino,true]//ArduinoJson 5
DynamicJsonBuffer jb;[/mw_shl_code]
[mw_shl_code=arduino,true]//ArduinoJson 6
DynamicJsonDocument doc(1024);[/mw_shl_code]


在ArduinoJson6中用函数deserializeJson()来调用解析器,DeserializatopnError用来告诉解析失败的原因。
[[mw_shl_code=arduino,true]//ArduinoJson5
JsonObject& root = jsonBuffer.parseObject(json);
if(!root.success()){
        Serial.println("parseObject() failed");
          return;
}    [/mw_shl_code]
[mw_shl_code=arduino,true]//ArduinoJason6
DeserializationError error =  deserializeJson(doc,json);
if(error)
{
        Serial.print("..");
        Serial.println(error.c_str());//显示错误代码
        return;
}[/mw_shl_code]

root改为doc
[mw_shl_code=arduino,true]//ArduinoJson5
const char* cloud = root["cloud"]; // "0"
const char* cond_code = root["cond_code"]; // "101"
const char* cond_txt = root["cond_txt"]; // "多云"
const char* fl = root["fl"]; // "31"
const char* hum = root["hum"]; // "81[/mw_shl_code]

[mw_shl_code=arduino,true]//ArduinoJson6
const char* cloud = doc["cloud"]; // "0"
const char* cond_code = doc["cond_code"]; // "101"
const char* cond_txt = doc["cond_txt"]; // "多云"
const char* fl = doc["fl"]; // "31"
const char* hum = doc["hum"]; // "81[/mw_shl_code]

ArduinoJson5到ArduinoJson6 改变的东西我分享到这里,大家可以到这里了解更多信息☛☛☛ https://arduinojson.org/v6/doc/upgrade/        



下面是ArduinoJson6结合Blinker获取天气的数据分析(arduino D1开发板测试)
[mw_shl_code=arduino,true]#define BLINKER_WIFI
#include <ArduinoJson.h>
#include <Blinker.h>

char auth[] = "blinker密钥";
char ssid[] = "wifi账号";
char pswd[] = "wifi密码";


void weatherData(const String & data)
{
    BLINKER_LOG("weather: ", data);
   StaticJsonDocument<400> doc;
    DeserializationError error = deserializeJson(doc, data);
    if(error)
    {
      Serial.print("ERROR IS:");
      Serial.println(error.c_str());
      return;
    }
    const char* cloud = doc["cloud"]; // "0"
    const char* cond_code = doc["cond_code"]; // "101"
    const char* cond_txt = doc["cond_txt"]; // ""
    const char* fl = doc["fl"]; // "31"
    const char* hum = doc["hum"]; // "81"
    const char* pcpn = doc["pcpn"]; // "0.0"
    const char* pres = doc["pres"]; // "997"
    const char* tmp = doc["tmp"]; // "28"
    const char* vis = doc["vis"]; // "16"
    const char* wind_deg = doc["wind_deg"]; // "159"
    const char* wind_dir = doc["wind_dir"]; //
    const char* wind_sc = doc["wind_sc"]; // "2"
    const char* wind_spd = doc["wind_spd"]; // "9"  
    Serial.print("风向:");
    Serial.println(wind_dir);
    Serial.print("天气:");
    Serial.println(cond_txt);
}

         

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachWeather(weatherData);
}

void loop()
{
    Blinker.run();
    Blinker.weather("yunfu");
    Blinker.delay(500);
}[/mw_shl_code]

效果图:
捕获2.PNG

最后附上ArduinoJson6的库: ArduinoJson-6.x.zip (340.68 KB, 下载次数: 168)











发表于 2019-7-28 17:03 | 显示全部楼层

回帖奖励 +3 金币

呃呃呃。。。看不懂
发表于 2019-7-28 17:04 | 显示全部楼层
呃呃呃。。。看不懂x2
发表于 2019-7-28 17:04 | 显示全部楼层
呃呃呃。。。看不懂x3
发表于 2019-7-28 17:05 | 显示全部楼层
呃呃呃。。。看不懂x4
发表于 2019-7-28 17:06 | 显示全部楼层
呃呃呃。。。看不懂x5
发表于 2019-7-28 17:07 | 显示全部楼层
呃呃呃。。。看不懂x6
发表于 2019-8-2 15:44 | 显示全部楼层
学习下,正愁如何解析天气
 楼主| 发表于 2019-8-4 22:40 | 显示全部楼层
谢谢大佬支持
发表于 2019-8-4 23:48 | 显示全部楼层
大佬牛逼!过来顶个贴,学习学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:25 , Processed in 0.083268 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表