【花雕学编程】Arduino JSON 之生成简单的 JSON 对象

在这里插入图片描述
《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino JSON 的全面详细科学解释

  1. Arduino 概述
    Arduino 是一个开源的电子原型平台,基于易用的硬件和软件。它由硬件(各种型号的 Arduino 板)和软件(Arduino IDE)组成,主要用于快速开发交互式项目。

  2. JSON 概述
    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但独立于语言,广泛用于 Web 应用和 IoT 设备之间的数据交换。

  3. Arduino JSON 的定义
    Arduino JSON 是指在 Arduino 平台上使用 JSON 格式进行数据交换和处理。通过 Arduino JSON 库,开发者可以轻松地在 Arduino 项目中解析和生成 JSON 数据。Arduino JSON是一个用于处理JSON数据的Arduino库,适用于嵌入式C++项目。它支持JSON的序列化和反序列化,能够在有限的内存环境中高效地解析和生成JSON数据。

  4. 关键特点:
    简单的API:Arduino JSON提供了直观的语法,使开发者能够轻松地处理对象和数组。
    序列化和反序列化:支持将JSON数据转换为字符串(序列化)和将字符串转换为JSON数据(反序列化)。
    输入过滤:可以过滤大型输入,只保留与应用程序相关的字段,从而节省内存。
    流式处理:支持从输入流(如串行端口、以太网连接等)中解析JSON数据。
    缩进输出:可以生成紧凑的JSON文档或美化的JSON文档。
    闪存字符串:可以直接使用存储在程序内存中的字符串(PROGMEM)。
    字符串去重:去重JSON文档中的字符串,减少内存消耗。
    隐式或显式转换:支持两种编码风格,可以选择隐式或显式转换。

  5. 主要功能
    数据解析: 从 JSON 字符串中提取数据。
    数据生成: 将数据转换为 JSON 格式的字符串。
    数据交换: 通过 JSON 格式与外部服务进行数据交换。

  6. 技术实现
    库支持: 使用 Arduino JSON 库(如 ArduinoJson)来解析和生成 JSON 数据。
    数据格式: JSON 数据格式包括对象(用花括号 {} 表示)和数组(用方括号 [] 表示),键值对用冒号 : 分隔。
    数据处理: 在 Arduino 上处理 JSON 数据,执行相应操作。

  7. 应用场景
    物联网(IoT): 与云平台进行数据交换。
    Web 服务: 与 Web API 进行数据交互。
    传感器数据: 处理和传输传感器数据。
    配置文件: 存储和读取配置信息。

  8. 开发工具
    Arduino IDE: 编写和上传代码到 Arduino 板。
    ArduinoJson 库: 提供 JSON 解析和生成的库。
    网络模块: 如 ESP8266、ESP32,用于连接互联网。

  9. 优势与挑战
    优势:
    轻量级: JSON 格式简洁,易于解析和生成。
    跨平台: 独立于语言,适用于多种开发环境。
    灵活性: 支持复杂的数据结构。
    挑战:
    内存限制: Arduino 内存有限,处理大 JSON 数据需优化。
    性能限制: 解析和生成 JSON 数据可能占用较多资源。
    数据安全: 需要确保数据完整性和安全性。

  10. 未来发展方向
    优化性能: 提高 JSON 解析和生成的效率。
    扩展功能: 支持更多的 JSON 特性(如 JSON Schema)。
    增强安全性: 提供数据加密和验证机制。

在这里插入图片描述
一、主要特点
轻量化与高效性
JSON(JavaScript Object Notation)作为轻量级数据交换格式,以键值对(Key-Value)结构组织数据,格式简洁且易于解析。
在Arduino等资源受限的嵌入式设备中,JSON的文本格式避免了二进制协议的复杂性,同时通过库(如ArduinoJson)优化内存占用和解析效率。
结构化与灵活性
JSON支持嵌套对象和数组,可灵活表示复杂数据关系。例如,传感器数据可嵌套为{“temperature”: 25.5, “humidity”: 60},或扩展为数组{“readings”: [25.5, 26.0, 25.8]}。
键值对的数据类型支持字符串、数字、布尔值等,满足多样化需求。
跨平台兼容性
JSON独立于编程语言,Arduino生成的JSON数据可直接被服务器、移动应用或其他设备解析,无需额外转换逻辑。

二、应用场景
物联网设备数据传输
示例:环境监测设备将温度、湿度等数据封装为JSON,通过Wi-Fi或MQTT协议发送至云端。
优势:统一的数据格式简化了设备与云平台的交互逻辑,便于后续数据存储与分析。
设备配置与控制
示例:用户通过手机APP发送JSON指令(如{“led”: “on”, “motor_speed”: 100})控制Arduino设备。
优势:JSON的键值对结构直观对应设备参数,降低了指令解析的复杂度。
传感器数据记录
示例:将多个传感器的数据打包为JSON字符串(如{“sensor1”: 1023, “sensor2”: 0.75})并存储至SD卡。
优势:JSON的结构化特性便于后续通过脚本或工具解析数据。
API交互
示例:Arduino设备调用第三方API时,需以JSON格式发送请求(如{“method”: “get_data”, “params”: {“id”: 1}})。
优势:JSON是Web API的标准数据格式,确保了跨平台兼容性。

三、注意事项
内存管理
问题:Arduino的内存有限,生成大型JSON对象可能导致堆栈溢出。
解决方案:
使用StaticJsonDocument(需预先分配固定内存)而非DynamicJsonDocument(动态分配内存)。
示例代码:

#include <ArduinoJson.h>
void setup() {
    Serial.begin(9600);
    StaticJsonDocument<200> doc; // 分配200字节内存
    doc["temperature"] = 25.5;
    doc["humidity"] = 60;
    serializeJson(doc, Serial); // 输出JSON字符串
}
void loop() {}

数据类型转换
问题:Arduino的数据类型(如int、float)需正确映射为JSON类型。
解决方案:
整数直接转换,浮点数需注意精度(如doc[“value”] = 3.14159)。
字符串需使用F()宏或PROGMEM存储在Flash中以节省RAM。
错误处理
问题:JSON解析或生成失败可能导致设备异常。
解决方案:
检查库函数的返回值(如serializeJson()返回的字节数)。
示例:

size_t n = serializeJson(doc, Serial);
if (n == 0) {
    Serial.println("JSON生成失败!");
}

性能优化
问题:频繁生成JSON可能占用较多CPU资源。
解决方案:
缓存常用数据,减少重复生成。
使用流式解析库(如JsonStreamingParser)处理大数据。

在这里插入图片描述
1、生成基本的JSON对象

#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
  
  // 创建一个JSON对象
  StaticJsonDocument<200> doc;
  doc["name"] = "Alice";
  doc["age"] = 30;
  doc["city"] = "New York";

  // 将JSON对象序列化为字符串
  String jsonString;
  serializeJson(doc, jsonString);
  
  Serial.println(jsonString); // 输出生成的JSON字符串
}

void loop() {
  // 不需要在循环中执行
}

要点解读
库的使用:使用ArduinoJson库方便地创建JSON对象,简化了JSON数据的处理。
静态文档:通过 StaticJsonDocument 创建一个固定大小的JSON对象,适合小型数据存储。
键值对设置:使用简单的语法设置键值对,便于理解和使用。
序列化功能:通过 serializeJson() 将JSON对象转换为字符串,方便后续传输或存储。
输出结果:在串口监视器中输出生成的JSON字符串,便于调试和验证。

2、生成包含数组的JSON对象

#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
  
  // 创建一个JSON对象
  StaticJsonDocument<300> doc;
  doc["name"] = "Bob";
  doc["age"] = 25;

  // 创建一个JSON数组
  JsonArray hobbies = doc.createNestedArray("hobbies");
  hobbies.add("reading");
  hobbies.add("gaming");
  hobbies.add("hiking");

  // 将JSON对象序列化为字符串
  String jsonString;
  serializeJson(doc, jsonString);
  
  Serial.println(jsonString); // 输出生成的JSON字符串
}

void loop() {
  // 不需要在循环中执行
}

要点解读
嵌套数组:使用 createNestedArray() 方法创建一个嵌套数组,便于组织多个相关数据。
键值对与数组结合:可以在同一个JSON对象中同时使用键值对和数组,灵活性强。
数组元素添加:使用 add() 方法添加数组元素,操作简单明了。
序列化输出:将整个JSON对象序列化为字符串,方便传输和存储。
增强数据结构:通过包含数组,能够更好地表示复杂数据结构。

3、生成带有嵌套对象的JSON

#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
  
  // 创建一个JSON对象
  StaticJsonDocument<400> doc;
  doc["name"] = "Charlie";
  doc["age"] = 28;

  // 创建嵌套对象
  JsonObject address = doc.createNestedObject("address");
  address["street"] = "123 Main St";
  address["city"] = "Los Angeles";
  address["zip"] = "90001";

  // 将JSON对象序列化为字符串
  String jsonString;
  serializeJson(doc, jsonString);
  
  Serial.println(jsonString); // 输出生成的JSON字符串
}

void loop() {
  // 不需要在循环中执行
}

要点解读
嵌套对象:使用 createNestedObject() 方法创建嵌套对象,能够更好地组织相关数据。
层次结构:通过嵌套对象的方式,能够表示更复杂的数据结构,如地址信息。
灵活性:可以在JSON对象中灵活添加多个嵌套对象,适应不同的数据需求。
序列化功能:将整个JSON结构序列化为字符串,方便进行网络传输或文件存储。
易于扩展:可以根据需要继续添加更多嵌套对象或数组,增强数据表达能力。

在这里插入图片描述

4、传感器数据采集

#include <ArduinoJson.h>

void setup() {
  Serial.begin(9600);

  // 创建一个JSON对象
  StaticJsonDocument<200> doc;
  
  // 添加传感器数据到JSON对象
  doc["sensor"] = "temperature";
  doc["value"] = 25.5;

  // 将JSON对象序列化为字符串并输出到串口
  serializeJson(doc, Serial);
}

void loop() {
  // 无需循环执行任何操作
}

要点解读:这个示例展示了如何在Arduino中使用Arduino JSON库创建一个简单的JSON对象,包含传感器数据(温度值)。然后将该JSON对象序列化为字符串,并通过串口输出。

5、控制器状态报告

#include <ArduinoJson.h>

void setup() {
  Serial.begin(9600);

  // 创建一个JSON对象
  StaticJsonDocument<200> doc;
  
  // 添加控制器状态到JSON对象
  doc["controller"] = "Arduino";
  doc["status"] = "active";

  // 将JSON对象序列化为字符串并输出到串口
  serializeJson(doc, Serial);
}

void loop() {
  // 无需循环执行任何操作
}

要点解读:这个示例展示了如何使用Arduino JSON库创建一个包含控制器状态报告的JSON对象。这个JSON对象同样被序列化为字符串,并通过串口输出。

6、设备信息上报

#include <ArduinoJson.h>

void setup() {
  Serial.begin(9600);

  // 创建一个JSON对象
  StaticJsonDocument<200> doc;
  
  // 添加设备信息到JSON对象
  doc["device"] = "Arduino Nano";
  doc["version"] = "v1.0";

  // 将JSON对象序列化为字符串并输出到串口
  serializeJson(doc, Serial);
}

void loop() {
  // 无需循环执行任何操作
}

要点解读:这个示例展示了如何使用Arduino JSON库创建一个包含设备信息的JSON对象。同样地,JSON对象被序列化为字符串,并通过串口输出。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值