20 使用ESP32发送http请求,获取天气数据

文章作者:里海
来源网站:ESP32专栏


简介

    使用HTTPClient 库发送 HTTP 请求来获取实时天气数据,并使用ArduinoJSON 库解析 JSON 数据。
使用聚合数据的天气api。

效果

在这里插入图片描述

代码

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// LED灯的引脚
#define LED 2

// WiFi的ID和密码
String ssid = "K40";
String password = "12345678";

String url = "http://apis.juhe.cn/simpleWeather/query";
String city = "青岛";
String key = "你的key"; // 聚合数据 https://www.juhe.cn/

void setup()
{
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  // 断开WiFi连接
  WiFi.disconnect(true);
  // 尝试连接到指定的WiFi网络
  WiFi.begin(ssid.c_str(), password.c_str());
  // 循环检查WiFi是否已经成功连接
  while (WiFi.status() != WL_CONNECTED)
  {
    // 如果未连接成功,则控制LED灯持续慢速闪烁
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
  }
  // WiFi成功连接后,控制LED灯快速闪烁10次
  for (int i = 0; i < 10; i++)
  {
    digitalWrite(LED, HIGH);
    delay(50);
    digitalWrite(LED, LOW);
    delay(50);
  }
  // LED灯亮3秒钟后熄灭
  digitalWrite(LED, HIGH);
  delay(3000);
  digitalWrite(LED, LOW);

  // 创建 HTTPClient 对象
  HTTPClient http;

  // 发送GET请求
  url = url + "?city=" + city + "&key=" + key;
  http.begin(url.c_str());

  int httpCode = http.GET();

  
  // 获取响应状态码
  Serial.printf("HTTP 状态码: %d", httpCode);

  // 获取响应正文
  String response = http.getString();
  Serial.println("响应数据");

  Serial.println(response);

  http.end();

  // 创建 DynamicJsonDocument 对象
  DynamicJsonDocument doc(1024);

  // 解析 JSON 数据
  deserializeJson(doc, response);

  // 从解析后的 JSON 文档中获取值
  // 温度
  int temperature = doc["result"]["realtime"]["temperature"].as<int>();
  // 湿度
  unsigned int humidity = doc["result"]["realtime"]["humidity"].as<unsigned int>();
  // 天气
  String info = doc["result"]["realtime"]["info"].as<String>();
  // 风向
  String direct = doc["result"]["realtime"]["direct"].as<String>();
  // 风力
  String power = doc["result"]["realtime"]["power"].as<String>();
  // 空气指数
  unsigned int aqi = doc["result"]["realtime"]["aqi"].as<unsigned int>();

  Serial.printf("城市: %s
", city);
  Serial.printf("天气: %s
", info);
  Serial.printf("温度: %d
", temperature);
  Serial.printf("湿度: %d
", humidity);
  Serial.printf("风向: %s 风力%s
", direct,power);
  Serial.printf("空气指数: %d
", aqi);
}

void loop()
{
}

响应数据:

{
    "reason":"查询成功!",
    "result":{
        "city":"青岛",
        "realtime":{
            "temperature":"-7",
            "humidity":"61",
            "info":"多云",
            "wid":"01",
            "direct":"西北风",
            "power":"5级",
            "aqi":"22"
        },
        "future":[
            {
                "date":"2024-01-22",
                "temperature":"-7/-5℃",
                "weather":"阵雪转多云",
                "wid":{
                    "day":"13",
                    "night":"01"
                },
                "direct":"北风转西北风"
            },
            {
                "date":"2024-01-23",
                "temperature":"-8/-2℃",
                "weather":"多云转晴",
                "wid":{
                    "day":"01",
                    "night":"00"
                },
                "direct":"西北风"
            },
            {
                "date":"2024-01-24",
                "temperature":"-4/2℃",
                "weather":"晴",
                "wid":{
                    "day":"00",
                    "night":"00"
                },
                "direct":"西北风转北风"
            },
            {
                "date":"2024-01-25",
                "temperature":"-3/3℃",
                "weather":"晴",
                "wid":{
                    "day":"00",
                    "night":"00"
                },
                "direct":"西南风"
            },
            {
                "date":"2024-01-26",
                "temperature":"-2/6℃",
                "weather":"晴",
                "wid":{
                    "day":"00",
                    "night":"00"
                },
                "direct":"西南风"
            }
        ]
    },
    "error_code":0
}

在这里插入图片描述

什么是ESP32?

ESP32是近几年最受欢迎和最实用的模块之一。除了Wi-Fi模块,该模块还包含蓝牙4.0模块。双核CPU工作频率为80至240 MHz,包含两个Wi-Fi和蓝牙模块以及各种输入和输出引脚, ESP32是物联网项目的理想选择。
在这里插入图片描述

ESP32模块引脚分布

在这里插入图片描述
虽然ESP32的引脚数比常用的处理器少,但在引脚上复用多个功能时不会遇到任何问题。
警告:ESP32引脚的电压电平为3.3伏。如果要将ESP32连接到其他工作电压为5伏的设备,则应使用电平转换器转换电压电平。

  • 电源引脚:该模块有两个电源引脚 5V和3.3V。您可以使用这两个引脚来向其他设备和模块供电。
  • GND引脚:该模块的接地有3个引脚。
  • 启用引脚(EN):该引脚用于启用和禁用模块。引脚为高电平时启用模块,低电平禁用模块。
  • 输入/输出引脚(GPIO):您可以使用32个GPIO引脚与LED、开关和其他输入/输出设备进行通信。
    您可以在内部上拉或下拉这些引脚。
    注意:GPIO6至GPIO11引脚(SCK/CLK,SDO/SD0,SDI/SD1,SHD/SD2,SWP/SD3和SCS/CMD引脚)用于模块内部闪存的SPI通信,我们不建议使用它们。
  • ADC:您可以使用此模块上的16个ADC引脚将模拟电压(某些传感器的输出)转换为数字电压。其中一些转换器连接到内部放大器,能够以高精度测量小电压。
  • DAC:ESP32模块有两个数模转换器,精度为8位。
  • 触摸焊盘:ESP32模块上有10个引脚,对电容变化很敏感。您可以将这些引脚连接到某些焊盘(PCB上的焊盘),并将它们用作触摸开关。
  • SPI:该模块上有两个SPI接口,可用于连接显示屏、SD / microSD存储卡模块、外部闪存等。
  • I2C:SDA和SCL引脚用于I2C通信。
  • 串行通信(UART):该模块上有两个UART串行接口。使用这些引脚,您可以在两个设备之间传输高达5Mbps的信息。 UART0还具有CTS和RTS控制。
  • PWM:几乎所有ESP32输入/输出引脚都可用于PWM(脉冲宽度调制)。使用这些引脚可以控制电机、LED灯的亮度和RGB灯的颜色等。

ESP32模块模式

ESP32芯片有5种模式:

  • 活动模式:在这种模式下,Wi-Fi和蓝牙发射器和接收器的所有部分都是活动的。在这种情况下,电流消耗在80和260mA之间。
  • 调制解调器睡眠模式:处理器仍处于活动状态,但Wi-Fi和蓝牙已禁用。在这种情况下,电流消耗在3到20mA之间。
  • 轻度睡眠模式:主处理器停止工作,但RTC单元和ULP处理器单元仍处于活动状态。电流消耗约为0.8 mA。
  • 深度睡眠模式:只有RTC单元处于活动状态。在这种情况下,Wi-Fi和蓝牙通信的数据存储在RTC的存储器中。在此模式下,电流消耗在10到150μA之间。
  • 休眠模式:除了用于时钟的RTC定时器和连接到RTC的一些I / O引脚外,所有单元均被禁用。 RTC定时器或连接的引脚可以将芯片从此状态唤醒。在这种情况下,电流消耗约为2.5μA。
    有关更多信息,请查看模块数据表。

在Arduino IDE上开发ESP32

《在Arduino IDE上开发ESP32》

在VSCode中使用PlatformIO开发ESP32

《在VSCode中使用PlatformIO开发ESP32》

ESP32技术专栏

ESP32专栏