一、制作图片数组
找显示的图标,下面的网站里面是只有黑白的图
Svg Vector Icons & PNG / PSD / EPS / PNM / Free Downloads - OnlineWebFonts.COM
先添加白板背景,在设置图片尺寸 在线添加图片背景
oled显示分辨率为128*64 图片尺寸不能大于这个
制作好的图片
然后就是取模了Arduino中文社区
修改下数组名字,数组放在用户头文件下面自定义代码区间
// width: 48, height: 48
const unsigned char startp[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xe0,0x07,0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x0f,0xf0,
0x00,0x00,0x00,0x80,0x03,0xc0,0x01,0x00,0x00,0xc0,0x00,0x00,0x03,0x00,0x00,0x60,0xf8,
0x0f,0x06,0x00,0x00,0x30,0x3c,0x3c,0x0c,0x00,0x00,0x30,0x07,0xe0,0x0c,0x00,0x00,0x98,
0x0f,0xc0,0x19,0x00,0x00,0x98,0x3f,0xfc,0x19,0x00,0x00,0xd8,0x66,0x6e,0x1b,0x00,0x00,
0xd8,0x7c,0x36,0x1b,0x00,0x00,0x30,0x78,0x1e,0x0c,0x00,0x00,0x60,0x00,0x00,0x06,0x00,
0x00,0xc0,0x03,0xc0,0x03,0x00,0x00,0xe0,0xff,0xff,0x07,0x00,0x00,0xe0,0xff,0xff,0x07,
0x00,0x00,0x30,0xff,0xff,0x0c,0x00,0x00,0x38,0xf8,0x1f,0x1c,0x00,0x00,0x38,0x00,0x00,
0x1c,0x00,0x00,0x38,0x00,0x00,0x1c,0x00,0x00,0x38,0x00,0x00,0x1c,0x00,0x00,0x3c,0x00,
0x00,0x3c,0x00,0x00,0x3c,0x00,0x00,0x3c,0x00,0x00,0x3c,0x00,0x00,0x34,0x00,0x00,0x2c,
0x00,0x00,0x34,0x00,0x00,0x2c,0x00,0x00,0x34,0x00,0x00,0x6c,0x00,0x00,0x36,0x00,0x00,
0x6c,0x00,0x00,0x36,0x00,0x00,0x6c,0x00,0x00,0x36,0x00,0x00,0x4c,0x00,0x00,0x32,0x00,
0x00,0xcc,0x00,0x00,0x33,0x00,0x00,0xcc,0x00,0x00,0x33,0x00,0x00,0x8c,0x00,0x00,0x31,
0x00,0x00,0x8c,0x01,0x80,0x31,0x00,0x00,0xc8,0x01,0x80,0x13,0x00,0x00,0xd8,0x03,0xc0,
0x1b,0x00,0x00,0x58,0x06,0x60,0x1a,0x00,0x00,0x70,0x0c,0x30,0x0e,0x00,0x00,0x20,0x18,
0x18,0x04,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
这样一个图片数组就取模成功了
直接主函数调用显示
u8g2_ClearBuffer(&u8g2);//清空缓存
u8g2_DrawXBMP(&u8g2,40,0,48,48,startp);//显示图片数组
u8g2_SendBuffer(&u8g2);//发送缓存到oled
整个任务代码,包含显示进度条,i加的值可以调节进度条的速度
void StartTask(void const * argument)
{
/* USER CODE BEGIN StartTask */
/* Infinite loop */
char percentageText[20];
u8g2Init(&u8g2);//just use once in one task
for(;;)
{
vTaskSuspend(menuTaskHandle);//挂起菜单任务句柄
//显示图片
u8g2_ClearBuffer(&u8g2);
u8g2_DrawXBMP(&u8g2,40,0,48,48,startp);
u8g2_SendBuffer(&u8g2);
// Simulate loading process, increasing by 1% each time
for (int i = 10; i <= 100; i += 1) { //i from 10 start cover actual rounded
// Draw percentage text
u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
snprintf(percentageText, sizeof(percentageText), "%d%%", i);
u8g2_DrawStr(&u8g2, 95, 59, percentageText);
// Draw rounded progress bar background
u8g2_DrawRFrame(&u8g2, 10, 50, 80, 10, 3);
// Calculate actual progress bar length
uint8_t progressBarLength = (i*80)/ 100;
// Draw actual rounded progress bar
u8g2_DrawRBox(&u8g2, 10, 50,progressBarLength, 10, 3);
u8g2_SendBuffer(&u8g2);
osDelay(20);
}
// clear data update screen 立即关闭显示
u8g2_ClearBuffer(&u8g2);
u8g2_SendBuffer(&u8g2);
u8g2_UpdateDisplay(&u8g2);
vTaskResume(menuTaskHandle);//恢复菜单任务
vTaskDelete(startTaskHandle);//删除自己
}
/* USER CODE END StartTask */
}
freertos.c中初始化任务
/* USER CODE BEGIN PTD */
u8g2_t u8g2; // a structure which will contain all the data for one display
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF);
return ch;
}
void ui_show(uint8_t x,uint8_t y){
u8g2_DrawXBMP(&u8g2,1,1,30,30,clockp);
u8g2_DrawXBMP(&u8g2,33,1,30,30,wifip);
u8g2_DrawXBMP(&u8g2,65,1,30,30,tempp);
u8g2_DrawXBMP(&u8g2,97,1,30,30,humip);
u8g2_DrawXBMP(&u8g2,1,33,30,30,misicp);
u8g2_DrawXBMP(&u8g2,33,33,30,30,smockp);
u8g2_DrawXBMP(&u8g2,65,33,30,30,lightp);
u8g2_DrawXBMP(&u8g2,97,33,30,30,waterp);
u8g2_DrawRFrame(&u8g2, x, y, 32, 32, 2);
u8g2_SendBuffer(&u8g2);
}
int run_str(int *now,int *trag,const int speed,const int c_speed)
{
int temp = 0;
if (*now > *trag)
{
temp = ((*now - *trag) > c_speed) ? speed : c_speed;
*now -= temp;
}
else if (*now < *trag)
{
temp = ((*trag - *now) > c_speed) ? speed : c_speed;
*now += temp;
}
else
{
return 1;
}
return 0;
}
/* USER CODE END PTD */
菜单任务
void MenuTask(void const * argument)
{
/* USER CODE BEGIN MenuTask */
/* Infinite loop */
char tempText[20];
char humiText[20];
char displayText[10];
int x=0,x_t=0,y=0,flag=0;
int sedmu=0;
uint8_t temp=55,humi=55;
//MyMessage receivemessage;
for(;;)
{ osDelay(20);
// 接收消息从消息队列
// if (xQueueReceive(xQueue, &receivemessage, portMAX_DELAY) == pdPASS&&sedmu==0) {
// receivedMessage 包含了发送的消息数据
// u8g2_ClearBuffer(&u8g2);
//主页菜单
// // Show humi and temp
// u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
// snprintf(tempText, sizeof(tempText), "Smock: %d",temp);
// u8g2_DrawStr(&u8g2, 4, 10, tempText);
// snprintf(humiText, sizeof(humiText), "Power: %d",humi);
// u8g2_DrawStr(&u8g2, 68, 10, humiText);
// snprintf(tempText, sizeof(tempText), "Light: %d",temp);
// u8g2_DrawStr(&u8g2, 8, 61, tempText);
// snprintf(humiText, sizeof(humiText), "Water: %d",humi);
// u8g2_DrawStr(&u8g2, 70, 61, humiText);
//
// u8g2_DrawFrame(&u8g2, 0, 0, 128, 64);
// // 绘制线条
// u8g2_DrawLine(&u8g2, 0, 13, 128, 13);
// u8g2_DrawLine(&u8g2, 64, 0, 64, 13);
// // 绘制线条
// u8g2_DrawLine(&u8g2, 0, 51, 128, 51);
// u8g2_DrawLine(&u8g2, 64, 64, 64, 51);
//
// u8g2_DrawXBMP(&u8g2,16,18,30,30,humip);
// u8g2_SetFont(&u8g2, u8g2_font_10x20_mf);
// snprintf(humiText, sizeof(humiText), "%d%%", humi);
// u8g2_DrawStr(&u8g2, 54, 40, humiText);
// u8g2_SendBuffer(&u8g2);
// }
//列表菜单
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
flag ++;
if(flag>3)
{flag=0;}
}
}
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==0){
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==0){
flag--;
if(flag<0)
{flag=3;}
}
}
switch(flag){
case 1:x=0,x_t=13;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,1,0);break;
case 2:x=13,x_t=26;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,1,0);break;
case 3:x=26,x_t=0;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,1,0);break;
default: break;
}
u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
u8g2_DrawStr(&u8g2, 10, 12, "Clock");
u8g2_DrawStr(&u8g2,10,24, "Hour");
u8g2_DrawStr(&u8g2,10,36, "Min");
u8g2_DrawRFrame(&u8g2, 0, x, 128, 14,3);
u8g2_SendBuffer(&u8g2);
//图形菜单
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// osDelay(18);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// sedmu=1;
// }
// }
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// osDelay(200);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// sedmu=0;
// }
// }
// u8g2_ClearBuffer(&u8g2);
// int i=1,j=3;
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// osDelay(20);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==0){
// flag ++;
// if(flag>8)
// {flag=0;}
// }
// }
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==0){
// osDelay(20);
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==0){
// flag--;
// if(flag<0)
// {flag=8;}
//
// }
// }
// switch(flag){
// case 1:x=0,x_t=32;y=0;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 2:x=32,x_t=64;y=0;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 3:x=64,x_t=96;y=0;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 4:x=96,x_t=0;y=0;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 5:x=0,x_t=32;y=32;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 6:x=32,x_t=64;y=32;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 7:x=64,x_t=96;y=32;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// case 8:x=96,x_t=0;y=32;u8g2_ClearBuffer(&u8g2);run_str(&x,&x_t,i,j);break;
// default: break;
// }
// ui_show(x,y);
}
/* USER CODE END MenuTask */
}
主页菜单
图形菜单
列表菜单