20回答

5收藏

GD32_MINI智能家居系统

 

GD32 GD32 11995 人阅读 | 20 人回复 | 2016-06-13

本帖最后由 糖悦之果飞 于 2016-6-13 17:22 编辑

GD32_MINI智能家居系统

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

一、系统框图




二、功能介绍




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





四、核心代码讲解
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****/
复制代码
五、实物演练


上面视频中,我是将一个根烟点燃后直接放在了烟雾传感器下面,这时我们烟雾直接超标,APP中的红心直接变黑,手机直接短信报警和电话报警(其中的手机号我随意虚设);当把烟拿开后我们烟雾浓度就降下来了,APP中的心的颜色就慢慢变成了红色。
六、程序与APP
1、程序部分
代码已经全部贴上面了,大家可以复制到Keil中配置运行下
2、APP
GD32智能家居APP.rar (2.49 MB, 下载次数: 331)

七、项目合作附语
  暑假马上要到,本人暑假比较闲。若哪位兄台有项目,忙不完的可以找我哦!本人很愿意从事GD32、手机APP开发、DSP、FPGA、STM32、STM8、MPS430、PLC、PCB绘图等项目开发;小弟最近经济比较拮据,大家多多关照哦。

GD_S_H.rar

2.49 MB, 下载次数: 160

分享到:
回复

使用道具 举报

回答|共 20 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-6-13 16:08:04 | 只看该作者

写的真不错,必须给赞一个!
板凳

slotg

发表于 2016-6-13 16:56:39 | 只看该作者

很好的内容,感谢分享。
地板

Feelplus

发表于 2016-6-13 17:07:09 | 只看该作者

赞一个,
5#

suoma

发表于 2016-6-13 23:19:27 | 只看该作者

谢谢分享学习一下
6#

kingsings

发表于 2016-6-13 23:30:45 | 只看该作者

做的不错            
7#

chen_hang

发表于 2016-6-14 09:28:03 | 只看该作者

谢谢 分享           
8#

wambob

发表于 2016-6-14 20:47:03 | 只看该作者

华为4C手机
自己制作的APP界面不错
9#

story_xjj

发表于 2016-6-15 08:46:12 | 只看该作者

确实不错,支持一下
10#

yanhaijian

发表于 2016-6-21 17:11:48 | 只看该作者

全能,厉害啊。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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