STM32+ESP8266获取网络时间和天气

目录

1:连网

2:获取天气和时间

3:对获取到的数据进行解析


先给出两个可以获取天气和时间的网站

https://www.seniverse.com/docs  可以获取天气

http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1

可以获取时间

接下来简单说说怎么通过AT指令的方式去获取天气及时间信息

1:连网

首先,ESP8266肯定是需要连上网才能访问这些信息。所以,第一步要做的就是让ESP8266连接上wifi热点,可以是路由器,也可以是手机热点。下面写出重要的步骤

1:使用串口发送指令AT+CWMODE=1设置模块Wi_Fi应用模式为Station模式。

2:发送指令AT+RST使模块重启,重启后等待一段时间

3:发送指令AT+CIPMUX=0 设置模块为单路连接模式

4:发送指令AT+CWJAP="ssid","pwd",连接AP;(ssid就是你要连接WiFi的名字,pwd就是密码)

经过以上四步,ESP8266就可以连接上WIFI了.

完整版代码如下:

u8 atk_8266_wifista_config(void)
{
	u8 *p;
	p=pvPortMalloc(50);						
	POINT_COLOR=RED;
	while(atk_8266_send_cmd("AT","OK",100))          //Check if the WIFI module is online
	{
		atk_8266_quit_trans();                       //Exit transparent transmission
		atk_8266_send_cmd("AT+CIPMODE=0","OK",200);   
		My_Pri_log_x(1,"ESP8266 does not exist\r\n");
		LED0=~LED0;
		vTaskDelay(1000);
	} 
  LED0=1;
	while(atk_8266_send_cmd("ATE0","OK",20));    //Close echo
	atk_8266_send_cmd("AT+CWMODE=1","OK",50);    //Set WIFI STA mode
	atk_8266_send_cmd("AT+RST","OK",20);		   
	vTaskDelay(3000);                            //Delay 3S for successful restart
	atk_8266_send_cmd("AT+CIPMUX=0","OK",20);    //0:Single connection
	sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//Set wireless parameters
	while(atk_8266_send_cmd(p,"WIFI GOT IP",500));//Connect to the target router
	vPortFree(p);
	return 0;
}

2:获取天气和时间

以获取天气为例,获取时间就是网站不同罢了。

 

上面一段话是在心知天气中截屏所得。

其中key= 后面的内容是你在心知天气注册后得到的一个密钥,注册很简单,不麻烦,而且是免费。

location= 后面是你要查询天气的城市,心知的网站上有城市的说明文档;

language= 后面的是语言的选择。官方也有说明文档。

欧克,有了以上可以获取天气等信息的网站后,我们就可以配置ESP8266去访问这个网址,从而得到我们想要的信息。

写出重要的步骤:

1:发送指令AT+CIPSTART= .... 连接到指定网站(就是上面的https://www.seniverse.com/docs )端口信息写80即可

2:发送指令AT+CIPMODE =1 设置为透传模式

3:发送指令AT+CIPSEND 开始透传

4:发送 GET+上面的获取时间的网址

5:稍等片刻,就会将天气等信息回传过来

6:退出透传模式(连续发送3个 + 即可退出透传模式)

7:发送指令AT+CIPCLOSE 来关闭透传

完整版代码如下:

/**
 * @brief :Get a real-time weather
 * @param 0:Get location, weather, temperature
 * @param 1:Get Time
 * @retval 0:Successful
 *         1:Get failed
 */
u8 get_current_Information(u8 select)
{
	u8 *p;
	u8 res;

	p=pvPortMalloc(40);	

	if(select == 0)
    sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    //Configure the target TCP server
	else if(select == 1)
		sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",TIME_SERVERIP,TIME_PORTNUM);    

	res = atk_8266_send_cmd(p,"OK",200);
	if(res==1)
	{
		vPortFree(p);
		return 1;
	}
	vTaskDelay(300);
	atk_8266_send_cmd("AT+CIPMODE=1","OK",200);      //The transmission mode is: transparent transmission
	USART2_RX_STA=0;
	atk_8266_send_cmd("AT+CIPSEND","OK",200);        //Start passthrough
	My_Pri_log_x(1,"start trans...\r\n");

	if(select == 0)
  	My_Pri_log_x(2,"GET https://api.seniverse.com/v3/weather/now.json?key=S5b_Q9GDyOKOPWOAS&location=xiaogan&language=en&unit=c\n\n");
	else if(select == 1)
	  My_Pri_log_x(2,"GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1\n\n");

	vTaskDelay(20);//Delayed 20ms returns the status of the command sent successfully
	//atk_8266_at_response(1);
	USART2_RX_STA=0;
	vTaskDelay(1000);
	atk_8266_at_response(0);
	if(USART2_RX_STA&0X8000)		            //At this time, the data is received again, which is the weather data
		USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//Add terminator
	 	
	if(select == 0)
   	parse_now_weather(); 
	else if(select == 1)
	{
    parse_now_time();
	}
	  
	atk_8266_quit_trans();//Exit transparent transmission
	atk_8266_send_cmd("AT+CIPCLOSE","OK",50); //Close the connection
	vPortFree(p);
	return 0;
}

上面的函数通过传入0和1可以达到获取天气或者时间的功能。

3:对获取到的数据进行解析

你获取到的数据其实都是Json格式,我也不懂,但是有Demo对这些数据进行解析。

{"success":"1","result":{"timestamp":"1601813449","datetime_1":"2020-10-04 20:10:49","datetime_2":"2020骞?10鏈?04鏃? 20鏃?10鍒?49绉?","week_1":"0","week_2":"鏄熸湡鏃?","week_3":"鍛ㄦ棩","week_4":"Sunday"}}

上面这段,是获取时间后返回的数据。直接上解析代码,对葫芦画瓢即可

/**
 * @brief Analyze the current TIME
 */ 
u8 parse_now_time(void)
{
	cJSON *root;
	cJSON *pSub;
	cJSON *pItem;
	char *utf8str;
	
	root = pvPortMalloc(sizeof(cJSON));
	pSub = pvPortMalloc(sizeof(cJSON));
	pItem = pvPortMalloc(sizeof(cJSON));
	
	utf8str = pvPortMalloc(50);
	
	memset(utf8str,0,50);
	
	root = cJSON_Parse((const char*)USART2_RX_BUF);
	if(root != NULL)
	{
		pSub = cJSON_GetObjectItem(root,"result");
		if(pSub != NULL)
		{
			pItem = cJSON_GetObjectItem(pSub,"datetime_1");
			if(pItem != NULL)
			{
				utf8str = pItem->valuestring;
        memcpy(ESP_TIME,utf8str,20);
				My_Pri_log_x(1,"%d--%s\r\n",__LINE__,utf8str); 
				My_Pri_log_x(1,"%d--%s\r\n",__LINE__,ESP_TIME);    
			}

			pItem = cJSON_GetObjectItem(pSub,"week_1");
			if(pItem != NULL)
			{
				utf8str = pItem->valuestring;
				memcpy(ESP_WEEK,utf8str,1);
				My_Pri_log_x(1,"%d--%s\r\n",__LINE__,utf8str); 
				My_Pri_log_x(1,"%d--%s\r\n",__LINE__,ESP_WEEK);        
			}
		}
	}
	vPortFree(root);
	vPortFree(pSub);
	vPortFree(pItem);
	vPortFree(utf8str);
	return 0;
}

解析相关的 cjosn.c和.h文件我上传到CSDN。只需要将上述函数中的内存申请和释放函数换成你的项目中能用的函数就能解析。

https://download.csdn.net/download/qq_41867145/12911391

 

  • 15
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
基于STM32ESP8266的桌面型网络天气时钟系统设计如下:该系统主要由STM32单片机、ESP8266无线模块、RTC实时时钟模块、LCD显示屏和温湿度传感器等组成。 首先,STM32作为主控单元,负责整个系统的控制和协调。它通过串口与ESP8266进行通信,将获取到的天气数据发送给ESP8266进行处理和联网。 其次,ESP8266无线模块实现了系统的网络连接功能。它能够通过WiFi无线网络连接到互联网,从而获取天气数据。ESP8266利用HTTP协议与已有的天气API进行通信,获取实时的天气数据,并将其返回给STM32。 RTC实时时钟模块用于实时记录当前时间,并在断电后能够继续保持时间的准确性。它提供了精确的时钟信号以及日期显示功能,确保系统能够准确显示当前时间和日期。 LCD显示屏用于显示系统中的各种信息,包括时间、日期、天气预报等。通过与STM32进行通信,LCD屏幕能够根据接收到的数据更新显示内容。 最后,温湿度传感器用于实时监测环境的温度和湿度。它通过与STM32的连接,将监测到的数据传输给STM32进行处理和显示,并可以根据数据判断是否需要提醒用户进行调整。 总之,基于STM32ESP8266的桌面型网络天气时钟系统能够通过连接到互联网获取实时的天气数据,并将其显示在LCD屏幕上。同时,它还能够显示当前时间、日期和环境温湿度等信息,为用户提供了一种实用的功能,并能够根据实时数据进行提醒和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值