查看: 1151|回复: 14

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

[复制链接]
  • TA的每日心情
    郁闷
    2019-10-7 01:57
  • 签到天数: 50 天

    [LV.5]常住居民I

    发表于 2019-7-28 11:56 | 显示全部楼层 |阅读模式
    本帖最后由 zjssun 于 2019-9-7 18:50 编辑

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

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


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


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

    kittenblock中小学创客名师推荐的图形化编程软件

    StaticJsonDocument <200> doc;
    
    DynamicJsonDocument doc (200);

    其中<>和()内的数字是指定内存池的容量,容量指的是分析的Json数据,数据可以的到
    ArduinoJson助手里计算数据大小https://arduinojson.org/v6/assistant/
    deserializeJson()该函数用来解析JSON输入并将结果放入JsonDocument.
       deserializeJson()有两个参数
        具体代码如下,假如有个Json数据data
       
    DeserializationError用来告诉我们为什么dserializeJson()desericalizeMsgPack()会失败    它是一个枚举型
        具体代码如下:
       

    kittenblock中小学创客名师推荐的图形化编程软件

    DeserializationError err = deserializeJson(doc, data);
    if (err) {
        Serial.print(F("deserializeJson() failed: "))
        Serial.println(err.c_str())
    }
    下面是一个基本的ArduinoJson6分析Json数据的代码

    kittenblock中小学创客名师推荐的图形化编程软件

    #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 = deseroalizeJson(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(){
    }

    下面是ArduinoJson5到ArduinoJson6的代码变化

    kittenblock中小学创客名师推荐的图形化编程软件

    //ArduinoJson5
    StaticJsonBuffer<200> jsonBuffer;

    kittenblock中小学创客名师推荐的图形化编程软件

    //ArduinoJson6
    StaticJsonDocument<200> doc;



    kittenblock中小学创客名师推荐的图形化编程软件

    //ArduinoJson 6
    DynamicJsonDocument doc(1024);



    在ArduinoJson6中用函数deserializeJson()来调用解析器,DeserializatopnError用来告诉解析失败的原因。
    [

    kittenblock中小学创客名师推荐的图形化编程软件

    //ArduinoJson5
    JsonObject& root = jsonBuffer.parseObject(json);
    if(!root.success()){
            Serial.println("parseObject() failed");
              return;
    }    

    kittenblock中小学创客名师推荐的图形化编程软件

    //ArduinoJason6
    DeserializationError error =  deserializeJson(doc,json);
    if(error)
    {
            Serial.print("..");
            Serial.println(error.c_str());//显示错误代码
            return;
    }


    root改为doc

    kittenblock中小学创客名师推荐的图形化编程软件

    //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


    kittenblock中小学创客名师推荐的图形化编程软件

    //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


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



    下面是ArduinoJson6结合Blinker获取天气的数据分析(arduino D1开发板测试)

    kittenblock中小学创客名师推荐的图形化编程软件

    #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);
    }


    效果图:
    捕获2.PNG

    最后附上ArduinoJson6的库: ArduinoJson-6.x.zip (340.68 KB, 下载次数: 7)
    觉得文章有帮助,可以请我吃甜甜圈
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

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

    回帖奖励 +3 金币

    呃呃呃。。。看不懂
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:04 | 显示全部楼层
    呃呃呃。。。看不懂x2
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:04 | 显示全部楼层
    呃呃呃。。。看不懂x3
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:05 | 显示全部楼层
    呃呃呃。。。看不懂x4
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:06 | 显示全部楼层
    呃呃呃。。。看不懂x5
  • TA的每日心情
    难过
    2019-10-4 14:19
  • 签到天数: 91 天

    [LV.6]常住居民II

    发表于 2019-7-28 17:07 | 显示全部楼层
    呃呃呃。。。看不懂x6
  • TA的每日心情
    擦汗
    2019-10-5 13:52
  • 签到天数: 111 天

    [LV.6]常住居民II

    发表于 2019-8-2 15:44 | 显示全部楼层
    学习下,正愁如何解析天气
    你今天的打赏,是我明天学习Arduino的动力!
  • TA的每日心情
    郁闷
    2019-10-7 01:57
  • 签到天数: 50 天

    [LV.5]常住居民I

     楼主| 发表于 2019-8-4 22:40 | 显示全部楼层
    谢谢大佬支持
    觉得文章有帮助,可以请我吃甜甜圈
  • TA的每日心情
    奋斗
    2019-8-25 00:01
  • 签到天数: 87 天

    [LV.6]常住居民II

    发表于 2019-8-4 23:48 | 显示全部楼层
    大佬牛逼!过来顶个贴,学习学习
    觉得好就打赏一下吧!!让我有动力继续写教程
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    Blink——Arduino的Hello World!
    Blink——Arduino的Hello
    本教程节选自《Arduino程序设计基础》 Arduino编程基础(零)——Blink,Arduino的He
    ATmega2560-16AU刷BootLoader好慢
    ATmega2560-16AU刷BootLoa
    各位朋友,ATmega2560-16AU刷BootLoader好慢,有没有比较快的办法,一块板子要5分钟左
    【Arduino】108种传感器模块系列实验(104)---MAX30102手腕心率
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表