ESP8266获取天气预报信息,并使用CJSON解析天气预报数据

这篇具有很好参考价值的文章主要介绍了ESP8266获取天气预报信息,并使用CJSON解析天气预报数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实现功能

当前文章介绍如何使用ESP8266和STM32微控制器,搭配OLED显示屏,制作一个能够实时显示天气预报的智能设备。将使用心知天气API来获取天气数据,并使用MQTT协议将数据传递给STM32控制器,最终在OLED显示屏上显示。

心知天气是一家专业的气象数据服务提供商,致力于为全球用户提供高质量、定制化的气象数据服务。其主要产品包括天气API、空气质量API、灾害预警API等。用户可以通过心知天气的API接口,获取准确、实时的天气数据,从而为各种应用场景提供支持,例如智能家居、出行、电商等。心知天气的数据覆盖全球200多个国家和地区,每日处理超过10亿次API请求,是业内领先的气象数据服务提供商之一。
https://www.seniverse.com/

ESP8266获取天气预报信息,并使用CJSON解析天气预报数据

二、硬件准备

1. ESP8266模块

ESP8266是一款WiFi模块,它具有强大的网络连接功能,可以轻松地连接到互联网。将使用ESP8266模块来获取天气数据,并将其发送给STM32控制器。具体来说,我们将使用正点原子ATK-ESP8266模块,这是一款集成ESP8266芯片的小板子。

2. STM32微控制器

STM32是一款强大的32位微控制器,具有多种接口和功能。将使用STM32F103C8T6控制器,这是一款非常流行的型号,易于获得且价格较为合理。

3. OLED显示屏

OLED是一种非常流行的显示技术,具有高对比度、低功耗、快速响应等优点。将使用0.96英寸128x64像素的OLED显示屏。

三、CJSON解析天气预报数据

3.1 接口返回的数据

{
  "results": [
    {
      "location": {
        "id": "WTEMH46Z5N09",
        "name": "合肥",
        "country": "CN",
        "path": "合肥,合肥,安徽,中国",
        "timezone": "Asia/Shanghai",
        "timezone_offset": "+08:00"
      },
      "now": {
        "text": "阴",
        "code": "9",
        "temperature": "12",
        "feels_like": "18",
        "pressure": "1000",
        "humidity": "89",
        "visibility": "12.0",
        "wind_direction": "西南",
        "wind_direction_degree": "245",
        "wind_speed": "19.0",
        "wind_scale": "3",
        "clouds": "85",
        "dew_point": ""
      },
      "last_update": "2023-04-04T14:20:13+08:00"
    }
  ]
}

3.2 CJSON是什么

CJSON是一款轻量级的C语言JSON解析器,其全称是“cJSON”,由Dave Gamble编写。它简单易用,可嵌入到C应用程序中,既支持JSON字符串的解析,也支持JSON对象的创建及操作。CJSON不依赖于任何其他的库或组件,使用它只需要引入其头文件即可。

CJSON的使用方式相对来说比较简单,需要进行以下几个步骤:

1. 在应用程序中包含cJSON的头文件:#include "cJSON.h"2. 调用cJSON_Parse函数,将JSON字符串转换为CJSON对象。
3. 使用cJSON提供的API函数对CJSON对象进行操作,包括读取、修改、删除、添加等。
4. 在程序结束时,记得释放cJSON对象的内存空间,避免内存泄漏。

CJSON的解析速度相对较快,占用的内存开销也比较小,因此非常适用于资源有限的嵌入式系统中使用。

3.3 解析数据

使用CJSON解析上述JSON数据非常简单,只需要按照以下步骤操作:

  1. 引入CJSON库文件
#include <cJSON.h>
  1. 解析JSON数据并创建cJSON对象
char* json_data = "{\"results\":[{\"location\":{\"id\":\"WTEMH46Z5N09\",\"name\":\"合肥\",\"country\":\"CN\",\"path\":\"合肥,合肥,安徽,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"now\":{\"text\":\"阴\",\"code\":\"9\",\"temperature\":\"12\",\"feels_like\":\"18\",\"pressure\":\"1000\",\"humidity\":\"89\",\"visibility\":\"12.0\",\"wind_direction\":\"西南\",\"wind_direction_degree\":\"245\",\"wind_speed\":\"19.0\",\"wind_scale\":\"3\",\"clouds\":\"85\",\"dew_point\":\"\"},\"last_update\":\"2023-04-04T14:20:13+08:00\"}]}";
cJSON* root = cJSON_Parse(json_data);

在这个代码片段中,我们首先定义了一个字符串类型的变量json_data,用于存储上述JSON数据。然后,我们调用cJSON_Parse()函数来解析JSON数据,并将解析结果保存在root指针所指向的cJSON对象中。

  1. 从cJSON对象中提取数据
cJSON* location = cJSON_GetObjectItem(root, "location");
char* city = cJSON_GetObjectItem(location, "name")->valuestring;
cJSON* now = cJSON_GetObjectItem(root, "now");
int temperature = cJSON_GetObjectItem(now, "temperature")->valueint;
char* text = cJSON_GetObjectItem(now, "text")->valuestring;

在这个代码片段中,我们使用cJSON_GetObjectItem()函数从root指针所指向的cJSON对象中提取一个名为location的JSON对象,并从该JSON对象中获取名为name的字符串类型变量。类似地,我们也可以从root指针所指向的cJSON对象中提取名为now的JSON对象,并从该JSON对象中获取名为temperaturetext的整型和字符串类型变量。

  1. 释放cJSON对象
cJSON_Delete(root);

最后,我们需要释放之前创建的cJSON对象,以释放内存空间。

完整的代码示例如下:

#include <cJSON.h>
#include <stdio.h>

int main() {
    char* json_data = "{\"results\":[{\"location\":{\"id\":\"WTEMH46Z5N09\",\"name\":\"合肥\",\"country\":\"CN\",\"path\":\"合肥,合肥,安徽,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"now\":{\"text\":\"阴\",\"code\":\"9\",\"temperature\":\"12\",\"feels_like\":\"18\",\"pressure\":\"1000\",\"humidity\":\"89\",\"visibility\":\"12.0\",\"wind_direction\":\"西南\",\"wind_direction_degree\":\"245\",\"wind_speed\":\"19.0\",\"wind_scale\":\"3\",\"clouds\":\"85\",\"dew_point\":\"\"},\"last_update\":\"2023-04-04T14:20:13+08:00\"}]}";
    cJSON* root = cJSON_Parse(json_data);

    cJSON* location = cJSON_GetObjectItem(root, "location");
    char* city = cJSON_GetObjectItem(location, "name")->valuestring;
    cJSON* now = cJSON_GetObjectItem(root, "now");
    int temperature = cJSON_GetObjectItem(now, "temperature")->valueint;
    char* text = cJSON_GetObjectItem(now, "text")->valuestring;

    printf("City: %s\n", city);
    printf("Temperature: %d\n", temperature);
    printf("Weather: %s\n", text);

    cJSON_Delete(root);

    return 0;
}

在这个代码示例中,使用了cJSON_Parse()cJSON_GetObjectItem()cJSON_Delete()等函数来解析和处理JSON数据。

3.4 获取数据

下面是ESP8266访问HTTP接口请求的代码:

#include <SoftwareSerial.h>

// 定义ESP8266串口对象
SoftwareSerial esp8266(PA10, PA9); // RX, TX

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

  // 初始化ESP8266串口通信波特率为9600
  esp8266.begin(9600);

  // 发送AT指令测试ESP8266是否正常工作
  esp8266.println("AT");
  delay(500);
  if (esp8266.find("OK")) {
    Serial.println("ESP8266 is working properly.");
  } else {
    Serial.println("ESP8266 is not working properly.");
  }
}

void loop() {
  // 向ESP8266发送HTTP请求
  esp8266.println("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80");
  if (esp8266.find("OK")) {
    Serial.println("TCP connection established.");
  } else {
    Serial.println("TCP connection failed.");
  }

  String url = "/v3/weather/now.json?key=your_API_KEY&location=your_LOCATION";
  String request = "GET " + url + " HTTP/1.1\r\n" +
                   "Host: api.seniverse.com\r\n" +
                   "User-Agent: STM32/1.0\r\n" +
                   "Connection: close\r\n\r\n";
  int length = request.length();
  String cmd = "AT+CIPSEND=" + String(length);
  esp8266.println(cmd);
  if (esp8266.find(">")) {
    Serial.println("Sending HTTP request...");
    esp8266.print(request);
  } else {
    Serial.println("Failed to send HTTP request.");
  }

  // 接收HTTP响应
  while (esp8266.available()) {
    String response = esp8266.readStringUntil('\n');
    Serial.println(response);
  }

  // 关闭TCP连接
  esp8266.println("AT+CIPCLOSE");
  delay(1000);
}

在这个示例代码中,初始化了ESP8266串口对象,并通过发送AT指令测试ESP8266是否正常工作。然后,在loop()函数中,向ESP8266发送一个HTTP请求,包括请求头和请求体。发送完毕后,等待ESP8266返回HTTP响应并将其打印出来。最后,关闭TCP连接并等待一秒钟,然后重复上述步骤。文章来源地址https://www.toymoban.com/news/detail-496604.html

到了这里,关于ESP8266获取天气预报信息,并使用CJSON解析天气预报数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 003.0.96‘OLED+合宙ESP32C3+和风天气预报

    使用VScode platformio开发 1.oled显示 2.配置WIFI 3.得到B站粉丝数 4.使用json解析获得的粉丝数,显示到OLED 结构体 定义结构体 实例化结构体 WeatherData *data可以理解为 int *data,而*data则是指针,指针就是地址 todaymsg取出存放的数据,todaymsg相当于地址(指针),数据就存在这个地址中,

    2023年04月24日
    浏览(47)
  • 【雕爷学编程】Arduino智能家居之使用定时器获取未来三天的天气预报

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月04日
    浏览(44)
  • 《AIGC学习之 LangChain获取天气预报》

    1、把https://colab.research.google.com/drive/1zTTPYk51WvPV8GqFRO18kDe60clKW8VV 拷贝到自己的 drive   2、先运行 3、然后下拉到最下面 can throw errors based on API return length 原理是用自然语言问 OpenMeteo API 关于某个地区的天气。 得到长沙的天气是22.9°,可以打开天气预报查看,也是差不多这个温度

    2024年02月16日
    浏览(36)
  • Rust采集天气预报信息并实时更新数据

    最近天气温度时高时低,虽说这是大自然的力量人无法抗拒,不能改变那么我们就做预防工作。今天我将用Rust写一个爬虫程序实现电脑桌面实时更新天气情况,这个是一个底层逻辑,需要多方面配合,不仅要有完善的代码还有爬虫IP试试更新才能保证数据最完整最新。 这是一

    2024年01月19日
    浏览(48)
  • 微信小程序实战项目开发(天气预报项目实战):内涵开发说明文档、需求文档 && 手把手分步骤教你写出自己的小程序项目 && 天气预报小程序 && 时实请求获取天气 && 自定义功能 && 完整的源代码

    微信小程序开发实现天气预报 需求分析 静态页面设计 :要求界面美观 → 在wxss代码文件中对 wxml代码文件进行合理布局和美化,舒适的交互效果. 功能逻辑完善 :能够使用到 wx.request 请求接口实现天气预报查询的功能 主要使用到的技术栈如下: wxml:中使用了 picker 组件标签

    2024年02月02日
    浏览(67)
  • Vue中使用天气预报

    第一步 : 打开这个网站自己设置好想要的样式 和风天气插件 | 和风天气插件产品,免费、跨终端。适配你的网站、APP、公众号 一般选第一个就好 第二步 : 调整好样式 生成你的代码 最后记得点生成 第三步: 创建一个 新的组件(.vue文件) 在里面写入以下的代码 注意事项写

    2024年02月11日
    浏览(51)
  • 【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

    一、资料链接 1、github地址 https://github.com/qq1534774766/wx-push 2、教程地址 https://blog.csdn.net/qq15347747/article/details/126521774 3、易客云API(自动发送天气) https://yikeapi.com/account/index 4、apispace-各种接口(名人名言) https://www.apispace.com/console/api?orgId=6356 5、微信公众平台 https://mp.weixin.qq.com/d

    2024年02月02日
    浏览(47)
  • .NET7使用HttpClient实现查询天气预报接口

    朋友做网站需要根据城市展示天气预报,找了一圈没有找到靠谱的接口,今天在中央气象台的官网查询某个城市找到了接口,先用postman试了一下居然可以使用,可以查询某个城市7天的天气预报等信息。但是查询编码是气象台自己的编码,在网上搜索了一下居然有这个编码。

    2023年04月14日
    浏览(52)
  • ESP8266使用AT指令获取时间和心知天气

    一.硬件:ESP8266,USB TO TTL模块,软件:串口调试助手 二.在心知官网注册账号:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 三.连接esp8266和usb转ttl,打开串口调试助手 四.发送AT指令 1.复位模块 发送 AT+RST 返回 ready 2.测试AT指令 发送 AT 返回 OK 3.配置STA模式

    2024年02月04日
    浏览(60)
  • kotlin 编写一个简单的天气预报app (七)使用material design

    对之前的天气预报的app进行了优化,原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市,并请求openweathermap对应数据,并显示的功能。 但是搜索城市的时候,可能会有错误,比如大小写,比如拼写之类的,所以打算给他升级一下。 目标: 在搜索的时候需

    2024年04月27日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包