0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SDL时间和天气显示

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-12-08 14:15 次阅读

SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOS X等)的应用软件。现SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

1.天气获取

   天气获取采用命令行浏览器curl,天气获取接口使用心知天气网;

  心知天气是中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据、天气监控机器人、气象数据可视化产品,本次天气数据获取从心知天气网平台获取。

2.天气获取与解析示例

/******************解析 天气数据****************
形参:u8* buff原始数据
			u8 *Weather_stat天气数据标志
			u8 *data解析获取到的数据
返回值:0---成功,其他值---失败
************************************************/
u8 Weather_analysis(u8* buff,u8 *Weather_stat,u8 *data)
{
	char *p=NULL;
	u16 i=0;
	p=strstr((char *)buff,(char *)Weather_stat);//获取温度
	if(p)
	{
		p+=strlen((char *)Weather_stat)+2;
		i=0;
		while(*p!='"' && *p!='�')
		{
			data[i++]=*p++;
		}
		data[i]='�';
		return 0;
	}
	else return 1;
}
/*获取天气数据*/
int Http_GetWeather(void)
{
	FILE *fp=popen("curl  api.seniverse.com/v3/weather/now.json?key=SwD4-ybQxhedD1z7U'&'location=nanchang'&'language=zh-Hans'&'unit=c","r");
	if(fp==NULL)
	{
		printf("重定向失败n");
		return -1;
	}
	char wthread_buff[1025];
	int cnt=fread(wthread_buff,1,1024,fp);
	wthread_buff[cnt]='�';
	char buff[100];
	wchar_t wc_buff[200];
	int stat;
	/*
		{"results":[{"location":{"id":"WT47HJP3HEMP","name":"南昌","country":"CN","path":"南昌,南昌,江西,中国",
		"timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"16"},"last_update":"2021-11-20T16:57:46+08:00"}]}
	*/
	/*解析天气数据*/
	Weather_analysis(wthread_buff,(u8 *)""name"",(u8 *)weather_info.city_name);//城市名称
		
	if(!Weather_analysis(wthread_buff,(u8 *)""temperature"",(u8 *)buff))//获取温度
	{
		snprintf((char *)weather_info.city_temp,sizeof(weather_info.city_temp),"%s℃",buff);
	}
	Weather_analysis(wthread_buff,""text"",(u8 *)weather_info.city_weather);
	if(!Weather_analysis(wthread_buff,(u8 *)""code"",(u8 *)buff))//天气代码
	{
		weather_info.city_code=atoi(buff);//字符串转整数
	}
	//printf("name:%sttemp:%st天气:%st天气代号:%dn",weather_info.city_name,weather_info.city_temp,weather_info.city_weather,weather_info.city_code);
	pclose(fp);
	return 0;
}

3.显示时间和天气示例

        sec=time(NULL);
		if(sec!=sec2)
		{
			sec2=sec;
			count++;
			localtime_r(&sec2,&result);//将秒单位时间转换为时间结构体
			strftime(buff,sizeof(buff),"%H:%M",&result);//时间格式化打印
			//printf("buff=%sn",buff);
			TTF_SetFontSize(ttffont,100);
			surface1=TTF_RenderUTF8_Blended(ttffont,buff,color2);
			rect.h=surface1->h;
			rect.w=surface1->w;
			rect.x=800/2-surface1->w/2;/*要显示的x起始位置*/
			rect.y=120;/*要显示的y起始位置*/
 			srcrect.h=surface1->h;
			srcrect.w=surface1->w;
			sdltext1=SDL_CreateTextureFromSurface(render,surface1);
			SDL_RenderCopy(render,sdltext2,&rect,&rect);
			SDL_RenderCopy(render,sdltext1,&srcrect,&rect);
			SDL_FreeSurface(surface1);/*释放surface*/
			SDL_DestroyTexture(sdltext1);/*释放表面*/
		
			TTF_SetFontSize(ttffont,50);
			strftime(week_buff,sizeof(week_buff),"%w",&result);
			week_cnt=atoi(week_buff);
			strftime(buff,sizeof(buff),"%Y/%m/%d 星期",&result);//时间格式化打印
			strncat(buff,week[week_cnt],sizeof(buff));
			strncat(buff," | ",sizeof(buff));
			surface2=TTF_RenderUTF8_Blended(ttffont,buff,color2);
			rect.h=surface2->h;
			rect.w=surface2->w;
			rect.x=800/2-surface2->w/2-40;/*要显示的x起始位置*/
			rect.y=240;/*要显示的y起始位置*/
			wather_x=rect.x+surface2->w;
			wather_y=rect.y;
 			srcrect.h=surface2->h;
			srcrect.w=surface2->w;
			sdltext3=SDL_CreateTextureFromSurface(render,surface2);
			SDL_RenderCopy(render,sdltext2,&rect,&rect);
			SDL_RenderCopy(render,sdltext3,&srcrect,&rect);
			SDL_FreeSurface(surface2);/*释放surface*/
			SDL_DestroyTexture(sdltext3);/*释放表面*/
			if(count>=60)/*60s获取一次天气数据*/
			{
				count=0;
				if(!Http_GetWeather())/*获取天气*/
				{
					char image[50];
					snprintf(image,sizeof(image),"./weather_photo/%d.png",weather_info.city_code);
					SDL_Surface *weather_surface=IMG_Load(image);
					if(weather_surface)
					{	
						SDL_Rect rect;
						rect.x=wather_x;
						rect.y=wather_y;
						rect.w=50;
						rect.h=50;
						srcrect.h=weather_surface->h;
						srcrect.w=weather_surface->w;
						SDL_Texture *sdltext=SDL_CreateTextureFromSurface(render,weather_surface);/*创建*/
						SDL_RenderCopy(render,sdltext2,&rect,&rect);
						SDL_RenderCopy(render,sdltext,&srcrect,&rect);
						SDL_FreeSurface(weather_surface);/*释放surface*/
						SDL_DestroyTexture(sdltext);/*释放表面*/
						/*显示温度*/
						SDL_Surface *temp_surface=TTF_RenderUTF8_Blended(ttffont,weather_info.city_temp,color2);
						SDL_Texture *temp_sdltext=SDL_CreateTextureFromSurface(render,temp_surface);
						rect.x=wather_x+50;
						rect.y=wather_y;
						srcrect.h=temp_surface->h;
						srcrect.w=temp_surface->w;
						SDL_RenderCopy(render,sdltext2,&rect,&rect);
						SDL_RenderCopy(render,temp_sdltext,&srcrect,&rect);
						SDL_FreeSurface(temp_surface);/*释放surface*/
						SDL_DestroyTexture(temp_sdltext);/*释放表面*/
					}
				}
			}
			SDL_RenderPresent(render);//更新显示
		}


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11231

    浏览量

    208937
  • SDL
    SDL
    +关注

    关注

    0

    文章

    18

    浏览量

    7387
  • 开发库
    +关注

    关注

    0

    文章

    7

    浏览量

    4860
收藏 人收藏

    评论

    相关推荐

    ESP8266简易WIFI天气时钟

    本篇介绍了http获取网络天气的基本原理,并通过实践,使用ESP8266连网获取网络天气和网络时间,借助U8g2库,在OLED上显示当前时间
    的头像 发表于 06-06 09:31 7404次阅读
    ESP8266简易WIFI<b class='flag-5'>天气</b>时钟

    SDL编译安装图片显示

    SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以
    的头像 发表于 09-29 15:54 1445次阅读
    <b class='flag-5'>SDL</b>编译安装图片<b class='flag-5'>显示</b>

    SDL显示文本

       SDL2.0库本身没有文本数据显示相关函数接口,文本显示需要编译安装SDL_ttf库。
    的头像 发表于 09-29 16:32 1965次阅读
    <b class='flag-5'>SDL</b><b class='flag-5'>显示</b>文本

    Linux下基于SDL库贪吃蛇游戏

    SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以
    的头像 发表于 12-11 14:29 3352次阅读
    Linux下基于<b class='flag-5'>SDL</b>库贪吃蛇游戏

    Windows下基于MSVC搭建SDL开发环境

    Windows下基于MSVC搭建SDL开发环境
    的头像 发表于 06-08 10:29 1522次阅读
    Windows下基于MSVC搭建<b class='flag-5'>SDL</b>开发环境

    天气预警收音机方案

    /通道/时间显示二、 LCD 全显图三、 天气广播---------------------------------------------------------------
    发表于 05-20 17:56

    SDL的交叉编译问题

    求助!!移植SDL到mini2440开发板上时,在交叉编译SDL_image进行configure之后,再make时出现如下错误:/opt/mini2440/output/lib/libSDL.so
    发表于 12-06 20:50

    移植SDL到JZ2440显示BMP图片

    LOGO的制作, 韦老师第3期讲了如何显示jpeg图片, 那么怎么显示bmp图片?这次我们借助libSDL来实现,我们先移植SDL到Ubuntu, 体验它的威力后再移植到开发板。一、移植SDL
    发表于 06-29 11:19

    OLED屏幕显示时间天气设计实现

    通过HTTP GET天气网站的API接口,将返回的Json中天气数据解析出来显示。需要显示的图标可以通过取模软件转成对应的数组工程直接编译之后只有需要配一下网,配网接口嫌麻烦,没有写,
    发表于 01-18 10:13

    STM32+ESP8266获取网络时间天气的方法

    先给出两个可以获取天气时间的网站https://www.seniverse.com/docs 可以获取天气http://api.k780.com:88/?app=life.time&
    发表于 02-18 07:56

    GUI向导编译错误,找不到“SDL2/SDL.h”文件是怎么回事?

    如何找出编译错误:找不到“SDL2/SDL.h”文件 使用 MAC OS 12.6 和最新的guy guider 版本。
    发表于 05-04 08:44

    基于SDL的自动售票系统的研发

    基于SDL 的自动售票系统的研发顾丽丽 梅杓春(南京邮电大学自动化学院,江苏南京 210003)摘要:本文简要介绍了SDL语言及其支持工具。通过设计自动售票系统实例对如何利用SDL
    发表于 12-18 11:34 21次下载

    SDL1000X系列可编程直流电子负载的产品介绍

    SDL1000X/SDL1000X-E 可编程直流电子负载配备了3.5 英寸 TFT-LCD 显示屏,拥有友好的人机交互界面和优异的性能指标,SDL1020X/
    发表于 02-18 08:00 4次下载
    <b class='flag-5'>SDL</b>1000X系列可编程直流电子负载的产品介绍

    SDL下载与配置

    点击[SDL2 核心库下载](https://libsdl.org/download-2.0.php)下载SDL2库,如下图根据编译器选择不同版本(Visual Studo系列选择第一个)。
    的头像 发表于 02-27 14:51 3036次阅读
    <b class='flag-5'>SDL</b>下载与配置

    天气预报显示开源项目

    电子发烧友网站提供《天气预报显示开源项目.zip》资料免费下载
    发表于 06-14 10:47 0次下载
    <b class='flag-5'>天气</b>预报<b class='flag-5'>显示</b>开源项目