一、前言
有关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初始化配置