【平头哥RVB2601创意应用开发】5、OLED显示天气信息
[复制链接]
一、概述
在上一篇中已经实现了天气数据的获取,然后通过串口打印出来。
【平头哥RVB2601创意应用开发】4、cJSON获取天气信息
这一篇主要实现数据在OLED上的显示。
二、GUI库的选择与移植
对于板载的128*64的单色OLED,平头哥官方是有提供移植好的LVGL的例程的,直接拿来用就可以,非常方便。
但我把LVGL库加入到我的工程后,编译后会发现提示错误,原因写的是SRAM不足,尴尬了😅。
我这好像还啥也没干就提示不足了,那后面的功能开发问题可能就大了。
怎么办呢?
翻了一遍论坛里各位大佬的帖子,发现有大佬没有用LVGL库,而是用的u8g2的GUI库,看起来比LVGL小很多,只支持单色,那就试一试咯。
于是,按照论坛大佬的移植步骤开始移植,还好功夫不负有心人,没有花多长时间就把u8g2跑起来了。
事实也证明,u8g2确实比LVGL小很多,具体的移植方法我就不在这班门弄斧了,可以参考如下优质帖子进行移植:
【平头哥RVB2601创意应用开发】实践2-移植U8g2图形库
在这也感谢这位大佬🙇
三、在OLED三显示信息
为了做到显示和数据获取互相独立,专门为OLED显示创建了一个task,该task只负责数据的显示,有数据来就显示,没有数据来就挂起。
天气数据的获取和解析也是单独创建一个task,该task只负责数据的获取和解析,解析完成后发送给OLED task进行显示。
两个task之间通过消息队列进行数据的传输。
具体实现如下
①显示task:
void display_task_create(void)
{
aos_task_new("gui", gui_lvgl_task, NULL, 1 * 1024);
}
static void gui_lvgl_task(void *arg)
{
u8g2_t u8g2;
char queue_msg[100];
uint32_t quene_size = 100;
char temp[11];
u8g2Init(&u8g2);
draw(&u8g2);
u8g2_ClearBuffer(&u8g2);//clear all
display_str(&u8g2, 0, 8,"city:-", 1, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 0, 16,"weather:-", 1, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 0, 24,"temp:-", 1, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 0, 32,"humi:-", 1, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 0, 40,"wind:-", 1, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 0, 48,"lastUpdate:", 1, 0, u8g2_font_pcsenior_8f);
while (1) {
//check data receive
if(0 != aos_queue_is_valid(&queue_weather))
{
if(0 == aos_queue_recv(&queue_weather, 0, queue_msg, &quene_size))
{
if(queue_msg[0] == '0')//city
{
display_str(&u8g2, 40, 8,&queue_msg[1], 0, 0, u8g2_font_pcsenior_8f);
}
else if(queue_msg[0] == '1')//weather
{
display_str(&u8g2, 64, 16,&queue_msg[1], 0, 0, u8g2_font_pcsenior_8f);
}
else if(queue_msg[0] == 2)//qw
{
display_str(&u8g2, 40, 24,&queue_msg[1], 0, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 40 + (strlen(queue_msg) - 1) * 8, 24,"C", 0, 0, u8g2_font_pcsenior_8f);
}
else if(queue_msg[0] == 4)//sd
{
display_str(&u8g2, 40, 32,&queue_msg[1], 0, 0, u8g2_font_pcsenior_8f);
display_str(&u8g2, 40 + (strlen(queue_msg) - 1) * 8, 32,"%", 0, 0, u8g2_font_pcsenior_8f);
}
else if(queue_msg[0] == '3')//fl
{
display_str(&u8g2, 40, 40,&queue_msg[1], 0, 0, u8g2_font_pcsenior_8f);
}
else if(queue_msg[0] == 6)//lastUpdate
{
memcpy(temp,(const char *)&queue_msg[1],10);
temp[10] = '\0';
display_str(&u8g2, (128 - strlen(temp) * 8) >> 1, 56,temp, 0, 0, u8g2_font_pcsenior_8f);
memcpy(temp,(const char *)&queue_msg[12],8);
temp[8] = '\0';
display_str(&u8g2, (128 - strlen(temp) * 8) >> 1, 64,temp, 0, 0, u8g2_font_pcsenior_8f);
}
}
}
aos_msleep(50);
}
}
②天气信息获取和处理task:
注:当前消息获取是通过cli命令手动触发的,所以该task目前暂时没有实质性的内容,只有led的闪烁代码
static weather_task_entry(void *arg)
{
uled_init();
weather_data_init();
//crete queue for weather
if(0 != aos_queue_new(&queue_weather, queue_weather_buf, QUEUE_WETHER_SIZE, QUEUE_WETHER_SIZE))
{
printf("queue_weather error\r\n");
}
//aos_msleep(3000);
//city_code_to_city("0CH020100");
while(1)
{
aos_msleep(1000);
led_flash();
//cmd_at_client_handler();
}
}
void create_weather_task(void)
{
aos_task_new_ext(&weather_task, "weather", weather_task_entry, NULL,
2*1024, AOS_DEFAULT_APP_PRI);
}
主要思路就是以上描述的内容,话不多说,直接看一下实际效果吧:
|