[RISC-V MCU 创新应用比赛] MINI型多功能数码相框

[复制链接]
 楼主| jinglixixi 发表于 2021-9-28 11:58 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2021-9-28 12:26 编辑

      CH32V103开发板较之其他开发板的最大特色就在与它的U盘读写特色,且通过了相应文件系统的支持,这为它的应用提供了极大的便利。
该MINI型多功能数码相框,正是建立在这个基础之上,以U盘来存储大量的图片信息等。为了能展示图片的原貌,是以0.96寸的色彩OLED屏为显示器件。此外,在数码相框的基础上还添加一些相关的功能,使其功能改为多样化。
      生肖纪年是天干地支纪年的一个变种形式,天干地支纪年是60年一个甲子的循环周期,而生肖纪年则是以生肖来替代十二地支来纪年,故十二年一个轮回。将RTC计时同生肖结合起来,则是本设计的特色之一,其显示形式如图1所示。在配接蜂鸣器的情况下,还能起到定时闹钟的作用。
1.jpg
图1 生肖纪年
为了感知环境的状态,还配置温湿度检测功能,其界面如图2所示。
2.jpg
图2 温湿度检测
      MP3音乐是一种广为使用的音频格式,将MP3的播放功能与图片显示功能结合起来,则可以更加增强它的表现力,其显示形式如图3所示。
3.jpg

图3 图像背景MP3播放

      当然,设计的主体就是数码相框功能了,其显示形式如图4所示。
4.jpg
图4 数码相框

1. 硬件设计
该设计的整体构成如图5所示,相应的线路连接如图6所示。
5.jpg
图5整体构成
6.jpg
图6实物连接

该设计的操控流程如图7所示,功能间的切换提供板上的按键来控制。
7.jpg
图7操控流程

在线路中,各器件与开发板的连接关系如下:
1)OLED 屏
OLED 屏是一种SPI接口的彩色显示器件,其中SCK连接PA2、SDI连接PA3、RST连接PB3、DC连接PB4、
CS连接PB5。
2)DHT22传感器
DHT22温湿度传感器属单总线器件,其DIN引脚是与PB6相连。
3)MP3模块
MP3模块的引脚排列如图8所示,使用时只需将RX引脚与PA9连接即可。
8.jpg
图8  MP3模块
9.jpg
图9串行接口

4)按键
外置的按键是一种触摸式器件,其连接的引脚为PA4。
5)蜂鸣器
为了在指定时间提示使用者,是用有源蜂鸣器作为提示器件,其连接的引脚为PA5。

2. 软件设计
1)OLED 屏显示驱动
为驱动OLED屏的显示,其连接的引脚需进行输入输出功能的配置,它是由引脚配置函数来完成。
该配置函数为:
  1. void App_OledInit(void)
  2. {
  3. GPIO_InitTypeDef  GPIO_InitStructure;
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8. GPIO_Init(GPIOB, &GPIO_InitStructure);
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13. GPIO_Init(GPIOA, &GPIO_InitStructure);
  14. GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);
  15. }

相应的字符显示函数为:
  1. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color)
  2. {
  3. u8 temp;
  4. u8 pos,t;
  5. u16 x0=x;
  6. if(x>LCD_W-16||y>LCD_H-16) return;
  7. num=num-' ';
  8. LCD_Address_Set(x,y,x+8-1,y+16-1);
  9. if(!mode)
  10. {
  11. for(pos=0;pos<16;pos++)
  12. {
  13. temp=asc2_1608[(u16)num*16+pos];
  14. for(t=0;t<8;t++)
  15. {
  16. if(temp&0x01)LCD_WR_DATA(color);
  17. else LCD_WR_DATA(BACK_COLOR);
  18. temp>>=1;
  19. x++;
  20. }
  21. x=x0;
  22. y++;
  23. }
  24. }
  25. else
  26. {
  27. for(pos=0;pos<16;pos++)
  28. {
  29. temp=asc2_1608[(u16)num*16+pos];
  30. for(t=0;t<8;t++)
  31. {
  32. if(temp&0x01)LCD_DrawPoint(x+t,y+pos,color);
  33. temp>>=1;
  34. }
  35. }
  36. }
  37. }

2)RTC电子时钟
在RTC电子时钟的程序设计中,主要涉及初始化函数RTC_Init( )、时间设置函数RTC_Set( )、时间读取函数RTC_Get( )及中断处理函数RTC_IRQHandler( )。
实现电子时钟的关键程序为:
  1. if(w==1)
  2. {
  3. BACK_COLOR=WHITE;
  4. LCD_ShowStringH(140,16,"RTC",RED);
  5. LCD_ShowStringH(20,16,"key...",RED);
  6. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
  7. LCD_ShowStringH(140,16,"   ",RED);
  8. LCD_ShowStringH(20,16,"      ",RED);
  9. RTC_Get();
  10. LCD_ShowNumH(150,32,calendar.w_month,2,RED);
  11. LCD_ShowNumH(150,56,calendar.w_date,2,RED);
  12. LCD_ShowCharH(150,24,'-',0,RED);
  13. LCD_ShowCharH(150,48,'-',0,RED);
  14. LCD_ShowCharH(20,24,':',0,RED);
  15. LCD_ShowCharH(20,48,':',0,RED);
  16. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
  17. {
  18. RTC_Get();
  19. LCD_ShowNumH(20,8,calendar.hour,2,RED);
  20. LCD_ShowNumH(20,32,calendar.min,2,RED);
  21. LCD_ShowNumH(20,56,calendar.sec,2,RED);
  22. if(calendar.sec==30) beep=1;
  23. else beep=0;
  24. Delay_Ms(500);
  25. }
  26. LCD_Clear(BLACK);
  27. BACK_COLOR=BLACK;
  28. LCD_ShowString(40,40,"PHOTO",YELLOW);
  29. LCD_ShowString(40,60,"key...",RED);
  30. Delay_Ms(500);
  31. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
  32. }


3)MP3播放控制
进行MP3播放控制的关键函数有2个,即指定乐曲的播放函数playn()和音量调节函数setVolume( )。
实现背景与MP3播放内容同步的关键程序为:
  1. if(w>=18)
  2. {
  3. LCD_Clearl(BLACK);  // 清提示框
  4. Delay_Ms(200);
  5. //歌曲设置
  6. j=w-17;
  7. playn(j);
  8. LCD_ShowNum(20,0,j,2,YELLOW);
  9. LCD_ShowChar(40,0,'-',0,YELLOW);
  10. if(j==1)
  11. {
  12. //澎湖湾
  13. LCD_ShowChinese(50,0,12,16,YELLOW);
  14. LCD_ShowChinese(70,0,13,16,YELLOW);
  15. LCD_ShowChinese(90,0,14,16,YELLOW);
  16. }

  17.        if(j==2)
  18. {
  19. //放心去飞
  20. LCD_ShowChinese(50,0,17,16,YELLOW);
  21. LCD_ShowChinese(70,0,18,16,YELLOW);
  22. LCD_ShowChinese(90,0,19,16,YELLOW);
  23. LCD_ShowChinese(110,0,20,16,YELLOW);
  24. }

  25. ...

  26.         for(i=0;i<10;i++)
  27. {
  28. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  29. USART_SendData(USART1, cmd3[i]);
  30. }
  31. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
  32. Delay_Ms(500);
  33. }

4)图片制备与字模提取
为了使图片与显示屏的尺寸相匹配,可使用工具软件加以处理,其处理如图10所示。
10.jpg
图10 图片处理

在了在屏幕上显示中文信息,可用字模提取软件来获得,其处理如图11所示。
11.jpg
图11提取字模
12.jpg
图12显示效果

5)图像显示
实现指定图像文件显示的关键程序如下:
  1. LCD_Address_Set(0,0,159,79);
  2. if(w==1) strcpy( (PCHAR)mCmdParam.Open.mPathName, "ZS.BIN" );
  3. if(w==2) strcpy( (PCHAR)mCmdParam.Open.mPathName, "CN.BIN" );

  4. ...

  5. while(z<256)
  6. {
  7. TotalCount = 100;
  8. while ( TotalCount )
  9. {
  10. if ( TotalCount >(MAX_PATH_LEN-1) )  c = MAX_PATH_LEN-1;
  11. else c = TotalCount;
  12. mCmdParam.ByteRead.mByteCount = c;
  13. mCmdParam.ByteRead.mByteBuffer= &buf[0];
  14. s = CHRV3ByteRead( );
  15. TotalCount -= mCmdParam.ByteRead.mByteCount;
  16. for ( i=0;i!=mCmdParam.ByteRead.mByteCount; i++ )
  17. {
  18. LCD_WR_DATA8(buf[i]);
  19. }
  20. if ( mCmdParam.ByteRead.mByteCount < c )
  21. {
  22. break;
  23. }
  24. }
  25. z++;
  26. }
  27. i =CHRV3FileClose( );
  28. mStopIfError( i );

其处理的思想是让显示指针依序打开相应的文件,然后按指定字节数提取所显示图像的数据,从而再现原图像的内容。
13.jpg
图13 油画效果
14.jpg
图14 国画效果

6)生肖图匹配处理
为了实现显示的内容与生肖纪年的一致,其匹配处理程序如下:
  1. if(w==0)
  2. {
  3. RTC_Get();
  4. j=calendar.w_year-2019;
  5. w=j;
  6. F=1;
  7. }

其处理的思想是通过当前的年份推算出它在生肖纪年中的位置,然后让显示图像的指针指向该生肖图即可。

7)音量调节处理
在音乐播放过程中,可通过触摸按键来调节音量。
音量调节处理的程序为:
  1. k=26;
  2. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
  3. {
  4. if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)==1)
  5. {
  6. k++;
  7. if(k>=32)   k=10;
  8. LCD_ShowNum(130,60,k,2,YELLOW);
  9. setVolume(k);
  10. for(i=0;i<10;i++)
  11. {
  12. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  13. USART_SendData(USART1, cmd6[i]);
  14. }
  15. }
  16. Delay_Ms(500);
  17. }


其处理的思想是设计一个音量计时器,在按下按键时音量值增大。当音量值达到边界时,则开始从小音量再次增大调节,从而只需一个键即可实现音量增减的调节处理功能。

8)DHT22温湿度检测
DHT22是一种数字式的传感器,相当于DHT11来说精度会高一些,可到小数位。此外,其检测范围也更宽一些。
读取温湿度的函数为:
  1. uint8_t DHT22_Read_Data(uint16_t *temp,uint16_t *humi)
  2. {
  3. uint8_t buf[5];
  4. uint8_t i;
  5. DHT22_Rst();
  6. if(DHT22_Check()==0)
  7. {
  8. for(i=0;i<5;i++)
  9. {
  10. buf[i]=DHT22_Read_Byte();
  11. }
  12. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  13. {
  14. *humi=(buf[0]*256+buf[1]);
  15. *temp=(buf[2]*256+buf[3]);
  16. }
  17. }else return 1;
  18. return 0;
  19. }

实现温湿度检测及显示的程序为:
  1. senflag=DHT22_Init();
  2. Delay_Us(1000);
  3. while(DHT22_Init())
  4. {
  5. if(!senflag) LCD_ShowString(16,0,"DHT22 NO!",YELLOW);
  6. else   LCD_ShowString(16,0,"DHT22 OK!",YELLOW);
  7. senflag=DHT22_Init();
  8. }
  9. LCD_ShowString(16,40,"T=  . C H=  . %",YELLOW);
  10. LCD_ShowChar(48,40,'.',0,RED);
  11. LCD_ShowChar(112,40,'.',0,RED);
  12. while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
  13. {
  14. if(!senflag)
  15. {
  16. DHT22_Read_Data(&temperature,&humidity);
  17. LCD_ShowNum(32,40,temperature/10,2,RED);
  18. LCD_ShowNum(56,40,temperature%10,1,RED);
  19. LCD_ShowNum(96,40,humidity/10,2,RED);
  20. LCD_ShowNum(120,40,humidity%10,1,RED);
  21. }
  22. Delay_Ms(500);
  23. }

3. 功能测试与演示
1)各功能模块的独立测试
2)模块间的联合调试

4.演示动画:
网址:https://v.youku.com/v_show/id_XNTgwOTY2ODA0MA==.html

5.设计特色:
1)采用生肖纪年式日历,具有多种定时提示功能。
2)温湿度检测
3)带背景语音播放,可音量播放调节。
4)体积小巧,播放内容易于更新。

结束语:
      该设计的近期改进方向是实现文本参数的提取以实现多时段提示功能,以免除键入参数的问题,从而通过编辑参数文件来达到目的。在MP3播放方面,应添加中文歌词的显示功能等。
      在整体设计的体积上,争取进一步小型化使之成为一款便携式的产品。远期的改进方向是使之成为一个靠串口指令来控制的多媒体播放器。
再次感谢有此次这么好的活动和这么好的开发板,能使设计目标得以实现!

hilahope 发表于 2022-10-10 20:59 | 显示全部楼层
CH32V103的刷新速度怎么样   
 楼主| jinglixixi 发表于 2022-10-11 08:14 | 显示全部楼层
hilahope 发表于 2022-10-10 20:59
CH32V103的刷新速度怎么样

使用这块屏速度还是很快的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部