~滴答滴答,瓦力的身体已经基本完成,是时候给它注入灵魂了~
停了蛮久的没有更新U8g2图形库的系列博客了,最近又加了一点小功能,在这里记录一下,同时把自己的一些经验分享给大家,本次功能硬件实现是使用了Tlite RC遥控和U8g2 UI页面显示实现在线调节系统参数的功能(可以实现对正负7位整数或者最高万位带两位小数的浮点型数据进行修改编辑),所用到的硬件如下:
(脑壳子裸露的瓦力。。。力,,,力 )
(这是瓦力隔壁家的小弟弟,暂时叫它“初一” )
整点小视频来看看~~
(为了让你们看清楚,我自觉躺平了~~~ )
本次功能软件实现都是基于U8g2原有的u8g2_UserInterfaceInputValue()函数实现,具体实现代码如下:
uint8_t u8g2_UserInterfaceInputValue(u8g2_t *u8g2, const char *title, const char *pre, float *value, uint8_t type, uint8_t digits, const char *post)
{
uint8_t line_height;
uint8_t height;
u8g2_uint_t pixel_height;
u8g2_uint_t y, yy;
u8g2_uint_t pixel_width;
u8g2_uint_t x, xx;
int32_t lo = -9999999;
int32_t hi = 9999999;
int32_t local_value = 0;
if (type == MAV_PARAM_TYPE_REAL32)
local_value = *((float *)value)*pow(10, DOT_INDEX);
else
local_value = *((int32_t *)value);
u8g2_int_t digit_index = 0;
//uint8_t r; /* not used ??? */
uint8_t event;
/* only horizontal strings are supported, so force this here */
u8g2_SetFontDirection(u8g2, 0);
/* force baseline position */
u8g2_SetFontPosBaseline(u8g2);
/* calculate line height */
line_height = u8g2_GetAscent(u8g2);
line_height -= u8g2_GetDescent(u8g2);
/* calculate overall height of the input value box */
height = 1; /* value input line */
height += u8x8_GetStringLineCnt(title);
/* calculate the height in pixel */
pixel_height = height;
pixel_height *= line_height;
/* calculate offset from top */
y = 0;
if ( pixel_height < u8g2_GetDisplayHeight(u8g2) )
{
y = u8g2_GetDisplayHeight(u8g2);
y -= pixel_height;
y /= 2;
}
/* calculate offset from left for the label */
x = 0;
pixel_width = u8g2_GetUTF8Width(u8g2, pre);
//pixel_width += u8g2_GetUTF8Width(u8g2, "0") * digits;
if (type == MAV_PARAM_TYPE_REAL32)
pixel_width += u8g2_GetUTF8Width(u8g2, "0") * DIGIT_LEN+1;
else
pixel_width += u8g2_GetUTF8Width(u8g2, "0") * DIGIT_LEN;
pixel_width += u8g2_GetUTF8Width(u8g2, post);
if ( pixel_width < u8g2_GetDisplayWidth(u8g2) )
{
x = u8g2_GetDisplayWidth(u8g2);
x -= pixel_width;
x /= 2;
}
/* event loop */
for(;;)
{
u8g2_FirstPage(u8g2);
do
{
/* render */
yy = y;
yy += u8g2_DrawUTF8Lines(u8g2, 0, yy, u8g2_GetDisplayWidth(u8g2), line_height, title);
xx = x;
xx += u8g2_DrawUTF8(u8g2, xx, yy, pre);
if (type == MAV_PARAM_TYPE_REAL32)
{
if (digit_index>=DOT_INDEX)
xx += u8g2_DrawUTF8Inv(u8g2, xx, yy, u8x8_floattoa(local_value, DOT_INDEX), DIGIT_LEN-digit_index);
else
xx += u8g2_DrawUTF8Inv(u8g2, xx, yy, u8x8_floattoa(local_value, DOT_INDEX), DIGIT_LEN+1-digit_index);
}
else
xx += u8g2_DrawUTF8Inv(u8g2, xx, yy, u8x8_int32toa(local_value), DIGIT_LEN-digit_index);
u8g2_DrawUTF8(u8g2, xx, yy, post);
} while( u8g2_NextPage(u8g2) );
#ifdef U8G2_REF_MAN_PIC
return 0;
#endif
for(;;)
{
event = u8x8_GetMenuEvent(u8g2_GetU8x8(u8g2));
if ( event == U8X8_MSG_GPIO_MENU_SELECT )
{
if (type == MAV_PARAM_TYPE_REAL32)
{
*((float *)value) = local_value/pow(10, DOT_INDEX);
ESP_LOGI(TAG, "value=%f", *((float *)value));
}
else
{
*((uint32_t *)value) = local_value;
ESP_LOGI(TAG, "value=%d", *((uint32_t *)value));
}
return 1;
}
else if ( event == U8X8_MSG_GPIO_MENU_HOME )
{
return 0;
}
else if ( event == U8X8_MSG_GPIO_MENU_NEXT)
{
if ( digit_index < (DIGIT_LEN-1) )
digit_index++;
else
digit_index = 0;
break;
}
else if ( event == U8X8_MSG_GPIO_MENU_PREV)
{
if ( digit_index > 0 )
digit_index--;
else
digit_index = (DIGIT_LEN-1);
break;
}
else if ( event == U8X8_MSG_GPIO_MENU_UP )
{
#if 0
if ( local_value >= hi )
local_value = lo;
else
local_value++;
#else
if ( digit_index == (DIGIT_LEN-1) )
{
local_value = -local_value;
}
else
{
local_value += pow(10, digit_index);
if ( local_value > hi )
local_value = hi;
}
#endif
if (type == MAV_PARAM_TYPE_REAL32)
{
*((float *)value) = local_value/pow(10, DOT_INDEX);
ESP_LOGI(TAG, "value=%f", *((float *)value));
}
else
{
*((uint32_t *)value) = local_value;
ESP_LOGI(TAG, "value=%d", *((uint32_t *)value));
}
break;
}
else if ( event == U8X8_MSG_GPIO_MENU_DOWN )
{
#if 0
if ( local_value <= lo )
local_value = hi;
else
local_value--;
#else
if ( digit_index == (DIGIT_LEN-1) )
{
local_value = -local_value;
}
else
{
local_value -= pow(10, digit_index);
if ( local_value < lo )
local_value = lo;
}
#endif
if (type == MAV_PARAM_TYPE_REAL32)
{
*((float *)value) = local_value/pow(10, DOT_INDEX);
ESP_LOGI(TAG, "value=%f", *((float *)value));
}
else
{
*((uint32_t *)value) = local_value;
ESP_LOGI(TAG, "value=%d", *((uint32_t *)value));
}
break;
}
}
}
/* never reached */
//return r;
}
以下是一些和本文相关的文章链接和U8g2的wiki链接:
一、~~呆萌的瓦力平衡机器人~~链接:
二、 ~~U8g2图形库使用技巧记录~~链接:
三、U8g2 wiki链接:
1.U8g2_wiki;
下一步计划:
~~现阶段已经实现了实用的参数编辑功能,同时平衡车的基本功能也大致完成,后续就可以整些花活了,目前刷新的帧率还可以,下一步可以考虑加入一些机器人的动画表情了,是的,要做个有表情的呆萌平衡机器人了~~
大家如果也感兴趣,可以加qun交流学习(群里提供了丰富的esp32资料):
燃起来吧 !!!!!!