利用ESP8266实现在线获取天气

点击查看代码
/**
   *********************************************************************************
   * @file    main.c 
   * @author  
   * @version 
   * @date    2024/07/23
   * @brief   
						  
   *********************************************************************************
**/

#include "stm32f4xx.h"  //必须包含
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

uint8_t  u3_recvbuf[512] = {0};
uint32_t u3_recvcnt = 0;


//前台程序就是中断服务程序,该程序是不需要手动调用的,当中断触发之后CPU会自动跳转过来执行该函数
void USART1_IRQHandler(void)
{
	uint8_t data;
  //判断中断是否发生
  if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
  {   
		//从USART1中接收一个字节
		data = USART_ReceiveData(USART1);  //一次只能接收一个字节   
		
		//把接收到的数据转发出去
		USART_SendData(USART1,data);
  }
}

//前台程序就是中断服务程序,该程序是不需要手动调用的,当中断触发之后CPU会自动跳转过来执行该函数
void USART3_IRQHandler(void)
{
	
  //判断中断是否发生
  if (USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
  {   
		//从USART3中接收一个字节
		u3_recvbuf[u3_recvcnt++] = USART_ReceiveData(USART3);  //一次只能接收一个字节   
  }
}


//延时微秒 注意:Systick是24bit的递减计数器  约等于798915us,所以参数不可以超过这个值
void delay_us(u32 nus)
{
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nus * 21) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 // 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 // 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器

}

//延时毫秒 注意:Systick是24bit的递减计数器  约等于798ms,所以参数不可以超过这个值
void delay_ms(u32 nms)
{
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nms * 21*1000) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 			// 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 			// 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
}



void USART1_Config(u32 baud)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//打开了GPIO端口时钟  PA9和PA10
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	//打开USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//选择GPIO引脚的复用功能
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_USART1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
	
	//配置GPIO引脚 注意:复用模式
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_9|GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//配置串口参数+对串口初始化
	USART_InitStructure.USART_BaudRate = baud;																		//波特率
	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(USART1, &USART_InitStructure);

	//配置NVIC参数 + 对NVIC初始化
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	//选择USART1的中断源,接收到数据则触发中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//打开串口
	USART_Cmd(USART1, ENABLE);
}

void USART3_Config(u32 baud)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//打开了GPIO端口时钟  PB10和PB11
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	//打开USART3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	
	//选择GPIO引脚的复用功能
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource11 , GPIO_AF_USART3);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10 , GPIO_AF_USART3);
	
	//配置GPIO引脚 注意:复用模式
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_11|GPIO_Pin_10;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	//配置串口参数+对串口初始化
	USART_InitStructure.USART_BaudRate = baud;																		//波特率
	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(USART3, &USART_InitStructure);

	//配置NVIC参数 + 对NVIC初始化
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	//选择USART3的中断源,接收到数据则触发中断
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
	
	//打开串口
	USART_Cmd(USART3, ENABLE);
}

//利用串口发送一个字符串
void  USART1_SendString(const char *str)
{
	while(*str)
	{
		 USART_SendData(USART1,*str++);
		 while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );		
	}
}

//利用串口发送一个字符串
void  USART3_SendString(const char *str)
{
	while(*str)
	{
		 USART_SendData(USART3,*str++);
		 while( USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET );		
	}
}


int main()
{

	
	//1.硬件的初始化
	USART1_Config(9600);
  USART3_Config(115200);
	
	//退出透传  +++
	USART3_SendString("+++");  				
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	
	//2.配置ESP8266参数
  USART3_SendString("AT\r\n");  										//测试指令
	delay_ms(500);
	delay_ms(500);
	
	USART1_SendString((char *)u3_recvbuf);
	
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	
	//设置模式  STA
	USART3_SendString("AT+CWMODE_CUR=1\r\n");  				
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	USART1_SendString((char *)u3_recvbuf);
	
	//热点名称:lmx  热点密码:12345678
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	USART3_SendString("AT+CWJAP_DEF=\"lmx\",\"12345678\"\r\n");  				//连接热点 
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	
	USART1_SendString((char *)u3_recvbuf);
	
	
	//连接服务器,心知天气的服务器的IP:116.62.81.138   端口:80
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	USART3_SendString("AT+CIPSTART=\"TCP\",\"116.62.81.138\",80\r\n");  				//连接服务器
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	USART1_SendString((char *)u3_recvbuf);
	
	
	//使能透传
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	USART3_SendString("AT+CIPMODE=1\r\n");  				//进入透传  >出现之后,才表示进入透传
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	USART1_SendString((char *)u3_recvbuf);
	
	//进入透传
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	USART3_SendString("AT+CIPSEND\r\n");  				//进入透传  >出现之后,才表示进入透传
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	USART1_SendString((char *)u3_recvbuf);
	
	//发送请求  https://api.seniverse.com/v3/weather/now.json?key=S5jYTIuliBSEQmhkX&location=guangzhou&language=zh-Hans&unit=c
	memset((char *)u3_recvbuf,0,512);
	u3_recvcnt = 0;
	//和实际的HTTP协议的请求行格式有一些出入,现在需要进行简化的  不需要请求字段和协议版本
	USART3_SendString("GET https://api.seniverse.com/v3/weather/now.json?key=S5jYTIuliBSEQmhkX&location=beijing&language=zh-Hans&unit=c\r\n\r\n");
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	USART1_SendString((char *)u3_recvbuf);
	
	//解析数据
//	cJSON *root = cJSON_Parse((char *)u3_recvbuf);
//	char *str =  cJSON_Print(root);
//	USART1_SendString(str);
	while(1)
	{

	}
}





posted @ 2025-08-30 12:38  w1888  阅读(19)  评论(0)    收藏  举报