查看: 3271|回复: 21

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

[复制链接]
  • TA的每日心情
    奋斗
    2020-3-22 18:12
  • 签到天数: 62 天

    [LV.6]常住居民II

    发表于 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, 下载次数: 63)
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

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

    回帖奖励 +3 金币

    呃呃呃。。。看不懂
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:04 | 显示全部楼层
    呃呃呃。。。看不懂x2
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:04 | 显示全部楼层
    呃呃呃。。。看不懂x3
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:05 | 显示全部楼层
    呃呃呃。。。看不懂x4
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:06 | 显示全部楼层
    呃呃呃。。。看不懂x5
  • TA的每日心情
    无聊
    2020-5-11 15:55
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:07 | 显示全部楼层
    呃呃呃。。。看不懂x6
  • TA的每日心情
    郁闷
    2020-5-9 23:03
  • 签到天数: 201 天

    [LV.7]常住居民III

    发表于 2019-8-2 15:44 | 显示全部楼层
    学习下,正愁如何解析天气
  • TA的每日心情
    奋斗
    2020-3-22 18:12
  • 签到天数: 62 天

    [LV.6]常住居民II

     楼主| 发表于 2019-8-4 22:40 | 显示全部楼层
    谢谢大佬支持
  • TA的每日心情
    奋斗
    2019-12-31 18:42
  • 签到天数: 88 天

    [LV.6]常住居民II

    发表于 2019-8-4 23:48 | 显示全部楼层
    大佬牛逼!过来顶个贴,学习学习
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    esp8266-01s改造空调开关
    esp8266-01s改造空调开关
    最近在学习esp8266开发,esp8266是一款带wifi功能的物联网MCU,可以低成本实现
    [Arduino物联网开发实战2]数据反馈
    [Arduino物联网开发实战2]
    [md]上一篇:(https://www.arduino.cn/thread-83177-1-1.html) 除了控制设备外,blin
    这个拓展板上的LCD接口是什么类型的?怎么搜?
    这个拓展板上的LCD接口是
    如图。
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表