keil5 stm32f407ve芯片利用esp8266模块连接知心天气获取天气信息的代码
时间: 2023-06-16 19:03:36 浏览: 188
以下是基于Keil5和STM32F407VE芯片利用ESP8266模块连接知心天气获取天气信息的代码:
```c
#include "stm32f4xx.h"
#include <stdio.h>
#include <string.h>
#define SSID "Your_SSID" // 请替换成自己的WiFi名称
#define PASSWORD "Your_Password" // 请替换成自己的WiFi密码
void USART3_Configuration(void);
void USART3_SendChar(uint16_t Data);
void USART3_SendString(char *str);
void ESP8266_Configuration(void);
void ESP8266_SendCommand(char *cmd);
char ESP8266_ReceiveChar(void);
void ESP8266_ReceiveResponse(char *response);
void ESP8266_ClearBuffer(void);
void Delay_ms(uint32_t nCount);
int main(void)
{
char response[200];
char cmd[100];
char temp[10], weather[20]; // 存放温度和天气
uint8_t i;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
USART3_Configuration();
ESP8266_Configuration();
// 连接WiFi
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", SSID, PASSWORD);
ESP8266_SendCommand(cmd);
ESP8266_ClearBuffer();
// 获取天气信息
ESP8266_SendCommand("AT+CIPSTART=\"TCP\",\"www.zxweather.com\",80\r\n");
ESP8266_ClearBuffer();
Delay_ms(1000);
sprintf(cmd, "GET /WeatherAPI/weather.aspx?city=beijing HTTP/1.1\r\nHost: www.zxweather.com\r\n\r\n");
sprintf(temp, "Content-Length: %d\r\n", strlen(cmd));
sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(cmd) + strlen(temp) + 2);
ESP8266_SendCommand(cmd);
ESP8266_ClearBuffer();
Delay_ms(1000);
ESP8266_SendCommand(temp);
ESP8266_SendString(cmd);
ESP8266_SendString("\r\n");
ESP8266_ClearBuffer();
Delay_ms(1000);
ESP8266_ReceiveResponse(response);
for (i = 0; i < strlen(response); i++)
{
if (response[i] == '\"')
{
i++;
break;
}
}
strncpy(temp, response + i, 4); // 获取温度
temp[4] = '\0';
strncpy(weather, response + i + 6, 8); // 获取天气
weather[8] = '\0';
USART3_SendString("Temperature: ");
USART3_SendString(temp);
USART3_SendString("\r\n");
USART3_SendString("Weather: ");
USART3_SendString(weather);
USART3_SendString("\r\n");
while (1);
}
void USART3_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
}
void USART3_SendChar(uint16_t Data)
{
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3, (uint8_t)Data);
}
void USART3_SendString(char *str)
{
while (*str)
{
USART3_SendChar(*str++);
}
}
void ESP8266_Configuration(void)
{
char response[100];
ESP8266_SendCommand("AT+RST\r\n");
ESP8266_ClearBuffer();
Delay_ms(3000);
ESP8266_SendCommand("AT+CWMODE=1\r\n");
ESP8266_ClearBuffer();
ESP8266_SendCommand("AT+CIPMUX=0\r\n");
ESP8266_ClearBuffer();
}
void ESP8266_SendCommand(char *cmd)
{
while (*cmd)
{
USART3_SendChar(*cmd++);
}
}
char ESP8266_ReceiveChar(void)
{
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
return (char)USART_ReceiveData(USART3);
}
void ESP8266_ReceiveResponse(char *response)
{
uint8_t i = 0;
char c;
while (i < 200)
{
c = ESP8266_ReceiveChar();
response[i++] = c;
if (c == '\n')
{
break;
}
}
response[i] = '\0';
}
void ESP8266_ClearBuffer(void)
{
char c;
while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET)
{
c = USART_ReceiveData(USART3);
}
}
void Delay_ms(uint32_t nCount)
{
uint32_t i, j;
for (i = 0; i < nCount; i++)
{
for (j = 0; j < 2000; j++);
}
}
```
注意:在使用该代码之前,请先在ESP8266模块上烧录AT固件。并且请替换代码中的WiFi名称和密码为自己的WiFi名称和密码。