查看: 10420|回复: 20

GD32_MINI智能家居系统

  [复制链接]
  • TA的每日心情
    开心
    2017-6-17 09:42
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 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, 下载次数: 165)

    GD_S_H.rar

    2.49 MB, 下载次数: 160

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

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

    使用道具 举报

  • TA的每日心情
    开心
    2021-12-10 15:56
  • 签到天数: 2675 天

    连续签到: 1 天

    [LV.Master]伴坛终老

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

    使用道具 举报

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

    连续签到: 1 天

    [LV.5]常住居民I

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

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

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

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-30 10:59
  • 签到天数: 119 天

    连续签到: 1 天

    [LV.6]常住居民II

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

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-14 16:42
  • 签到天数: 136 天

    连续签到: 1 天

    [LV.7]常住居民III

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

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

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-7 10:36
  • 签到天数: 898 天

    连续签到: 1 天

    [LV.10]以坛为家III

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-3-13 10:11
  • 签到天数: 1088 天

    连续签到: 2 天

    [LV.10]以坛为家III

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

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 08:16 , Processed in 0.215209 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.