打印
[RISC-V MCU 创新应用比赛]

MINI型多功能数码相框

[复制链接]
4264|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2021-9-28 12:26 编辑

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

图1 生肖纪年
为了感知环境的状态,还配置温湿度检测功能,其界面如图2所示。

图2 温湿度检测
      MP3音乐是一种广为使用的音频格式,将MP3的播放功能与图片显示功能结合起来,则可以更加增强它的表现力,其显示形式如图3所示。


图3 图像背景MP3播放

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

图4 数码相框

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

图5整体构成

图6实物连接

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

图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  MP3模块

图9串行接口

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

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

相应的字符显示函数为:
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color)
{
u8 temp;
u8 pos,t;
u16 x0=x;
if(x>LCD_W-16||y>LCD_H-16) return;
num=num-' ';
LCD_Address_Set(x,y,x+8-1,y+16-1);
if(!mode)
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(u16)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)LCD_WR_DATA(color);
else LCD_WR_DATA(BACK_COLOR);
temp>>=1;
x++;
}
x=x0;
y++;
}
}
else
{
for(pos=0;pos<16;pos++)
{
temp=asc2_1608[(u16)num*16+pos];
for(t=0;t<8;t++)
{
if(temp&0x01)LCD_DrawPoint(x+t,y+pos,color);
temp>>=1;
}
}
}
}

2)RTC电子时钟
在RTC电子时钟的程序设计中,主要涉及初始化函数RTC_Init( )、时间设置函数RTC_Set( )、时间读取函数RTC_Get( )及中断处理函数RTC_IRQHandler( )。
实现电子时钟的关键程序为:
if(w==1)
{
BACK_COLOR=WHITE;
LCD_ShowStringH(140,16,"RTC",RED);
LCD_ShowStringH(20,16,"key...",RED);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
LCD_ShowStringH(140,16,"   ",RED);
LCD_ShowStringH(20,16,"      ",RED);
RTC_Get();
LCD_ShowNumH(150,32,calendar.w_month,2,RED);
LCD_ShowNumH(150,56,calendar.w_date,2,RED);
LCD_ShowCharH(150,24,'-',0,RED);
LCD_ShowCharH(150,48,'-',0,RED);
LCD_ShowCharH(20,24,':',0,RED);
LCD_ShowCharH(20,48,':',0,RED);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
{
RTC_Get();
LCD_ShowNumH(20,8,calendar.hour,2,RED);
LCD_ShowNumH(20,32,calendar.min,2,RED);
LCD_ShowNumH(20,56,calendar.sec,2,RED);
if(calendar.sec==30) beep=1;
else beep=0;
Delay_Ms(500);
}
LCD_Clear(BLACK);
BACK_COLOR=BLACK;
LCD_ShowString(40,40,"PHOTO",YELLOW);
LCD_ShowString(40,60,"key...",RED);
Delay_Ms(500);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
}


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

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

...

        for(i=0;i<10;i++)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, cmd3[i]);
}
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1);
Delay_Ms(500);
}

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

图10 图片处理

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

图11提取字模

图12显示效果

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

...

while(z<256)
{
TotalCount = 100;
while ( TotalCount )
{
if ( TotalCount >(MAX_PATH_LEN-1) )  c = MAX_PATH_LEN-1;
else c = TotalCount;
mCmdParam.ByteRead.mByteCount = c;
mCmdParam.ByteRead.mByteBuffer= &buf[0];
s = CHRV3ByteRead( );
TotalCount -= mCmdParam.ByteRead.mByteCount;
for ( i=0;i!=mCmdParam.ByteRead.mByteCount; i++ )
{
LCD_WR_DATA8(buf[i]);
}
if ( mCmdParam.ByteRead.mByteCount < c )
{
break;
}
}
z++;
}
i =CHRV3FileClose( );
mStopIfError( i );

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

图13 油画效果

图14 国画效果

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

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

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


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

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

实现温湿度检测及显示的程序为:
senflag=DHT22_Init();
Delay_Us(1000);
while(DHT22_Init())
{
if(!senflag) LCD_ShowString(16,0,"DHT22 NO!",YELLOW);
else   LCD_ShowString(16,0,"DHT22 OK!",YELLOW);
senflag=DHT22_Init();
}
LCD_ShowString(16,40,"T=  . C H=  . %",YELLOW);
LCD_ShowChar(48,40,'.',0,RED);
LCD_ShowChar(112,40,'.',0,RED);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==1)
{
if(!senflag)
{
DHT22_Read_Data(&temperature,&humidity);
LCD_ShowNum(32,40,temperature/10,2,RED);
LCD_ShowNum(56,40,temperature%10,1,RED);
LCD_ShowNum(96,40,humidity/10,2,RED);
LCD_ShowNum(120,40,humidity%10,1,RED);
}
Delay_Ms(500);
}

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的刷新速度怎么样

使用这块屏速度还是很快的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

2771

帖子

38

粉丝