【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】

上一篇文章,我们已经完成了WiFi模块、OLED模块、NTP模块的编写,本文将先对I2C协议进行相关补充,并且对天气时钟进行收尾。

I2C协议和SPI协议

I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)是两种常用的串行通信协议,主要用于微控制器与各种外设(如传感器、显示器、存储器等)之间的数据传输。

I2C(Inter-Integrated Circuit)

特点:

  1. 双线制:I2C使用两根线进行通信:数据线(SDA)和时钟线(SCL)。通过这两根线就可以实现多个设备之间的通信。
  2. 多主机和多从机:I2C支持多个主设备和多个从设备,主设备可以主动发起通信。
  3. 地址识别:每个I2C设备都有一个唯一的地址,主设备通过地址来选择要与之通信的从设备。
  4. 速度:常见的I2C速度为100 kHz(标准模式)和400 kHz(快速模式),某些设备支持更高的速度(如高速模式,最高可达3.4 MHz)。
  5. 应用场景:适合传感器、EEPROM等低速设备的连接,尤其是在引脚资源有限的情况下使用。

优点:

  • 线缆少,连接简单(只需两根线)。
  • 支持多个从设备,节省引脚资源。
  • 适用于短距离通信。

缺点:

  • 速度相对较慢,适合对速度要求不高的应用。
  • 由于使用了共享总线,可能会存在总线冲突的问题。

SPI(Serial Peripheral Interface)

特点:

  1. 多线制:SPI通常使用四根线进行通信:主设备输出(MOSI)、主设备输入(MISO)、时钟线(SCK)和从设备选择(SS)。每个从设备通常需要一个独立的SS线。
  2. 全双工通信:SPI支持全双工通信,主设备和从设备可以同时发送和接收数据。
  3. 速度:SPI的速度通常比I2C快,可以达到几MHz到几十MHz,具体取决于设备和连接方式。
  4. 应用场景:适合需要高速数据传输的设备,如SD卡、显示屏、ADC/DAC等。

优点:

  • 速度快,适合对速度要求较高的应用。
  • 简单的协议,易于实现。
  • 全双工通信,提高了数据传输效率。

缺点:

  • 需要更多的引脚,特别是在有多个从设备的情况下。
  • 不支持多主机,通常由一个主设备控制多个从设备。

天气模块

心知天气预报使用

使用心知天气预报可以通过自行创建项目的方式,获取私人API和城市等的专属ID,以获取准确的信息,以下是操作流程:

  1. 点击控制台
    请添加图片描述
  2. 点击申请添加免费产品
    请添加图片描述
  3. 产品创建完成后,复制API私钥(私人API)
    请添加图片描述
  4. 查看产品文档,此处我们功能较简单,使用v3版本即可,找到查看天气预报的网址
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以看到在预报网址上,我们只需要将变量key替换为自己的API_KEY、将变量location修改为对应的城市ID即可;同时我们只查询当天一天的天气,因此变量start应修改为0,变量days应修改为1;由于我们的数据从网站返回,并且返回结果是JSON格式的,因此我们需要对HTTPClient和JSON相关信息进行介绍

HTTPClient类介绍

HTTPClient 是一个用于在嵌入式系统(如Arduino、ESP8266、ESP32等)中进行HTTP通信的库。它提供了简单的接口来发送HTTP请求和接收响应,支持常见的HTTP方法,如GET、POST、PUT、DELETE等。以下是对 HTTPClient 的详细介绍:

主要功能

  1. HTTP请求:

    • 支持发送GET、POST、PUT、DELETE等HTTP请求。
    • 可以与HTTP和HTTPS(SSL/TLS)服务器通信。
  2. 请求头和参数:

    • 可以设置自定义HTTP请求头。
    • 支持发送带有参数的请求。
  3. 响应处理:

    • 能够接收和处理HTTP响应,包括响应码和响应体。
    • 提供方法来获取响应的内容长度、类型等信息。
  4. 连接管理:

    • 支持持久连接(Keep-Alive)以提高效率。
    • 提供方法来管理连接的生命周期。

常用函数

  • begin():

    • 初始化HTTP请求,指定目标URL和WiFiClient。
    • 可以重载以支持HTTPS和自定义端口。
  • addHeader():

    • 添加自定义HTTP请求头。
  • GET():

    • 发送HTTP GET请求,返回HTTP响应码。
  • POST():

    • 发送HTTP POST请求,带有可选的请求体。
  • PUT():

    • 发送HTTP PUT请求,带有可选的请求体。
  • DELETE():

    • 发送HTTP DELETE请求。
  • getString():

    • 获取HTTP响应体的内容作为字符串。
  • getStream():

    • 获取HTTP响应体的内容作为流,适合处理大数据。
  • end():

    • 结束HTTP请求,释放资源。

注意事项

  • 在使用 HTTPClient 时,确保设备已连接到网络。
  • 对于HTTPS请求,可能需要处理SSL证书验证。
  • HTTPClient 适合在资源受限的嵌入式环境中使用,但在处理大量数据时要注意内存管理。

JSON介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。以下是JSON的主要特点和用途:

  1. 简单易读

    • JSON使用键值对的形式来表示数据,结构清晰。这使得JSON非常直观,易于理解和使用。
  2. 轻量级

    • JSON格式简洁,数据量小,适合在网络上传输,尤其是在带宽有限的环境中。
  3. 广泛支持

    • 几乎所有现代编程语言(如Python、Java、C++、Ruby等)都提供了对JSON的解析和生成支持。
  4. 数据结构

    • JSON支持多种数据类型,包括字符串、数字、布尔值、数组、对象和null。通过这些基本类型,可以构建复杂的数据结构。
  5. 互操作性

    • JSON是语言无关的,这意味着不同的系统和应用程序可以使用JSON进行数据交换,而不必担心语言或平台的差异。
  6. 常见用途

    • JSON常用于Web应用程序中,作为客户端和服务器之间的数据交换格式。它也被广泛用于配置文件、数据存储和API通信中。

以下是一个简单的JSON示例:

{
   
   
    "name": "张三",
    "age": 30,
    "isStudent": false,
    "courses": ["数学", "物理"],
    "address": {
   
   
        "city": "北京",
        "postalCode": "100000"
    }
}

在这个示例中,JSON对象包含了一个人的基本信息,包括姓名、年龄、是否为学生、所选课程和地址。JSON的结构使得它非常适合表示层次化的数据。

deserializeJson函数介绍

deserializeJson 是 ArduinoJson 库中的一个函数,用于将 JSON 格式的字符串解析为 JSON 文档对象。该函数是处理 JSON 数据的核心工具,广泛用于嵌入式系统中,以便从网络、文件或其他数据源中读取和解析 JSON 数据。

函数原型

DeserializationError deserializeJson(JsonDocument& doc, const char* input);
DeserializationError deserializeJson(JsonDocument& doc, const String& input);
DeserializationError deserializeJson(JsonDocument& doc, Stream& input);
DeserializationError deserializeJson(JsonDocument& doc, char* input, size_t inputSize);

参数

  • JsonDocument& doc: 引用一个 JsonDocument 对象,用于存储解析后的 JSON 数据JsonDocument 可以是 StaticJsonDocumentDynamicJsonDocument,根据内存管理需求选择。

  • const char* input: 指向要解析的 JSON 字符串。

  • const String& input: Arduino String 对象,包含要解析的 JSON 数据。

  • Stream& input: Arduino Stream 对象,支持从流中读取 JSON 数据(如串口、网络流等)。

  • char* input, size_t inputSize: 指向 JSON 数据的字符数组及其大小。

返回值

  • DeserializationError: 返回一个 DeserializationError 对象,用于指示解析结果。可以通过 error.c_str() 获取错误信息。

常见错误

  • Ok: 解析成功。
  • InvalidInput: 输入数据无效或格式不正确。
  • NoMemory: JsonDocument 的容量不足以存储解析后的数据。

注意事项

  • 确保 JsonDocument 的大小足够大,以容纳解析后的数据。
  • StaticJsonDocument 使用静态内存分配,适合内存受限的环境;DynamicJsonDocument 使用动态内存分配,适合需要处理大数据的场合。
  • 在解析复杂或嵌套的 JSON 数据时,合理设置 JsonDocument
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值