3853|0

1578

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

基于GD32F350的图标界面式控制系统 [复制链接]

本帖最后由 jinglixixi 于 2018-10-18 20:46 编辑

1.开发背景
       随着显示器件的多样化,人机交互界面也在不断地进行着变更,如今在TFT显示屏上进行图标化的功能管理已成为一种趋势,为此就以GD32F350为硬件平台来构建一个以图标我界面的功能管理的应用系统,该系统的主要功能如图1所示,整体构成如图2所示。
1 功能结构图

2 整体构成图


功能规划:
共设置如下功能:RTCADC(灯控、绿植)、环境、乐曲、设置。
RTC:利用MCU内部的RTC实现电子时钟的计时功能,并可设置控制时间以驱动继电器工作。
ADC:利用MCU内部的A/D转换器对外部的模拟量进行采集,如连接光敏器件可对光照情况进行判别,如连接土壤湿度传感器可对绿色植物养殖的浇水进行控制等。
环境:在添加DHT11的情况下,可进行温、湿度的检测。
乐曲:利用MCU内部的UARTMP3语音模块发送指令,来控制该模块实现乐曲的播放,并借助按键来向上或向下选择乐曲。
设置:RTC的配合下,可实现计时控制;在DHT11的配合下,可实现温湿度控制;在光敏器件的配合下,可实现灯光控制;在土壤湿度传感器的配合下,可实现绿植浇水控制等。


2.硬件设计
       该系统的整体硬件结构如图3所示,主要由显示模块、语音模块、继电控制模块及传感器模块等组成。

3原理构成图


1)显示部分
       显示部分是通过SPI接口的TFT屏来实现的,这样比较节省GPIO资源,其连接关系如图4所示。


图4  TFT显示电路原理图


2)语音播放部分
      语音播放部分主要是通过MP3播放模块来实现,这样有利于节省MCU资源并可形成并行处理关系。为节省连线,这里采用通讯方式来控制MP3播放模块。除连接5V电源外,只需将MP3播放模块的RX引脚与PA2连接接口。
5  MP3播放模块引脚图

3)控制部分
       为了进行电器的控制,使用带光隔的继电器模块有利于防止继电器对MCU的干扰。
4)传感器部分
       为进行物理信号向模拟信号的转换,视需要来选取不同的传感器,如亮度传感器、土壤湿度传感器等,相应的接口电路如图6和图7所示。此外,采用单总线的温湿度传感器DHT11也是一种很好的选择。
6 土壤湿度检测模块接口

7 亮度检测电路

5)按键部分
      按键是人机交互的主要工具,为便于控制这里将按分为2部分,一个是用开发板上B2B3键来控制MP3进行播放乐曲的选择;另一个是利用扩展的软按键来进行相关参数的设置。

3.软件设计

1)界面设计
      界面是人机交互的窗口,系统的主界面如图8所示,主要以图标的形式来指示功能,并通过文字反显来指示当前功能的参数设置。
      主菜单下的部分界面如图8~10所示。
8 主界面

9 RTC设置

10  MP3播放界面

2)功能实现
        在功能管理方面,是采用模块化的设计方法并通过功能函数调用来实现。在功能设计中,既涉及到外部功能模块的使用,也涉及到MCU内部的RTC、A/D、UART、GPIO等。
图11 功能处理流程图

界面绘制程序:
          GPIO_Configuration();
          Lcd_Init();
           LCD_Clear(WHITE);     
          show_tb(60,40,2);
          show_tb(60,95,1);
           show_tb(60,150,4);
           show_tb(60,205,0);
           show_tb(60,260,3);
           LCD_Fill(0,0,239,30,BLACK);
           POINT_COLOR=YELLOW;
           BACK_COLOR=BLACK;
           showhanzi16(40,10,0);
           showhanzi16(60,10,1);
           showhanzi16(80,10,2);
           showhanzi16(100,10,3);
            showhanzi16(120,10,4);
            POINT_COLOR=RED;
            showhanzi16(140,10,5);
            showhanzi16(160,10,6);
            showhanzi16(180,10,7);
            showhanzi16(200,10,8);

图标绘制程序
  1. void show_tb(unsigned int x,unsigned int y,unsigned int n)
  2. {
  3.          unsigned int i,j,k;
  4.          unsigned int da;
  5.          k=0;
  6.          for(i=0;i<50;i++)
  7.          {      
  8.                    LCD_SetCursor(x,y+i);
  9.                    LCD_WriteRAM_Prepare();
  10.                    for(j=0;j<50;j++)
  11.                    {
  12.                             if(n==0) da=gImage_tb[k*2];
  13.                             if(n==1) da=gImage_pwm[k*2];
  14.                             if(n==2) da=gImage_rtc[k*2];
  15.                             if(n==3) da=gImage_sz[k*2];
  16.                             if(n==4) da=gImage_dht[k*2];
  17.                             da<<=8;
  18.                             if(n==0) da|=gImage_tb[k*2+1];
  19.                             if(n==1) da|=gImage_pwm[k*2+1];
  20.                             if(n==2) da|=gImage_rtc[k*2+1];
  21.                             if(n==3) da|=gImage_sz[k*2+1];
  22.                             if(n==4) da|=gImage_dht[k*2+1];
  23.                             POINT_COLOR=da;
  24.                             LCD_DrawPoint(x-j,y+i);
  25.                             k++;
  26.                    }
  27.          }
  28. }
复制代码


RTC校时的数值键入程序:
  1. i=0;[/align]           while(i<3)
  2.            {
  3.                    POINT_COLOR=WHITE;
  4.                    BACK_COLOR=RED;
  5.                    LCD_ShowNum(164,60,hh,2,16);
  6.                    LCD_ShowNum(188,60,mm,2,16);
  7.                    LCD_ShowNum(212,60,ss,2,16);

  8.                    if(RESET == key1_state_get())          // 2
  9.                    {
  10.                      if(k>1)  k--;
  11.                    }

  12.                    if(RESET == key3_state_get())          // 1
  13.                    {
  14.                             if(k<10)  k++;
  15.                    }
  16.                    if(RESET == key4_state_get())          // 3
  17.                   {
  18.                    n=k*10;
  19.                    k=0;
  20.                    }
  21.                   
  22.                    if(RESET == key2_state_get()) // 4
  23.                    {
  24.                      i++;  n=0;  k=0;
  25.                    }
  26.                     if(i==0) hh=n+k;
  27.                     if(i==1) mm=n+k;
  28.                     if(i==2) ss=n+k;
  29.                     delay_1ms(200);
  30.                    }
  31.       
  32.                    hh=(hh/10)*16+hh%10;
  33.                    mm=(mm/10)*16+mm%10;
  34.                    ss=(ss/10)*16+ss%10;
  35.                    rtc_setup();
复制代码


MP3乐曲选择播放程序:
  1. if(RESET == gd_eval_key_state_get(KEY_WAKEUP))
  2. {
  3.                for ( i = 0 ; i < 10; i++)
  4.                      {
  5.                           usart_data_transmit(USART1, cmd2[i][i]);  // previous
  6.                          delay_1ms(10);
  7.                      }
  8.                      j--;
  9.                      LCD_ShowNum(133,225,j,2,16);
  10. }      

  11. if(RESET == gd_eval_key_state_get(KEY_USER))
  12. {
  13.                  for ( i = 0 ; i < 10; i++)
  14.                 {
  15.                         usart_data_transmit(USART1, cmd1);    //  next
  16.                        delay_1ms(10);
  17.                  }
  18.                             j++;
  19.                             LCD_ShowNum(133,225,j,2,16);
  20. }
复制代码


数据采集判别处理程序:
if(adc_value>hz)
{
   gd_eval_led_on(LED2);      
   JDQ_High();
}        
else
{
   gd_eval_led_off(LED2);     
   JDQ_Low();  
}

定时控制程序:
if((rtc_initpara.rtc_minute==mz)&&(rtc_initpara.rtc_second>sz))
{
    gd_eval_led_on(LED1);
    JDQ_High();
}
else gd_eval_led_
{
    off(LED1);
    JDQ_Low();
}
4.功能测试
       在功能测试中,测试方法的选择是较为重要的,应合理的选择。在进行多时段提示功能的验证时,所采用的方法是以“分”替代“时”来进行验证,否则一个周期验证下来会是件相当耗时的工作。
       此外,为了进行MP3播放模块的控制,可先通过虚拟串口来验证指令发送功能,待功能得到验证后再将虚拟串口通讯改为其它通道的通讯则可以节省许多验证时间。虚拟串口的验证效果如图12所示,说明指令发送是正确的。在连接MP3播放模块后,顺利地证明了控制的有效性,如图13所示。
12  Play指令测试

图13 MP3播放测试

    继电器在控制中的作用很重要,因为在弱电的条件下,继电器的状态变化会影响整个系统的稳定性。经检测光隔继电器在状态变化时,不会影响系统的正常运行,执行效果如图14所示。
14 继电器控制

5.结语
尽管该设计已初步具备了一定的系统规模,但受时间和技术水平的限制,还是存在一些待补充和完善的地方,如FLASH相对较小,无法添加更多的图标及构建更大的中文字库以使界面更美观和中文化。


https://v.youku.com/v_show/id_XMzg3NDIzNTYyOA==.html?spm=a2h3j.8428770.3416059.1
此帖出自GD32 MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表