极客秀
搜索

STM32移植U8G2让我的光强计界面更加丝滑

上期我们简单的焊接好了我们的样板之后,当然现在还少了一个开关和PMOS,不过整体已经能用了,但是还还只是非常简陋的界面。

本期呢,我们移植U8g2图像库,话不多说看看效果,当然本期的源码也可以直接使用,在STM32F103C8T6,可以在主页查看QQ群获取。
U8G2是一个用于嵌入式系统的图形库,特别适用于微控制器和单片机。这个库支持大量的显示屏,如OLED、LCD和ePaper显示屏,并且以其高效、易用和广泛兼容性而闻名。

  • 广泛的硬件支持

    • U8G2支持众多不同型号的显示屏,如SSD1306、SH1106、ST7920、UC1701等。这使得它在硬件选择上非常灵活。
  • 多种接口支持

    • U8G2可以通过I2C、SPI和并行接口与显示屏通信,兼容性极高。
  • 多种字体和图形功能

    • 提供了丰富的字体库,包括多种比例字体和符号字符。

    • 支持基本图形绘制功能,如点、线、矩形、圆形、多边形等。

  • 高效的内存管理

    • U8G2具有两种绘图模式:全缓冲和页面缓冲。全缓冲模式适用于内存充足的情况,而页面缓冲模式则适用于内存有限的嵌入式系统。
  • 广泛的微控制器支持

    • U8G2可以在各种微控制器平台上运行,如Arduino、STM32、ESP8266、ESP32、AVR等。
  • 开放源代码

    • U8G2是一个开源项目,可以自由获取和修改源代码,以适应特定项目需求。

本期我们主要的内容如下:

  • 移植OPT3001光强传感器的内容

  • 移植U8G2图像库

  • 精简化U8G2

  • 编写GUI代码

移植和精简化U8g2,这里不详细赘述了,网上有很多的教程 。
接着就是编写我们的GUI代码。


//进度条显示void testDrawProcess(u8g2_t *u8g2){  for(int i=10;i<=80;i=i+2)  {    u8g2_ClearBuffer(u8g2);           char buff[20];    sprintf(buff,"%d%%",(int)(i/80.0*100));        u8g2_SetFont(u8g2,u8g2_font_ncenB12_tf);    u8g2_DrawStr(u8g2,16,32,"Lux meter");//字符显示        u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);    u8g2_DrawStr(u8g2,100,49,buff);//当前进度显示        u8g2_DrawRBox(u8g2,16,40,i,10,4);//圆角填充框矩形框    u8g2_DrawRFrame(u8g2,16,40,80,10,4);//圆角矩形    if(i%10==0)    {      HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0<<(i/10-1));    }    u8g2_SendBuffer(u8g2);  
  }  HAL_Delay(250);  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);  HAL_Delay(250);  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);  HAL_Delay(250);  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_All);}

首当其冲的是初始化界面,虽然这段内容是冗余的没有用,但是帅就完事了。


uint32_t Lux;  
void MainGUI(u8g2_t *u8g2){    int t = 1000;  int x = 16;  int y = 32;  int w = 50;  int h = 20;  char buff[20];  u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);  u8g2_ClearBuffer(u8g2);  u8g2_DrawStr(u8g2,5, 15, "Light Intensity");  u8g2_DrawStr(u8g2,95, 15, "High");  u8g2_DrawStr(u8g2,95, 60, "Low");  u8g2_DrawRFrame(u8g2, 0, 0, 92, 23,6);  B_LUX_40_GetLux(&Lux);  u8g2_SetFont(u8g2, u8g2_font_ncenB12_tr); // 设置字体为 ncenB14    
    if(Lux<1000)  {    Level = 1;  }  else if(Lux < 7000)  {    Level = 2;  }  else if(Lux < 15000)  {    Level = 3;  }  else if(Lux <33000)  {    Level = 4;  }  else if(Lux <78000)  {    Level = 5;  }  else if(Lux <170000)  {    Level = 6;  }  else if(Lux <290000)  {    Level = 7;  }  else  {    Level = 8;  }        sprintf(buff,"%6.0luLux",(long)Lux);  u8g2_DrawStr(u8g2,0,40,buff);  sprintf(buff,"LeveL:%d",Level);  u8g2_DrawStr(u8g2,7,60,buff);    if(Level>=8)  {    u8g2_DrawBox(u8g2, 104, 21, 8, 5);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,1);    }  else  {    u8g2_DrawFrame(u8g2, 104, 21, 8, 5);  }  if(Level>=7 &&Level<8)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,1);    u8g2_DrawBox(u8g2, 95, 24, 8, 5);    }  else  {      u8g2_DrawFrame(u8g2, 95, 24, 8, 5);  
  }    if(Level>=6&&Level<7)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_6,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5,1);  u8g2_DrawBox(u8g2, 95, 29, 8, 5);    }  else  {          u8g2_DrawFrame(u8g2, 95, 29, 8, 5);  
  }    if(Level>=5&&Level<6)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,1);  u8g2_DrawBox(u8g2, 104, 32, 8, 5);    }  else  {          u8g2_DrawFrame(u8g2, 104, 32, 8, 5);  
  }    if(Level>=4&&Level<5)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,1);      u8g2_DrawBox(u8g2, 113, 35, 8, 5);  }  else  {      u8g2_DrawFrame(u8g2, 113, 35, 8, 5);  
  }    if(Level>=3&&Level<4)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,1);      u8g2_DrawBox(u8g2, 113, 40, 8, 5);  }  else  {      u8g2_DrawFrame(u8g2, 113, 40, 8, 5);  
  }    if(Level>=2&&Level<3)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1,1);    u8g2_DrawBox(u8g2, 104, 43, 8, 5);  }  else  {    u8g2_DrawFrame(u8g2, 104, 43, 8, 5);  }    if(Level>=1&&Level<2)  {    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,0);    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);    u8g2_DrawBox(u8g2, 95, 45, 8, 5);  }  else  {    u8g2_DrawFrame(u8g2, 95, 45, 8, 5);  }}

其次是主界面的内容,包含着光强数据,标签,一些代表光强等级的小格子以及获取光强信号进行处理。

在main函数中初始化U8g2以及OPT3001刷新界面即可。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容