加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

【RT-Thread作品秀】桌面式智能家居控制系统

2021/01/05
1036
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
方块图(6)
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱
  1. 开发背景

随着显示器件的多样化,人机交互界面也在不断地进行着变更,如今在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所示。

图4  TFT显示电路原理图

   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调节下的呼吸灯效果:

 

 

 

 

 

 

  • T.jpg
    描述:关键器件引脚连接
  • main.c
    描述:系统主程序

相关推荐

电子产业图谱