U8g2图形库使用技巧记录(3)

~滴答滴答,瓦力的身体已经基本完成,是时候给它注入灵魂了~

        停了蛮久的没有更新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链接:

一、~~呆萌的瓦力平衡机器人~~链接:

        1.基于ESP32双无刷FOC电机的瓦力平衡机器人(1)

        2.基于ESP32双无刷FOC电机的瓦力平衡机器人(2)

二、 ~~U8g2图形库使用技巧记录~~链接:

        1.U8g2图形库使用技巧记录(1)

        2.U8g2图形库使用技巧记录(2)

        3.U8g2图形库使用技巧记录(3)

三、U8g2 wiki链接:

        1.U8g2_wiki

下一步计划:
        ~~现阶段已经实现了实用的参数编辑功能,同时平衡车的基本功能也大致完成,后续就可以整些花活了,目前刷新的帧率还可以,下一步可以考虑加入一些机器人的动画表情了,是的,要做个有表情的呆萌平衡机器人了~~

                     大家如果也感兴趣,可以加qun交流学习(群里提供了丰富的esp32资料):

                               

                                                            燃起来吧 !!!!!!
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于u8g2库在STM32上的使用,以下是一般的步骤: 1. 首先,确保您的STM32开发板已连接到您的计算机,并且您已经安装了适当的开发环境(如Keil、STM32CubeIDE等)。 2. 下载u8g2库的最新版本,可以从u8g2官方网站(https://github.com/olikraus/u8g2)上找到源代码。 3. 将下载的库文件解压缩,并将u8g2文件夹复制到您的项目目录中。 4. 打开您的开发环境,并创建一个新的STM32项目。 5. 在您的项目中包含u8g2库的头文件。根据您的开发环境不同,可能有不同的方法。例如,在Keil中,您可以通过右键单击项目->Options for Target->C/C++选项卡->Include Paths and Symbols来添加路径。 6. 在您的代码中,使用合适的接口初始化u8g2库。根据您使用显示设备类型(如OLED、LCD等),选择适当的初始化函数。例如,如果您使用I2C接口的OLED显示屏,可以使用以下代码进行初始化: ```c #include "u8g2.h" u8g2_t u8g2; void u8g2_init(void) { u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_stm32cube_hal); u8x8_SetI2CAddress(&u8g2.u8x8, 0x78); u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); } ``` 7. 使用u8g2库提供的函数来控制显示设备。例如,您可以使用以下代码在屏幕上绘制文本: ```c u8g2_DrawStr(&u8g2, 0, 10, "Hello, World!"); u8g2_SendBuffer(&u8g2); ``` 这是一个简单的示例,演示了如何在STM32上使用u8g2库。您可以根据自己的需求使用其他u8g2库的功能和函数来绘制图形、显示图像等。 希望这可以帮助到您!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值