- 开发背景
随着显示器件的多样化,人机交互界面也在不断地进行着变更,如今在TFT显示屏上进行图标化的功能管理已成为一种趋势,为此以ART-Pi STM32H750开发板为硬件平台,来构建一个以图标界面进行功能管理的桌面式智能家居控制系统,该系统的主要功能如图1所示,整体构成如图2所示。
图1 功能结构图
图2 整体构成图
功能规划:
RTC: 利用MCU内部的RTC实现电子时钟的计时功能,可用于定时控制固态继电器来驱动家用电器的开关。
ADC: 利用MCU内部的A/D转换器对外部的模拟量进行采集,并可绘制出数据波形图。在连接土壤湿度传感器的情况下,可对家庭养植的绿色植物进行补水控制,当然这需要小型水泵的配合。
PWM调光:利用MCU内部的定时器通过占空比的设置来控制光源的明亮程度,也可利用亮度强弱变化的呼吸灯效果来辅助睡眠。
环境温湿度检测: 使用数字式温湿度传感器DHT22对家居的温湿度状态进行检测,若配置2个DHT22的情况下,还可将2个DHT22分别放置在居室内外,以检测冬季供暖与墙体的保温性能。
环境光照度检测: 使用数字式光照度传感器BH1750对居室的日照状态进行检测,从而对日照采光情况提供一个可靠的依据。
乐曲播放: 利用MCU内部的UART向MP3功能模块来发送指令,从而对播放的乐曲加以选择。受板载按键只有一个的制约,这里只采用单键控制,若对按键加以扩展,则可实现双向的选择处理及音量的调控。
开关控制: 利用MCU的GPIO口,在连接固态继电器的情况下,可通过按键来控制家居的小电器进行开关控制,也可与RTC计时器相配合来进行定时控制电器的开关。
图像显示: 该功能要依托W25Q16之类的FLASH存储器件或是TF卡来辅助存储图片数据,受时间的制约该功能只预备了一个功能调用的接口,具体的功能实现有待于辅助存储功能的实现。
2.硬件设计
该系统的整体硬件结构如图3所示,主要由显示模块、语音模块、继电控制模块及传感器模块等组成。
图3 原理构成图
1)显示部分
显示部分是通过SPI接口的TFT屏来实现的,这样比较节省GPIO资源,其连接关系如图4所示。
2)音频播放部分
音频播放是通过MP3播放模块来实现,这样有利于节省MCU资源并可形成并行的处理关系。MP3播放模块是采用通讯方式来控制MP3播放模块。除连接5V电源外,只需将MP3播放模块的RX引脚与PA9连接。
图5 MP3播放模块引脚图
3)控制部分
为了进行电器的控制,使用带光隔的继电器模块以防止继电器对MCU的干扰,对稍大功率的电器,则使用固态继电器来控制。
4)传感器部分
为了进行物理信号的检测,可选取不同类型的传感器,例如对绿植的管控是采用土壤湿度传感器,属模拟量的传感器,相应的接口电路如图6和图7所示。此外,对数字式的传感器的使用,则可省去数值标度的麻烦,DHT22和BH1750就属于这一类型。
图6 土壤湿度检测模块接口
图7 土壤湿度传感器
5)按键部分
按键是人机交互的主要器件,为便于控制所用的是开发板上用户USER,若增添更多的处理,则需要自行扩展更多的按键。
3. 软件设计
1)界面设计
操作界面是人机交互的窗口,系统的主界面如图8所示,主要以图标的形式来标识功能,并通过文字的反显来指示待选的功能,主菜单下的相关界面如图8~图10所示。
图8 主界面
图9 RTC计时
图10 MP3播放选择
2)功能实现
在功能管理方面,是采用模块化的设计方法并通过功能函数调用来实现。在功能设计中,既涉及到外部功能模块的使用,也涉及到MCU内部的RTC、A/D、UART、GPIO等。
界面生成程序:
void jm(void)
{
LCD_Clear(WHITE);
show_tbh(20,240,0);
showhanzi16h(80,280,3,1);
showhanzi16h(80,264,4,1);
show_tbh(20,180,1);
show_tbh(20,120,2);
show_tbh(20,60,3);
showhanzi16h(80,100,5,1);
showhanzi16h(80,84,6,1);
show_tbh(120,60,4);
show_tbh(120,120,5);
show_tbh(120,180,6);
show_tbh(120,240,7);
showhanzi16h(180,280,13,1);
showhanzi16h(180,264,14,1);
showhanzi16h(180,220,11,1);
showhanzi16h(180,204,12,1);
showhanzi16h(180,160,9,1);
showhanzi16h(180,144,10,1);
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(80,160,'R',1);
LCD_ShowCharh(80,152,'T',1);
LCD_ShowCharh(80,144,'C',1);
LCD_ShowCharh(80,220,'P',1);
LCD_ShowCharh(80,212,'W',1);
LCD_ShowCharh(80,204,'M',1);
}
图标布置程序:
void show_tbh(unsigned int x,unsigned int y,unsigned int n)
{
unsigned int i,j,k;
unsigned int da;
k=0;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(n==0) da=gImage_tb[k*2];
if(n==1) da=gImage_pwm[k*2];
if(n==2) da=gImage_rtc[k*2];
if(n==3) da=gImage_a2d[k*2];
if(n==4) da=gImage_tft[k*2];
if(n==5) da=gImage_sz[k*2];
if(n==6) da=gImage_kz[k*2];
if(n==7) da=gImage_dht[k*2];
da<<=8;
if(n==0) da|=gImage_tb[k*2+1];
if(n==1) da|=gImage_pwm[k*2+1];
if(n==2) da|=gImage_rtc[k*2+1];
if(n==3) da|=gImage_a2d[k*2+1];
if(n==4) da|=gImage_tft[k*2+1];
if(n==5) da|=gImage_sz[k*2+1];
if(n==6) da|=gImage_kz[k*2+1];
if(n==7) da|=gImage_dht[k*2+1];
POINT_COLOR=da;
LCD_DrawPoint(x+i,y+j);
k++;
}
}
}
MP3乐曲选择播放程序:
if(i==0)
{
setVolume(18);
for(j=0;j<10;j++)
{
USART1->TDR=cmd6[j];
while((USART1->ISR&0X40)==0);
}
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
delay_ms(200);
LCD_Clear(WHITE);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
LCD_ShowCharh(60,280,'1',0);
LCD_ShowCharh(60,260,'-',0);
LCD_ShowCharh(80,280,'2',0);
LCD_ShowCharh(80,260,'-',0);
LCD_ShowCharh(100,280,'3',0);
LCD_ShowCharh(100,260,'-',0);
LCD_ShowCharh(120,280,'4',0);
LCD_ShowCharh(120,260,'-',0);
LCD_ShowCharh(140,280,'5',0);
LCD_ShowCharh(140,260,'-',0);
LCD_ShowCharh(160,280,'6',0);
LCD_ShowCharh(160,260,'-',0);
LCD_ShowCharh(180,280,'7',0);
LCD_ShowCharh(180,260,'-',0);
showhanzi16h(60,240,39,1);
showhanzi16h(60,220,40,1);
showhanzi16h(60,200,41,1);
showhanzi16h(80,240,19,1);
showhanzi16h(80,220,20,1);
showhanzi16h(100,240,35,1);
showhanzi16h(100,220,36,1);
showhanzi16h(100,200,37,1);
showhanzi16h(100,180,38,1);
showhanzi16h(120,240,33,1);
showhanzi16h(120,220,34,1);
showhanzi16h(140,240,29,1);
showhanzi16h(140,220,30,1);
showhanzi16h(140,200,31,1);
showhanzi16h(140,180,32,1);
showhanzi16h(160,240,21,1);
showhanzi16h(160,220,22,1);
showhanzi16h(180,240,42,1);
showhanzi16h(180,220,43,1);
j=0;
while(j<7)
{
if(KEY1==0)
{
if(j>0)
{
LCD_ShowCharh(40+20*j,300,' ',0);
LCD_ShowCharh(40+20*j,292,' ',0);
showhanzi16h(60+20*j,300,27,1);
}
else
{
showhanzi16h(60,300,27,1); // Èý½Ç + 20
}
if(j<5)
{
playn(j+1);
for(k=0;k<10;k++)
{
USART1->TDR=cmd3[k];
while((USART1->ISR&0X40)==0);
}
}
j++;
}
delay_ms(200);
}
for(k=0;k<10;k++)
{
USART1->TDR=cmd5[k];
while((USART1->ISR&0X40)==0);
}
LCD_Clear(WHITE);
jm();
showhanzi16h(180,100,7,1);
showhanzi16h(180,84,8,1);
showhanzi16h(80,280,3,0);
showhanzi16h(80,264,4,0);
}
4. 功能测试
在功能测试中,测试方法的选择是较为重要的,应加以合理地选择。
为了进行MP3播放模块的控制,可先通过虚拟串口来验证指令的发送功能,待功能得到验证后再将虚拟串口通讯改为实际的MP3模块控制能节省许多的验证时间。虚拟串口的验证效果如图11所示,说明指令发送是正确的。在连接MP3播放模块后,有效地证明了控制的有效性。
图11 Play指令测试
对RTC计时功能的测试如图12所示,对DHT22的温湿度测试如图13所示。
图12 RTC计时
图13 温湿度测试
对BH1750的照度测试如图14所示,对波形绘制功能的验证如图15所示。
图14 照度测试
图15 波形绘制功能验证
结语
尽管设计已初具规模,但受时间和技术水平的限制,还存在着待补充和完善的地方,例如STM32H750的闪存只有128K,相对来说还是比较小,要想完全达到设计目标,W25Q16和TF卡之类的外存使用还是十分必要的,它可以有效地解决图标、中文字库及数码相框的存储问题,有利于界面的美观和中文化。
视频内容:
1.硬件基本构成
2.乐曲的选择播放
3.整体的功能浏览
4.PWM调节下的呼吸灯效果: