上期我们简单的焊接好了我们的样板之后,当然现在还少了一个开关和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刷新界面即可。