查看: 1495|回复: 15

[GD32F190方案分享] GD32_MINI智能家居系统

  [复制链接]

5

主题

0

好友

295

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-1-6 10:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-6-13 16:02:21 |显示全部楼层
    本帖最后由 糖悦之果飞 于 2016-6-13 17:22 编辑

    GD32_MINI智能家居系统

    前言:本小玩意纯原创,虽然简单但五脏俱全,而且小弟我也整整写了两个星期的代码,愿大家喜欢。

    一、系统框图


    系统框图.png


    二、功能介绍


    J9DODR@%4UUPZX2DJH6{$XN.png


    从上图我们可以看到我们有OLED液晶显示器,蜂鸣器,RGB_LED灯,蓝牙,MQ2烟雾传感器还有我们的GD32F190小红板。他们之间的通讯如下:
                                                                          OLED:SPI          MQ:ADC
                                                                          RGB:PWM         蓝牙:USART
                                                                                   蜂鸣器:PWM
    我们的小红板采集MQ传感器的值然后将数据发送给手机并在手上显示,同时我们的OLED也会显示。当这烟雾浓度过高时,我们蜂蜜器将会报警,同时我们的手机也会进行电话和短信报警。
    当然作为智能家居我们也需要能够控制我们的家电。这里我们加了一个全彩的LED来模拟我们的家庭电器,我们可以通过滑动手机APP上的滑条,来控制我们的全彩LED。通过改变红绿蓝的亮度来显示不同的颜色。我们还提供一个网络平台这个我们也同时通过网络平台来时候监控我们的家庭环境,同样也能控制我们的家电。
    三、APP与OLED界面介绍
    APP.png


    OLED.png



    四、核心代码讲解
    1、RGB_LED部分
    1. /* Includes ------------------------------------------------------------------*/
    2. #include <stdlib.h>
    3. #include <stdio.h>
    4. #include "RGB_LED.h"
    5. void RGB_LED_INT(void)
    6. {
    7.         // SysTick_Configuration();
    8.          PWM_Timer_Int();
    9.         
    10. }


    11. void Led_R(uint16_t ling)
    12. {
    13.         TIMER_Compare4Config(TIMER2 , ling );
    14. }

    15. void Led_B(uint16_t ling)
    16. {
    17.         TIMER_Compare1Config(TIMER17 , ling );
    18. }

    19. void Led_G(uint16_t ling)
    20. {
    21.         TIMER_Compare3Config(TIMER2 , ling );
    22. }
    复制代码
    我们的RGB_LED主要是通过PWM来进行控制其亮度的,上面我们我们三个函数用来改变三个LED的占空比从而形成不同的颜色。
    2、蜂蜜器部分
    1. #include "buzzer.h"
    2. void Buzzer_INT(void)
    3. {
    4.          PWM_Timer_Int();
    5.          TIMER_Compare1Config(TIMER16 , 1000 );
    6. }

    7. void Buzzer(uint16_t ling)
    8. {
    9.         TIMER_Compare1Config(TIMER16 , ling );
    10. }
    复制代码
    我们的蜂鸣器也是通过通过PWM来控制,我们先设定一个频率周期,然后通过改变占空比来改变响度。
    3、蓝牙部分
    1. void USART1_IRQHandler(void)
    2. {
    3.         static char Tata_floag;
    4.         static uint8_t USART_DATA;
    5.   static char i = 0;

    6.                
    7. if( USART_GetIntBitState(USART1, USART_INT_RBNE) != RESET)
    8. {
    9.                 USART_DATA = ( uint8_t )USART_DataReceive( USART1 );
    10.          if( USART_DATA == 0xff)
    11.       {
    12.         Tata_floag = 1;
    13.         i = 1;        
    14.       }
    15.       else if(i == 0)
    16.               {
    17.                 Tata_floag = 0;
    18.               }
    19.               else
    20.                 {
    21.                   i++;
    22.                   switch(i)
    23.                   {
    24.                   case 2: LED_G = USART_DATA;
    25.                                                                                                                                                                                                                                                                                                 
    26.                     break;
    27.                                                                                 
    28.                   case 3: LED_B = USART_DATA;
    29.                                                                         
    30.                     break;
    31.                   case 4: LED_R = USART_DATA;
    32.                         
    33.                                                                                 break;
    34.                   case 5: Buzzen_V = USART_DATA;
    35.                                                                         
    36.                                                                                 i = 0;
    37.                     break;                  
    38.                   }               
    39.                                     
    40.                 }                  
    41.                }

    42.                 USART_ClearBitState( USART1, USART_FLAG_TC);
    43.                 USART1->CMD |=0x18;
    44.                 USART1->SCR |=0x18;               
    45.                                 
    46.         }
    复制代码
    我们的蓝牙是直接和串口连接的,当手机数据发送过来,我们的小红板就进入接收中断,将手机发来的数据一一接收并存储下来。
    4、MQ部分
    1. <div>/* Includes ------------------------------------------------------------------*/
    2. #include "gd32f1x0.h"
    3. #include <stdlib.h>
    4. #include <stdio.h>
    5. #include "ADC.h"
    6. /* Private define ------------------------------------------------------------*/
    7. #ifdef GD32F130_150
    8. #define BOARD_ADC_CHANNEL ADC_CHANNEL_11
    9. #define ADC_GPIO_PIN GPIO_PIN_1
    10. #elif defined GD32F170_190
    11. #define BOARD_ADC_CHANNEL ADC_CHANNEL_10
    12. #define ADC_GPIO_PIN GPIO_PIN_0
    13. #endif
    14. #define ADC_RDTR_Address    ((uint32_t)0x4001244C)
    15. /* Private variables ---------------------------------------------------------*/
    16. __IO uint16_t ADCConvertedValue;
    17. ADC_InitPara ADC_InitStructure;
    18. DMA_InitPara DMA_InitStructure;
    19. /* Private function prototypes -----------------------------------------------*/
    20. void RCC_Configuration(void);
    21. void GPIO_Configuration(void);
    22. /* Private functions ---------------------------------------------------------*/
    23. /**
    24.   * @brief  Main program.
    25.   * @param  None
    26.   * @retval None
    27.   */
    28. void GD_ADC_INT(void)
    29. {
    30.     /* Configure System clocks -----------------------------------------------*/
    31.     RCC_Configuration();
    32.    
    33.     /* Configure GPIO ports --------------------------------------------------*/
    34.     GPIO_Configuration();
    35.    
    36.     /* Configure DMA1 channel1 -----------------------------------------------*/
    37.     DMA_DeInit(DMA1_CHANNEL1);
    38.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_RDTR_Address;
    39.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
    40.     DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
    41.     DMA_InitStructure.DMA_BufferSize = 1;
    42.     DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
    43.     DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_DISABLE;
    44.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_HALFWORD;
    45.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_HALFWORD;
    46.     DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
    47.     DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
    48.     DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
    49.     DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure);   
    50.     /* Enable DMA1 channel1 */
    51.     DMA_Enable(DMA1_CHANNEL1, ENABLE);   
    52.     /* Configure ADC ---------------------------------------------------------*/
    53.     ADC_InitStructure.ADC_Mode_Scan = DISABLE;
    54.     ADC_InitStructure.ADC_Mode_Continuous = ENABLE;
    55.     ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    56.     ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    57.     ADC_InitStructure.ADC_Channel_Number = 1;
    58.     ADC_Init(&ADC_InitStructure);   
    59.     /* Configure ADC regular channelx */
    60.     ADC_RegularChannel_Config( BOARD_ADC_CHANNEL, 1, ADC_SAMPLETIME_239POINT5);   
    61.     /* Enable ADC DMA */
    62.     ADC_DMA_Enable(ENABLE);   
    63.     /* Enable ADC */
    64.     ADC_Enable(ENABLE);   
    65.     ADC_Calibration();     
    66.     /* Start ADC Software Conversion */
    67.     ADC_SoftwareStartConv_Enable(ENABLE);  
    68.    
    69. }</div><div>
    70. </div><div>/**
    71.   * @brief  Configure system clocks.
    72.   * @param  None
    73.   * @retval None
    74.   */
    75. void RCC_Configuration(void)
    76. {
    77.     /* ADCCLK = PCLK2/6 */
    78.     RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6); </div><div>
    79. </div><div>    /* Enable DMA1 and GPIOC clock */
    80.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_DMA1|RCC_AHBPERIPH_GPIOC, ENABLE);
    81.    
    82.     /* Enable ADC clock */
    83.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1, ENABLE);
    84. }</div><div>
    85. </div><div>/**
    86.   * @brief  Configure GPIO ports.
    87.   * @param  None
    88.   * @retval None
    89.   */
    90. void GPIO_Configuration(void)
    91. {
    92.     GPIO_InitPara GPIO_InitStructure;
    93.    
    94.     /* Configure PC1 or PC0 (ADC Channel11 or Channel10) as analog input -------------------------*/
    95.     GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN;
    96.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AN;
    97.     GPIO_Init(GPIOC, &GPIO_InitStructure);
    98. }</div>
    复制代码
       对于烟雾传感器,我们只要简单的进行AD采集就可以了。
    5、OLED部分
    1. void OLEO_GPIO_Int(void)
    2. {
    3.         
    4.                 GPIO_InitPara  GPIO_InitStructure;
    5.                 SPI_InitPara  SPI_InitStructure;
    6.     /* Enable the LED Clock */
    7.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
    8.                 RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_SPI1, ENABLE);
    9.           /* GPIO AF configuration */
    10.     GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE3, GPIO_AF_0);
    11.     GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE4, GPIO_AF_0);
    12.     GPIO_PinAFConfig(GPIOB, GPIO_PINSOURCE5, GPIO_AF_0);
    13.     /* SPI1_CLK(PB3),  SPII_MISO(PB4) and SPII_MOSI(PB5) GPIO pin configuration */
    14.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
    15.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    16.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AF;
    17.     GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    18.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    19.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    20.           /* SPII_NSS(PB12,) GPIO pin configuration */
    21.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
    22.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    23.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT;
    24.     GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    25.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    26.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    27.                 /* PB0--OLED RST  Òý½Å¶¨Òå */
    28.                 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_15;
    29.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    30.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT;
    31.     GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    32.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    33.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    34.                 /* PB15--OLED C/D Òý½Å¶¨Òå */
    35.                 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0;
    36.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    37.     GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT;
    38.     GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
    39.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
    40.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    41.                
    42.                
    43. /* SPI1 configuration */
    44.     SPI_InitStructure.SPI_TransType = SPI_TRANSTYPE_FULLDUPLEX;
    45.     SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
    46.     SPI_InitStructure.SPI_FrameFormat = SPI_FRAMEFORMAT_8BIT;
    47.     SPI_InitStructure.SPI_SCKPL = SPI_SCKPL_LOW;
    48.     SPI_InitStructure.SPI_SCKPH = SPI_SCKPH_1EDGE;
    49.     SPI_InitStructure.SPI_SWNSSEN = SPI_SWNSS_SOFT;
    50.     SPI_InitStructure.SPI_PSC = SPI_PSC_8;
    51.     SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
    52.     SPI_InitStructure.SPI_CRCPOL = 7;
    53.   
    54.     SPI_Init(SPI1, &SPI_InitStructure);
    55.     SPI_Enable(SPI1, ENABLE);         

    56. }                  
    复制代码
    6、主函数部分
    1. int main(void)
    2. {
    3.         unsigned char i;
    4.         SysTick_Configuration();
    5.         RGB_LED_INT();
    6.         Buzzer_INT();
    7. GD_usart_Int();
    8.         GD_usart1_Int();
    9.         NVIC_Configurationuration();
    10. OLED_Init();
    11.         OLED_CLS();
    12.         OLED_P8x16Str(12,0,"MiNi");
    13.         OLED_P16x16Ch(42,0,4,fd1);
    14.         OLED_P8x16Str(8,2,"shamozhihuong");   
    15.         OLED_P16x16Ch(12,4,4,fd2);
    16.         OLED_P6x8Str(12,7,"407550350@QQ.COM");
    17. GD_ADC_INT();
    18. {
    19.             for(i=0;i<sizeof(TxBuffer1);i++)
    20. {
    21.                             USART_DataSend( USART1,TxBuffer1[i]);
    22.    while(USART_GetBitState( USART1, USART_FLAG_TC) == RESET);
    23.             }
    24.             
    25.             for(i=0;i<sizeof(TxBuffer2);i++)
    26. {
    27.                                                                            USART_DataSend( USART2,TxBuffer2[i]);
    28.     while(USART_GetBitState( USART2, USART_FLAG_TC) == RESET);
    29.             }
    30.         }
    31.     while (1)
    32.     {
    33.   while(ADC_GetBitState(ADC_FLAG_EOC) != SET)
    34. #if 1
    35. /***************µçѹ²É¼¯ÏÔʾ²¿·Ö*****************/
    36.                       Led_R(LED_R*4);//??LED
    37.           Led_G(LED_G*4);//??LED
    38.                                   Led_B(LED_B*4);//??LED                        
    39.                  electrect_V = Elec_adc_converted ();
    40.                 printf("%f \n\r",electrect_V);               
    41.                 values_V = (int)(electrect_V*1000);
    42.                                                                 Temp_ADC = int_adc_converted()>>3;
    43. USART_DataSend( USART1,Temp_ADC);
    44.           if(Temp_ADC > 150)  //???????140???
    45.           {
    46.                 Buzzer((Buzzen_V / 2)*4);
    47.           }
    48.           else{
    49.                      Buzzer(0);
    50.                 }                 
    51.                         ge = Temp_ADC%10;
    52.                         shi = Temp_ADC/10%10;
    53.                         bai = Temp_ADC/100%10;
    54.                                                 
    55.                                 itoa(bai, dis_STR1, 10);
    56.                                 OLED_P8x16Str(78,4,dis_STR1);
    57.                                 itoa(shi, dis_STR1, 10);
    58.                                 OLED_P8x16Str(86,4,dis_STR1);        
    59.                                 itoa(ge, dis_STR1, 10);
    60.                                 OLED_P8x16Str(94,4,dis_STR1);        
    61.                                 OLED_P8x16Str(102,4,"ppm");        
    62.                         /***************µçѹ²É¼¯ÏÔʾ²¿·Ö*****************/
    63. #endif

    64.    }
    65. }

    66. /******************* (C) COPYRIGHT 2016 沙漠之风*****END OF FILE****/
    复制代码
    五、实物演练
    实物图.jpg


    上面视频中,我是将一个根烟点燃后直接放在了烟雾传感器下面,这时我们烟雾直接超标,APP中的红心直接变黑,手机直接短信报警和电话报警(其中的手机号我随意虚设);当把烟拿开后我们烟雾浓度就降下来了,APP中的心的颜色就慢慢变成了红色。
    六、程序与APP
    1、程序部分
    代码已经全部贴上面了,大家可以复制到Keil中配置运行下
    2、APP
    GD32智能家居APP.rar (2.49 MB, 下载次数: 22)
    七、项目合作附语
      暑假马上要到,本人暑假比较闲。若哪位兄台有项目,忙不完的可以找我哦!本人很愿意从事GD32、手机APP开发、DSP、FPGA、STM32、STM8、MPS430、PLC、PCB绘图等项目开发;小弟最近经济比较拮据,大家多多关照哦。

    GD_S_H.rar

    2.49 MB, 下载次数: 29

    回复

    使用道具 举报

    195

    主题

    3

    好友

    9651

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-13 16:08:04 |显示全部楼层
    写的真不错,必须给赞一个!
    回复

    使用道具 举报

    33

    主题

    2

    好友

    5004

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    开心
    14 分钟前
  • 签到天数: 1297 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 在线达人勋章 在线之王勋章

    发表于 2016-6-13 16:56:39 |显示全部楼层
    很好的内容,感谢分享。
    回复

    使用道具 举报

    0

    主题

    0

    好友

    343

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-7-24 13:44
  • 签到天数: 32 天

    [LV.5]常住居民I

    爱板会员勋章

    发表于 2016-6-13 17:07:09 |显示全部楼层
    赞一个,
    回复

    使用道具 举报

    129

    主题

    4

    好友

    4794

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    开心
    昨天 21:58
  • 签到天数: 528 天

    [LV.9]以坛为家II

    发表于 2016-6-13 23:19:27 |显示全部楼层
    谢谢分享学习一下
    回复

    使用道具 举报

    0

    主题

    1

    好友

    476

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 106 天

    [LV.6]常住居民II

    发表于 2016-6-13 23:30:45 |显示全部楼层
    做的不错            
    回复

    使用道具 举报

    4

    主题

    0

    好友

    740

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    昨天 10:25
  • 签到天数: 111 天

    [LV.6]常住居民II

    发表于 2016-6-14 09:28:03 |显示全部楼层
    谢谢 分享           
    回复

    使用道具 举报

    32

    主题

    0

    好友

    2165

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 09:16
  • 签到天数: 531 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2016-6-14 20:47:03 |显示全部楼层
    华为4C手机
    自己制作的APP界面不错
    回复

    使用道具 举报

    6

    主题

    5

    好友

    1583

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    开心
    昨天 14:12
  • 签到天数: 408 天

    [LV.9]以坛为家II

    发表于 2016-6-15 08:46:12 |显示全部楼层
    确实不错,支持一下
    回复

    使用道具 举报

    8

    主题

    0

    好友

    1096

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 10:46
  • 签到天数: 239 天

    [LV.7]常住居民III

    发表于 2016-6-21 17:11:48 |显示全部楼层
    全能,厉害啊。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-9 00:14 , Processed in 0.260584 second(s), 20 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部