[ESP32+Arduino]获取网络数据

一、前言

有关WIFI功能的使用,详见使用Arduino开发ESP32(03):WiFi基本功能使用

二、使用工具

1、芯片:ESP32S3R8N8

2、编译器:Arduino IDE

三、实现功能:

从网上获取天气等信息,在串口终端进行打印,并传输给STM32

四、免费网站简介

聚合数据

1、搜索天气预报,在详情页中复制接口地址

2、获取个人API

完成实名注册后即可免费使用定量API

(获取此网站的API需提供绑定手机号及验证码,很**。若有更好的网站,欢迎在评论区提供)

3、相应文档中有具体内容可供使用

四、具体代码

1、获取原数据
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "WIFI名称";
const char* password = "WIFI密码";

// 定义
String url = "所查询网站的URL";     //例:http://apis.juhe.cn/simpleWeather/query
String city = "杭州";
String key = "你个人的API";

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

  // 连接 WiFi
  WiFi.begin(ssid, password);

  Serial.print("正在连接 Wi-Fi");
  
  // 检测是否连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }

  Serial.println("连接成功");
  Serial.println(WiFi.localIP());

  // 创建 HTTPClient 对象
  HTTPClient http;

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

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

  http.end();
  
}


void loop() {

}

2、解析json格式后的内容传递

欲用ArduinoJson.h,需在工具 -> 管理库中下载 "ArduinoJson" 库

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

const char* ssid = "WIFI名称";
const char* password = "WIFI密码";

// 定义
String url = "所查询网站的URL";     //例:http://apis.juhe.cn/simpleWeather/query
String city = "杭州";
String key = "你个人的API";

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

  // 连接 WiFi
  WiFi.begin(ssid, password);

  Serial.print("正在连接 Wi-Fi");
  
  // 检测是否连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }

  Serial.println("连接成功");
  Serial.print("IP 地址:");
  Serial.println(WiFi.localIP());

  // 创建 HTTPClient 对象
  HTTPClient http;

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

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

  http.end();

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

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

  // 从解析后的 JSON 文档中获取值
  unsigned int temp = doc["result"]["realtime"]["temperature"].as<unsigned int>();
  String info = doc["result"]["realtime"]["info"].as<String>();
  int aqi = doc["result"]["realtime"]["aqi"].as<int>();
  
  Serial.printf("温度: %d\n", temp);
  Serial.printf("天气: %s\n", info);
  Serial.printf("空气指数: %d\n", aqi);
  
}


void loop() {

}

五、串口通信

1、ESP32 -> STM32

Arduino

int RXPIN = 9;
int TXPIN = 10;
//初始化串口1,波特率115200,SERIAL_8N1=8数据位无 校验位1停止位 RX引脚为9 TX引脚为10

//Serial对应了 UART0
void setup() 
{
  // 初始化串口通信波特率
  Serial1.begin(115200, SERIAL_8N1, RXPIN, TXPIN); 
}

void loop() 
{
    // 将数据发送到 UART0
    Serial1.write("Hello World\r\n");
    delay(500);
}

2、双向通信

Arduino

#define RXPIN 9
#define TXPIN 10

uint8_t dataSent[256];

//接收中断回调函数
void onReceiveFunction(void) 
{
  // 接收串口1发送过来的数据长度
  size_t available = Serial1.available();

  //显示接收长度
  Serial.printf("onReceive Callback:: There are %d bytes available: ", available);

  //接收长度不为0则一直减
  while (available --) 
  {
    //通过串口0显示串口1接收到的数据
    Serial.print((char)Serial1.read());
  }
  //显示换行
  Serial.println();
}

//Serial、Serial1、Serial2 分别对应了 UART0、UART1 和 UART2。
void setup() 
{
  // 初始化串口通信波特率
  //串口0初始化
  Serial.begin(115200);

  //初始化串口1,波特率115200,SERIAL_8N1=8数据位无校验位1停止位 RX引脚为9 TX引脚为10
  Serial1.begin(115200, SERIAL_8N1, RXPIN, TXPIN); 

  //为串口1设置回调函数
  Serial1.onReceive(onReceiveFunction); 

  //串口1发送数据 hello LCKFB,发送12个字节
  Serial1.write("hello LCKFB", 12);

}

void loop() 
{
  //通过UART1发送数据
  Serial1.write("Hello World\r\n");
  delay(500);
}

STM32

发送部分

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Transmit_IT(&huart2, (const uint8_t *)"Hello World\r\n", 13);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

接收部分

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    UNUSED(huart);
	if(huart==&huart2){
		RxBuffer[Uart1_Rx_Cnt] = aRxBuffer;
		Uart1_Rx_Cnt++;
		if((RxBuffer[Uart1_Rx_Cnt-2] == 0x0d)&&(RxBuffer[Uart1_Rx_Cnt-1] == 0x0a)) {
			RxBuffer[Uart1_Rx_Cnt-1] = '\0';
			RxBuffer[Uart1_Rx_Cnt-2] = '\0';
			strcpy(rx_buf,RxBuffer);
			printf("%s\r\n",rx_buf);
			Uart1_Rx_Cnt = 0;
			memset(RxBuffer,0x00,sizeof(RxBuffer));
		}
 
	HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);
	}
}
/* USER CODE END 4 */

有关STM32的初始化部分,详情见【STM32+HAL】CUBEMX初始化配置

六、源码提供

Serial-Communication

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值