查看: 1609|回复: 18

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

[复制链接]
发表于 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, 下载次数: 18)
发表于 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 | 显示全部楼层
大佬牛逼!过来顶个贴,学习学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Blynk与m5stack basic以及uiflow的交互玩法
Blynk与m5stack basic以及
Blynk与m5stack basic以及uiflow的交互玩法 [准备工作我们假设玩家已经熟悉下面的准备
足彩
足彩
喜欢足彩的可以找我 实力收米 百分百惊喜
编译出现open NUL: The system cannot find the file specified
编译出现open NUL: The sy
电脑系统win10,新装IDE1.8.1版本出现编译不过的问题,提示open NUL: The system canno
Arduino Ter什么时候上市购买
Arduino Ter什么时候上市
一直没人问 那我就来问问好了 深爱 Arduino 但目前的开发板资源有限 简单的就比如现有
Arduino MEGA 与UNO 通过nRF24L模块通讯
Arduino MEGA 与UNO 通过n
之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表