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

zjssun 发表于 2019-7-28 11:56

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

本帖最后由 zjssun 于 2020-1-18 16:26 编辑

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

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


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


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

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

void setup() {
    Serial.begin(9600);
    const char* input = "{\"sensor\":\"gps\",\"time\":13518,\"data\":}";
   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"];
    float lot = doc["data"];
    Serial.println(sensor);
    Serial.println(time);
    Serial.println(lat, 6);
    Serial.println(lot, 6);
}
void loop(){
}
下面是ArduinoJson5到ArduinoJson6的代码变化

//ArduinoJson5
StaticJsonBuffer<200> jsonBuffer;//ArduinoJson6
StaticJsonDocument<200> doc;

//ArduinoJson 5
DynamicJsonBuffer jb;
//ArduinoJson 6
DynamicJsonDocument doc(1024);


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

root改为doc
//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

//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开发板测试)
#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);
}

效果图:


最后附上ArduinoJson6的库:











wangyirun 发表于 2019-7-28 17:03

呃呃呃。。。看不懂

wangyirun 发表于 2019-7-28 17:04

呃呃呃。。。看不懂x2

wangyirun 发表于 2019-7-28 17:04

呃呃呃。。。看不懂x3

wangyirun 发表于 2019-7-28 17:05

呃呃呃。。。看不懂x4

wangyirun 发表于 2019-7-28 17:06

呃呃呃。。。看不懂x5

wangyirun 发表于 2019-7-28 17:07

呃呃呃。。。看不懂x6

Creeper666 发表于 2019-8-2 15:44

学习下,正愁如何解析天气

zjssun 发表于 2019-8-4 22:40

谢谢大佬支持

新手之帆 发表于 2019-8-4 23:48

大佬牛逼!过来顶个贴,学习学习
页: [1] 2 3
查看完整版本: 【已更新】ArduinoJson6结合blinker分析获取weather数据