使用ESP8266连接RA4E2开发板后,可以通过ESP8266连接WIFI网络,然后通过AT指令访问api.seniverse.com心知天气网站获取城市天气预报。
板子连接如下图所示:

硬件连线:
ESP-01S----------------------------------串口模块
3V3-----------------------------------------3V3
GND---------------------------------------GND
RX-------------------------------------------TX
TX--------------------------------------------RX
第一步,注册心知天气账户
官网心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 (seniverse.com)
注册完成控制台获取免费版,在打开天气实况 (yuque.com)该地址获取接口地址

接口地址中:your_api_Key替换成心知天气的个人私钥,beijing替换成自己的城市,比如chengdu
第二步,编译代码烧录RA4E2后,打开串口助手,发送AT指令
1.复位模块
发送AT+RST
返回ready
2.测试AT指令
发送AT
返回OK
3.配置STA模式
发送AT+CWMODE=1
返回OK
4.连接wifi
发送AT+CWJAP="wifi名称","wifi密码"
返回OK
5.连接心知服务器
发送AT+CIPSTART="TCP","116.62.81.138",80
返回OK
8.使能esp8266透传模式
发送AT+CIPMODE=1 //0:禁止 1:使能
返回OK
9.开启数据传输
发送AT+CIPSEND
返回OK
10,获取天气
GET
最后得到天气
在这里需要使用CJSON进行数据解析,解析出天气预报中的有用信息
我的解析给是如下:

核心函数如下
#include "hal_data.h"
#include "Systick.h"
#include "usart0.h"
#include "usart9.h"
#include "usart_ring.h"
#include "esp8266.h"
#include "esp8266_io.h"
#include <stdio.h>
#include "app.h"
#include "cJSON.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
void ADC_TSN(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
}
volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
scan_complete_flag = true;
}
double a0,a5;
uint16_t adc_data1=0;
uint16_t adc_data2=0;
uint8_t txData;
char TX_Data[]="GET https://api.seniverse.com/v3/weather/now.json?key=SfobYsdsesesddsRce&location=shenzhen&language=zh-Hans&unit=c\r\n";
char Data[]="AT+CIPSEND\r\n";
/*******************************************************************************************************************//**
-
main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
-
is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
esp8266_status_t status;
fsp_err_t err = FSP_SUCCESS;
fsp_err_t err1 = FSP_SUCCESS;
uint16_t time = 0;
uint8_t voltage_1 = 0;
uint8_t voltage_2 = 0;
static adc_info_t adc_info ;
static double die_temperature = 0 ;
static double V1 = 0;
static double Vs = 0;
uint32_t DataSize = 0;
/* TODO: add your own code here */
hal_systick_init();
UART0_Init();UART9_Init();
ADC_TSN();
//esp8266_Init();
/* Subscribe to a topic */
//while(esp8266_mqtt_subscribe("iotled", 1));
//HAL_Delay(200);
#if 1
printf("\r\nESP8266城市天气预报 \r\n\r\n");
ESP8266_Init();
while(ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", "OK"));
while(ESP8266_SendCmd("AT+CIPMODE=1\r\n", "OK"));
ESP8266_SendData(TX_Data,strlen(TX_Data));
HAL_Delay(500);
printf("%d\r\n",U2_Rxlen);
printf("%d\r\n",strlen(U2_RxBuff));
printf("原始天气数据\r\n");
printf("*****************************************************************************\r\n");
printf("%s\r\n",U2_RxBuff);
printf("*****************************************************************************\r\n");
cJSON *json;
cJSON *Array_obj1;
cJSON *Array_obj2;
cJSON *Array_obj3;
cJSON *Array_obj4;
cJSON *Array_obj5;
cJSON *Array_obj6;
cJSON *Array_obj7;
cJSON *Array_obj8;
cJSON *Array;
json = cJSON_Parse((const char *) U2_RxBuff );
Array_obj1=cJSON_GetObjectItem(json,"results");
int size=cJSON_GetArraySize(Array_obj1);
printf("\r\nCJSON解析后的数据\r\n");
printf("=============================================================================\r\n");
if(json == NULL)
printf("\njson fmt error:%s\n.", cJSON_GetErrorPtr());
else
{
Array=cJSON_GetArrayItem(Array_obj1,0);
Array_obj2=cJSON_GetObjectItem(Array,"now");
Array_obj3=cJSON_GetObjectItem(Array_obj2,"code");
Array_obj4=cJSON_GetObjectItem(Array_obj2,"temperature");
Array_obj5=cJSON_GetObjectItem(Array_obj2,"text");
Array_obj6=cJSON_GetObjectItem(Array,"location");
Array_obj7=cJSON_GetObjectItem(Array_obj6,"name");
Array_obj8=cJSON_GetObjectItem(Array,"last_update");
printf("城市: %s ",Array_obj7->valuestring);
printf("天气: %s ",Array_obj5->valuestring);
printf("气温: %s度 ",Array_obj4->valuestring);
printf("时间: %s\r\n",Array_obj8->valuestring);
printf("=============================================================================\r\n");
}
cJSON_Delete(json);
uart0_Send_String("+++");
#endif
#if 0
while (1)
{
(void) R_ADC_ScanStart(&g_adc0_ctrl);
scan_complete_flag = false;
while (!scan_complete_flag)
{
}
err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &adc_data1);
assert(FSP_SUCCESS == err);
//Get ADC info
err = R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
assert(FSP_SUCCESS == err);
//Die temperature formula according to TSN documentation: T = ( Vs - V1 ) / slope + 127 C
V1 = ( 3.3 * (int) adc_info.calibration_data ) / 4096 ;
Vs = ( 3.3 * (int) adc_data1 ) / 4096 ;
die_temperature = CONSTANT * ( Vs - V1 ) / ( adc_info.slope_microvolts ) + 127.0;
static char string_die_temp[10] = {0};
sprintf( string_die_temp, "%.2f", die_temperature );
printf("RA4E2 Sensor开发板芯片当前温度是: %s 度\r\n", string_die_temp);
while(esp8266_mqtt_publish("RA4E2", string_die_temp, 1, 0));
HAL_Delay(100);
}
#endif
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
/**
- [url=home.php?mod=space&uid=2666770]@Brief[/url] This function is executed in case of error occurrence.
- @retval None
/
void Error_Handler(void)
{
/ USER CODE BEGIN Error_Handler_Debug /
/ User can add his own implementation to report the HAL error return state /
__disable_irq();
while (1)
{
}
/ USER CODE END Error_Handler_Debug */
}
/*******************************************************************************************************************//**
-
This function is called at various points during the startup process. This implementation uses the event that is
-
called right before main() to set up the pins.
-
@param[in] event Where at in the start up process the code is currently at
**********************************************************************************************************************/
void R_BSP_WarmStart (bsp_warm_start_event_t event)
{
if (BSP_WARM_START_RESET == event)
{
#if BSP_FEATURE_FLASH_LP_VERSION != 0
R_FACI_LP->DFLCTL = 1U;
#endif
}
if (BSP_WARM_START_POST_C == event)
{
R_IOPORT_Open(&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME);
#if BSP_CFG_SDRAM_ENABLED
R_BSP_SdramInit(true);
#endif
}
}
#if BSP_TZ_SECURE_BUILD
FSP_CPP_HEADER
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{
}
FSP_CPP_FOOTER
#endif
打开串口助手,产看即可
1。先显示成都天气

城市: 成都 天气: 多云 气温: 29度 时间: 2025-09-03T12:40:02+08:00
打开手机App

城市: 成都 天气: 多云 气温: 29度 时间: 2025-09-03T12:40:02+08:00
和ESP8266解析的天气信息一模一样,非常的准确
2。换成深圳

char TX_Data[]="GET https://api.seniverse.com/v3/weather/now.json?key=SfobYffffgjL6dRce&location=shenzhen&language=zh-Hans&unit=c\r\n";
打开串口

城市: 深圳 天气: 多云 气温: 33度 时间: 2025-09-03T12:57:42+08:00
打开手机App

天气 预报一致
详情看视频