keil5 stm32f407ve芯片利用esp8266模块连接知心天气获取天气信息的代码
时间: 2023-06-12 21:03:21 浏览: 113
这里提供一个基于Keil5和STM32F407VE芯片,利用ESP8266模块连接知心天气API获取天气信息的示例代码。
```c
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
/* 定义ESP8266串口发送和接收函数 */
void ESP8266_SendString(char *str);
void ESP8266_RecvString(char *str);
/* 定义延时函数 */
void Delay(__IO uint32_t nCount);
int main(void)
{
/* 声明变量 */
char recv_buf[1024] = {0};
char send_buf[1024] = {0};
char weather_str[1024] = {0};
char *p = NULL;
uint8_t i = 0;
/* 初始化串口1 */
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOA时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* 使能USART2时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
/* 连接GPIOA9和USART2的Tx引脚 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
/* 连接GPIOA10和USART2的Rx引脚 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
/* 配置GPIOA9和GPIOA10为复用功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置USART2的参数 */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
/* 使能USART2 */
USART_Cmd(USART2, ENABLE);
/* 初始化ESP8266 */
ESP8266_SendString("AT\r\n");
Delay(1000);
ESP8266_RecvString(recv_buf);
printf("Recv: %s", recv_buf);
/* 连接WiFi */
ESP8266_SendString("AT+CWJAP=\"你的WiFi名称\",\"你的WiFi密码\"\r\n");
Delay(5000);
ESP8266_RecvString(recv_buf);
printf("Recv: %s", recv_buf);
/* 获取天气信息 */
ESP8266_SendString("AT+CIPSTART=\"TCP\",\"api.k780.com\",80\r\n");
Delay(2000);
ESP8266_RecvString(recv_buf);
printf("Recv: %s", recv_buf);
sprintf(send_buf, "GET /weather/index.php?app=weather.future&weaid=1&appkey=你的appkey HTTP/1.1\r\nHost: api.k780.com\r\nConnection: keep-alive\r\n\r\n");
ESP8266_SendString(send_buf);
Delay(5000);
ESP8266_RecvString(recv_buf);
printf("Recv: %s", recv_buf);
/* 解析天气信息 */
p = strstr(recv_buf, "result");
if (p != NULL)
{
p += 10;
for (i = 0; i < 1024; i++)
{
if (*p == '\"' || *p == '\n' || *p == '\r')
{
break;
}
weather_str[i] = *p;
p++;
}
printf("Weather: %s", weather_str);
}
while (1)
{
/* 此处可以添加其他代码 */
}
}
/* ESP8266串口发送函数 */
void ESP8266_SendString(char *str)
{
while (*str != '\0')
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2, (uint16_t) *str);
str++;
}
}
/* ESP8266串口接收函数 */
void ESP8266_RecvString(char *str)
{
char ch = 0;
uint8_t i = 0;
while (1)
{
/* 等待接收到数据 */
while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);
/* 读取接收到的数据 */
ch = USART_ReceiveData(USART2);
/* 将数据存入接收缓冲区 */
str[i++] = ch;
/* 判断是否接收到结束符 */
if (ch == '\n' || i >= 1024)
{
/* 添加字符串结束符 */
str[i] = '\0';
break;
}
}
}
/* 延时函数 */
void Delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}
```
上述代码中需要替换的部分:
1. 你的WiFi名称和密码
2. 你的appkey
代码中通过ESP8266模块连接到知心天气API获取天气信息,并将结果打印在串口上。你可以根据需要修改代码实现其他功能。
阅读全文