STM32通过esp8266获取心知天气数据(hal库)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

通过程序显示心知天气数据,


一、效果展示?

set_1_LCD ID:9488
AT+CWMODE=1
AT+CWJAP="CMCC-6w7C","5xwjiw2g"CLOSEDWSCONNECTWIFI CONNECTEDWIFI GOT IP
AT+CIPSTART="TCP","api.seniverse.com",80CONNECTOK
AT+CIPMODE=1
AT+CIPSEND
{"results":[{"location":{"id":"WM6N2PM3WY2K","name":"Chengdu","country":"CN","path":"Chengdu,Chengdu,Sichuan,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2022-07-25","text_day":"Foggy","code_day":"30","text_night":"Clear","code_night":"1","high":"36","low":"23","rainfall":"0.00","precip":"0.00","wind_direction":"N","wind_direction_degree":"0","wind_speed":"8.4","wind_scale":"2","humidity":"90"},{"date":"2022-07-26","text_day":"Cloudy","code_day":"4","text_night":"Moderate rain","code_night":"14","high":"35","low":"24","rainfall":"5.47","precip":"0.54","wind_direction":"CLM","wind_direction_degree":"","wind_speed":"8.4","wind_scale":"2","humidity":"91"},{"date":"2022-07-27","text_day":"Moderate rain","code_day":"14","text_night":"Thundershower","code_night":"11","high":"33","low":"23","rainfall":"11.86","precip":"0.84","wind_direction":"CLM","wind_direction_degree":"","wind_speed":"3.0","wind_scale":"1","humidity":"97"}],"last_update":"2022-07-25T08:00:00+08:00"}]}

{"results":[{"location":{"id":"WM6N2PM3WY2K","name":"Chengdu","country":"CN","path":"Chengdu,Chengdu,Sichuan,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2022-07-25","text_day":"Foggy","code_day":"30","text_night":"Clear","code_night":"1","high":"36","low":"23","rainfall":"0.00","precip":"0.00","wind_direction":"N","wind_direction_degree":"0","wind_speed":"8.4","wind_scale":"2","humidity":"90"},{"date":"2022-07-26","text_day":"Cloudy","code_day":"4","text_night":"Moderate rain","code_night":"14","high":"35","low":"24","rainfall":"5.47","precip":"0.54","wind_direction":"CLM","wind_direction_degree":"","wind_speed":"8.4","wind_scale":"2","humidity":"91"},{"date":"2022-07-27","text_day":"Moderate rain","code_day":"14","text_night":"Thundershower","code_night":"11","high":"33","low":"23","rainfall":"11.86","precip":"0.84","wind_direction":"CLM","wind_direction_degree":"","wind_speed":"3.0","wind_scale":"1","humidity":"97"}],"last_update":"2022-07-25T08:00:00+08:00"}]}

二、代码

1.编写代码

首先我是自己写的一个esp8266库文件还没完善但是能用,注意转义字符,每个指令后面+\r\n。

WIFI.h

#ifndef __WIFI_H
#define __WIFI_H

#include "main.h" 
#include "usart2.h"
#include "Delay.h"
#define STA "AT+CWMODE=1\r\n"
#define AP "AT+CWMODE=2\r\n"
#define STA_AP "AT+CWMODE=3\r\n"

#define PT "AT+CIPMODE=1\r\n"
#define ON_PT "AT+CIPMODE=0\r\n"
#define AT  "AT\r\n"
#define AT_REST "AT+RESTORE\r\n"
#define ssid "CMCC-6w7C"
#define pass "5xwjiw2g"
#define SET_TIME "AT+CIPSNTPCFG=1,8\r\n"
#define GET_TIME "AT+CIPSNTPTIME?\r\n"
#define TCP_IP "AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n"
#define TCP_SEND "AT+CIPSEND\r\n"
#define TCP_BACK "+++"

#define TCP_SEND_M "GET https://api.seniverse.com/v3/weather/now.json?key=密钥&location=chengdu&language=en&unit=c\r\n" //获取未来一天天气。这里是GET请求,前面要加GET 


#define TCP_Three_Day "GET https://api.seniverse.com/v3/weather/daily.json?key=密钥&location=chengdu&language=en&unit=c&start=-1&days=5\r\n" //获取未来三天的天气

//**********************************下面是函数部分
int AT_Test(char* MODE);
void AT_WIFIMODE(char* MODE); //设置WiFi模式
void AT_CONNECT_WIFI(char* SSID,char* PASS); //连接WiFi
void AT_SET_TIME(void ); //设置时区
void AT_GET_TIME(void);  //获取时间
void AT_Connect_TCP(void); //连接心知天气
void AT_SET_TCPMODE(char* MODE); //设置tcp透传模式
void AT_SEND_TCP(void); //发送tcp指令
void AT_BAKE_SEND(void); //退出tcp发送
void AT_SEND_MES(void); //发送get请求
#endif

WIFI.c(这里没什么好说的)

#include "WIFI.h"

int AT_Test(char* AT_TEXT){
	  uint8_t AT_T[128];
		sprintf(AT_T,"%s",AT_TEXT);
		HAL_UART_Transmit(&huart2,(uint8_t*)&AT_T,strlen(AT_T) * sizeof(char),HAL_MAX_DELAY);
	  Delay_ms(2000);
}

void AT_WIFIMODE(char* MODE){
		uint8_t WIFI_Mode[128];
 	  sprintf(WIFI_Mode,"%s",MODE);
		HAL_UART_Transmit(&huart2, (uint8_t *)WIFI_Mode,strlen(WIFI_Mode) * sizeof(char), HAL_MAX_DELAY);
		Delay_ms(1000);
	
}

void AT_CONNECT_WIFI(char* SSID,char* PASS){
	uint8_t WIFI_Connect[128];
	sprintf(WIFI_Connect,"AT+CWJAP=\"%s\",\"%s\"\r\n",SSID,PASS);
	HAL_UART_Transmit(&huart2, (uint8_t *)WIFI_Connect,strlen(WIFI_Connect) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(2000);
}

void AT_SET_TIME(void ){
	uint8_t WIFI_TIME[128];
	sprintf(WIFI_TIME,"%s",SET_TIME);
	HAL_UART_Transmit(&huart2, (uint8_t *)WIFI_TIME,strlen(WIFI_TIME) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(1000);
}

void AT_GET_TIME(void){
	uint8_t WIFI_GET_TIME[128];
	sprintf(WIFI_GET_TIME,"%s",GET_TIME);
	HAL_UART_Transmit(&huart2, (uint8_t *)WIFI_GET_TIME,strlen(WIFI_GET_TIME) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(1000);
}

void AT_Connect_TCP(void){
	uint8_t WIFI_Connect_TCP[128];
	sprintf(WIFI_Connect_TCP,"%s",TCP_IP);
	HAL_UART_Transmit(&huart2, (uint8_t *)WIFI_Connect_TCP,strlen(WIFI_Connect_TCP) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(1000);
}

void AT_SET_TCPMODE(char* MODE){
		uint8_t TCP_Mode[128];
 	  sprintf(TCP_Mode,"%s",MODE);
		HAL_UART_Transmit(&huart2, (uint8_t *)TCP_Mode,strlen(TCP_Mode) * sizeof(char), HAL_MAX_DELAY);
		Delay_ms(1000);
}

void AT_SEND_TCP(void){
	uint8_t TCP_SEND_MS[128];
 	sprintf(TCP_SEND_MS,"%s",TCP_SEND);
	HAL_UART_Transmit(&huart2, (uint8_t *)TCP_SEND_MS,strlen(TCP_SEND_MS) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(2000);
	
}

void AT_BAKE_SEND(void){
	uint8_t TCP_BACK_TCP[128];
	sprintf(TCP_BACK_TCP,"%s",TCP_BACK);
	HAL_UART_Transmit(&huart2, (uint8_t *)TCP_BACK_TCP,strlen(TCP_BACK_TCP) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(2000);
	
}

void AT_SEND_MES(void){
	
	uint8_t TCP_MES[256];
	sprintf(TCP_MES,"%s",TCP_Three_Day);
	HAL_UART_Transmit(&huart2, (uint8_t *)TCP_MES,strlen(TCP_MES) * sizeof(char), HAL_MAX_DELAY);
	Delay_ms(1000);
	//HAL_UART_Receive(&huart2,(uint8_t *)buff,strlen(buff) * sizeof(char), HAL_MAX_DELAY);
	//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)&buff,strlen(buff) * sizeof(char),HAL_MAX_DELAY);
	//HAL_UART_Receive(&huart2,(uint8_t *)&DateBuff,1); 
	//Delay_ms(5000);
}

main.c

#include "main.h"
#include "gpio.h"
#include "USART.h"
#include "Delay.h"
#include "i2c.h"
#include "AHT10_S.h"
#include "lcd.h"
#include "stdio.h"
#include "touch.h"
#include "tim.h"
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "ADC.h"
#include "WIFI.h"


int main(void)
{

    HAL_Init();

    SystemClock_Config();
		MX_GPIO_Init();
    Delay_init(180);
   	ADC_Config();
		uart_init(115200);
		USART_config();
		MX_TIM8_Init();		
	  LCD_Init();           			//初始化LCD FSMC接口			
	  //tp_dev.init();				    //触摸屏初始化
	
	  //lv_init();
		//lv_port_disp_init();
		//lv_port_indev_init();
	  	//uint8_t AT_T[10];
			//sprintf(AT_T,"%s",AT);
			//HAL_UART_Transmit(&huart2,(uint8_t*)&AT_T,strlen(AT_T) * sizeof(char),HAL_MAX_DELAY);
			//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)&AT_T,strlen(AT_T) * sizeof(char),HAL_MAX_DELAY);
			//AT_Test();
			//Delay_ms(1000);
			//AT_Test(AT_REST);
			//AT_WIFIMODE(STA);
			//printf("\r\n%s\r\n",BackcallBuff);
			
			AT_WIFIMODE(STA);
			printf("\n");
			AT_CONNECT_WIFI(ssid,pass);
			printf("\n");
			AT_Connect_TCP();
			printf("\n");
			AT_SET_TCPMODE(PT);
			printf("\n");
			AT_SEND_TCP();
			//printf("\n");
			AT_SEND_MES();
			AT_BAKE_SEND();
			//AT_SET_TIME();
			//AT_GET_TIME();
			
  while (1)
  {
		Delay_ms(3000);
		printf("\r\n%s\r\n",Rxbuff);
		
		//tp_dev.scan(0);
		//lv_task_handler();
  }
 
}


总结

当前时间是2022/7/25的23:30分,我还在努力着,为了未来,因为我只是一个普通专科。只有比别人努力才会发光,要怪只能怪自己当前高考时太不努力。加油,年轻人

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是一个基于STM32ESP8266模块的获取天气的程序示例。这个示例使用了AT指令协议进行通信,使用了OpenWeatherMap的API获取天气数据。 ```c #include "stm32f1xx_hal.h" #include <stdio.h> #include <string.h> UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); char buffer[1024]; void sendAT(char* command) { HAL_UART_Transmit(&huart1, (uint8_t*)command, strlen(command), HAL_MAX_DELAY); HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY); HAL_Delay(500); } void readResponse() { int pos = 0; memset(buffer, 0, sizeof(buffer)); HAL_UART_Receive(&huart1, (uint8_t*)buffer, sizeof(buffer), HAL_MAX_DELAY); printf(buffer); } void getWeather() { char command[128]; char* apiKey = "your_api_key_here"; char* city = "your_city_here"; sprintf(command, "AT+CIPSTART=\"TCP\",\"api.openweathermap.org\",80"); sendAT(command); sprintf(command, "GET /data/2.5/weather?q=%s&appid=%s HTTP/1.1", city, apiKey); sendAT(command); sendAT("AT+CIPSEND"); readResponse(); HAL_Delay(1000); sendAT("AT+CIPCLOSE"); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { sendAT("AT"); readResponse(); getWeather(); HAL_Delay(10000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 在这个示例中,我们定义了一些函数来发送AT指令,读取ESP8266的响应和获取天气数据。在主循环中,我们发送“AT”指令和等待响应,以确保ESP8266正常工作。然后,我们使用OpenWeatherMap的API获取天气数据获取数据后,我们关闭TCP连接并等待一段时间,然后再次开始循环。 请注意,你需要在程序中替换“your_api_key_here”和“your_city_here”为你自己的API密钥和城市名称。 这个示例仅供参考,实际使用时可能需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片有机机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值