智能镜——6.屏幕显示时间日期篇

本文档详细介绍了智能镜如何实现屏幕显示和时间日期获取。屏幕显示部分,通过串口屏通信协议控制2.19寸集成模块屏,使用自定义字符素材以图片形式展示时间日期。时间日期获取则依赖于tuyaSDK,在联网状态下获取本地时间。代码中包含了屏幕初始化、元素显示函数以及时间获取函数的实现细节。
摘要由CSDN通过智能技术生成


​ ​ ​ ​ 上一节 《自制智能镜之——应用层入口及触摸按键实现篇》介绍了有关应用层代码的结构及应用入口和触摸按键的实现等相关内容,这节来说说智能镜的屏幕显示和时间日期的获取。
​ ​ ​ ​
​ ​ ​ ​

屏幕显示

在这里插入图片描述

​ ​ ​ ​ 本demo选用的是一个块2.19寸集成模块串口屏,分辨率376x240,参照通信协议发送指令即可驱动,非常简单。不过要显示时间日期等信息,光靠屏幕内置的字库和图案所呈现的效果肯定是毫无美感的,我们需要自己准备字符素材,以一个个图片的方式实现显示效果。根据屏幕分辨率限制,将屏幕元素进行一个大致的规划,然后按照规划去搜集大小适合的图片素材:
在这里插入图片描述

收集完素材后,全部打包为bin文件烧录至屏幕模组里即可。
​ ​ ​ ​

​ ​ ​ ​ 在例程的 tuya_mirror_screen.c 里面封装了屏幕初始化函数 screen_init() 和各个元素的显示函数:screen_display_time()screen_display_week()screen_display_year()screen_display_day 等,在应用线程中调用时传入获取到的本地时间和日期即可在屏幕上显示出来。

VOID screen_init(VOID);

VOID screen_display_time(INT_T hours, INT_T mins);

VOID screen_display_week(INT_T weeks);

VOID screen_display_year(INT_T year);

VOID screen_display_battery(BATTERY_STATE state);

VOID screen_display_day(INT_T month, INT_T day);

每个图片素材烧录在屏幕flash里,显示图片时需要向屏幕模组发送包含对应图片的地址、大小和显示位置的字符串。
这里把所有地址的字符串都存在数组里,方便检索:

UINT8_T *icon_buff[] = {
   /* 0 ~ 9 and ':' */
   "2289100","2290660","2292220","2293780","2295340","2296900","2298460","2300020","2301580","2303140","2305600",

   /* character: '年'、'月'、'日' (11~13) */
   "2312464","2314264","2316064",

   /* character: '周日' ~ '周六' (14~20) */
   "2349832","2317864","2323192","2328520","2333848","2339176","2344504",

   /* '℃' and white block (21~22)*/
   "2386480","2387560",

   /* icon of condtion : sun、rain、cloud (23~25)*/

   "2241228","2249420","2258520",

   /* character of condtion : sun、rain、cloud (26~28)*/
   "2267620","2272380","2277140",

   /* icon of battery : high、medium、low、charging (29~32)*/
   "2355160","2362990","2370820","2378650",
};

以星期显示为例,根据传参值检索数组获取对应图片的地址,然后拼接成完整的字符串指令发送给屏幕模组:

VOID screen_display_week(INT_T weeks)
{
 if((weeks < 0)||(weeks > 6)) {
     return;
 }

 uint8_t data_buff[40] = {0};
 
 snprintf(data_buff,sizeof(data_buff),"FSIMG(%s,280,95,72,37,0);\r\n",icon_buff[weeks+14]);

 tuya_uart_write(uart0, data_buff, strlen(data_buff));
}

其他元素的显示也是类似的流程,完成各元素的显示函数后屏幕部分代码就基本完成了。
​ ​ ​ ​
​ ​ ​ ​

时间与日期获取

​ ​ ​ ​ 本demo通过tuya SDK的接口在联网后获取本地时间。

​ ​ ​ ​ 要获取本地时间,首先需包含头文件uni_time.h。定义一个本地时间结构体变量,然后作为传参调用uni_local_time_get()接口获取时间:

STATIC VOID mirror_date_get(VOID)
{
 if(mirror_ctrl_data.Wifi_state == connecting) {
     
     return;
 }

 POSIX_TM_S cur_time;
 if( uni_local_time_get(&cur_time) != OPRT_OK ) {
     PR_NOTICE("cant get local time");
 }

 mirror_ctrl_data.Mirror_time.sec = (UCHAR_T)cur_time.tm_sec;
 mirror_ctrl_data.Mirror_time.min = (UCHAR_T)cur_time.tm_min;
 mirror_ctrl_data.Mirror_time.hour = (UCHAR_T)cur_time.tm_hour;

 if(mirror_ctrl_data.Mirror_time.year != cur_time.tm_year) {

     mirror_ctrl_data.Mirror_time.year = (1900 + cur_time.tm_year);

 }

 if((mirror_ctrl_data.Mirror_time.mon != cur_time.tm_mon)||(mirror_ctrl_data.Mirror_time.mday != cur_time.tm_mday)) {

     mirror_ctrl_data.Mirror_time.mon= (UCHAR_T)cur_time.tm_mon;
     mirror_ctrl_data.Mirror_time.mday = (UCHAR_T)cur_time.tm_mday;

 }

 if(mirror_ctrl_data.Mirror_time.wday != cur_time.tm_wday) {
     mirror_ctrl_data.Mirror_time.wday = (UCHAR_T)cur_time.tm_wday;

 }
}

此处唯一要注意的点是年份给出的是从1900开始的数值,比如获取到cur_time.tm_year == 121 就代表是2012年。拿到了日期时间数据,就可以通过前面实现的显示函数呈现在屏幕上了。在这里插入图片描述

​ ​ ​ ​
​ ​ ​ ​

下节内容:涂鸦智能镜DEMO方案功能实现(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值