爱板网论坛

查看: 488|回复: 0

[GD32F450方案分享] 【GD32F450 结项报告】:基于GD32 Colibri-F450VE开发板的气象数...

[复制链接]

10

主题

0

好友

207

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2017-6-14 23:30
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-18 23:05:26 |显示全部楼层
    本帖最后由 donatello1996 于 2017-6-18 23:13 编辑

    【GD32F450 结项报告】:基于GD32 Colibri-F450VE开发板的气象数据采集反馈系统

    GD32 Colibri-F450VE开发板使用GD32F450VE作为开发板的MCU,该MCU性能强劲,使用Cortex-M4内核,主频达200M,Flash大小为海量的512KB,SRAM大小为256KB,带有共计14个定时器,4个异步串口+4个同步串口,5个硬件SPI,两个IIS,一个SDIO,一个LCD-TFT控制器,基本配置能比肩STM32F407VE,实为国产32位MCU良心产品。
       基于该MCU的强大性能,我计划使用GD32 Colibri-F450VE开发板搭建一个气象数据采集反馈。


    项目背景:
       大学生气象检测项目是比较热门的大学生电子设计项目之一,该项目比起无人机制造项目,电子机器人制造项目等更结合实际,更贴近生活。该项目计划使用32位单片机采集环境温湿度、亮度等,比起传统的8位51单片机更高速,更精确,数据存储池更大,可以存储一整天甚至一个星期的数据。每一天的某个预定时刻,单片机会通过蓝牙模块将数据上传到PC,并在数据超过特定阈值时通过邮件发送到手机报警。


    硬件准备:
    1.HC05串口蓝牙模块:总线为USART,循环查询方式;
    HC05.jpg

    2.DHT11温湿度度监测模块:总线为单总线,不使用DMA,输入捕获中断方式;
    DHT11.jpg

    3.光敏电阻;
    光敏电阻.jpg

    4.74HC595+LCD1602:总线为模拟SPI,循环查询方式;
    IMG_20170618_214907.jpg

    5.外置Flash W25Q128:总线为SPI,不使用DMA,定时录入方式(定时器)。
    SPI FLASH.jpg


    6.DS3231日历模块:总线为模拟IIC
    DS3231.jpg

    项目详细内容:
        单片机通过DS3231进行日历计时,用模拟IIC总线通信;通过单总线与DHT11模块通信,采集温湿度数据;通过AD转换采集光敏电阻阻值,并实时通过PWMDAC方式反馈到LED上;设置一个定时器,当定时器计时完毕后单片机会将温度和湿度通过HC05蓝牙模块透传到PC上,再通过PC透传到手机上;每过中午12点和晚上12点,单片机会将这两个时刻的时间以及温湿度通过SPI总线写到SPI FLASH上;按键B2可以切换日历显示或者温湿度显示;环境亮度发生变化时,LD6的亮度也会随之改变。小红板采用充电宝供电,放在阳台上,而不与PC有任何的物理连接。


    项目电路图&连接示意图:

    2.JPG


    连接图说明:

    3.JPG


    代码:
    1.读取DS3231数据:
    1. #ifndef _DS3231_H
    2. #define _DS3231_H
    3. #include "gd32f4xx.h"
    4. #include "ana_iic1.h"

    5. #define DS3231_SEC     0x00    //Ãë
    6. #define DS3231_MIN     0x01    //·Ö
    7. #define DS3231_HOUR    0x02    //ʱ
    8. #define DS3231_DAY     0x03    //ÐÇÆÚ
    9. #define DS3231_DATE    0x04    //ÈÕ
    10. #define DS3231_MONTH   0x05    //ÔÂ
    11. #define DS3231_YEAR    0x06    //Äê
    12. //ÄÖÁå1            
    13. #define DS3231_Al1SEC  0x07    //Ãë
    14. #define DS3231_AL1MIN  0x08    //·Ö
    15. #define DS3231_AL1HOUR 0x09    //ʱ
    16. #define DS3231_AL1DAY  0x0A    //ÐÇÆÚ/ÈÕ
    17. //ÄÖÁå2
    18. #define DS3231_AL2MIN  0x0b    //·Ö
    19. #define DS3231_AL2HOUR 0x0c    //ʱ
    20. #define DS3231_AL2DAY  0x0d    //ÐÇÆÚ/ÈÕ
    21. #define DS3231_CONTROL 0x0e    //¿ØÖƼĴæÆ÷
    22. #define DS3231_STATUS  0x0f    //״̬¼Ä´æÆ÷

    23. #define BSY 2                  //æ
    24. #define OSF 7                  //Õñµ´Æ÷Í£Ö¹±êÖ¾
    25. #define DS3231_XTAL 0x10       //¾§ÌåÀÏ»¯¼Ä´æÆ÷
    26. #define DS3231_TEMP_H 0x11     //ζȼĴæÆ÷¸ß×Ö½Ú(8λ)
    27. #define DS3231_TEMP_L 0x12     //ζȼĴæÆ÷µÍ×Ö½Ú(¸ß2λ)

    28. uint8_t sec,min,hour,day,date,month,year,Tem,ampmflag;

    29. uint8_t BCDtoBYTE(uint8_t val)   //BCDת»»ÎªByte
    30. {
    31.     return((val>>4)*10)+(val&0x0f);
    32. }

    33. char BYTEtoBCD(char val)//ByteÂëת»»ÎªBCDÂë
    34. {
    35.      return(((val%100)/10)<<4)|(val%10);
    36. }

    37. void DS3231_Init(uint8_t timemodsw,uint8_t datemodsw,
    38. uint8_t myear,uint8_t mmonth,uint8_t mdate,uint8_t mday,
    39. uint8_t mhour,uint8_t mmin,uint8_t msec)//³õʼ»¯Æ÷¼þ
    40. {
    41.   IIC1_GPIO_Init();
    42.         IIC1_WriteData(0xd0,0x81,DS3231_AL1DAY);    //A1M4ÖÃλ£¬Ê±·ÖÃëÆ¥ÅäʱÄÖÖÓÏìÓ¦
    43.   IIC1_WriteData(0xd0,0x81,DS3231_AL2DAY);    //A2M4ÖÃλ£¬Ê±·ÖÆ¥ÅäʱÄÖÖÓÏìÓ¦
    44.         if(datemodsw==1)
    45.         {
    46.         IIC1_WriteData(0xd0,BYTEtoBCD(myear),DS3231_YEAR);
    47.         IIC1_WriteData(0xd0,BYTEtoBCD(mmonth),DS3231_MONTH);
    48.         IIC1_WriteData(0xd0,BYTEtoBCD(mdate),DS3231_DATE);
    49.         IIC1_WriteData(0xd0,mday,DS3231_DAY);
    50.         }
    51.         
    52.         if(timemodsw==1)
    53.         {
    54.         IIC1_WriteData(0xd0,BYTEtoBCD(mhour),DS3231_HOUR);
    55.         IIC1_WriteData(0xd0,BYTEtoBCD(mmin),DS3231_MIN);
    56.         IIC1_WriteData(0xd0,BYTEtoBCD(msec),DS3231_SEC);
    57.         }        
    58.         IIC1_WriteData(0xd0,0x04,DS3231_CONTROL);   
    59.         //ÖжÏÔÊÐí£¬ÄÖÖÓ1ºÍ2¹Ø±Õ
    60.   IIC1_WriteData(0xd0,0x00,DS3231_STATUS);   
    61.         //32KHZÊä³ö½ûÖ¹£¬ÄÖÖÓ±ê־λÇåÁã
    62.         
    63. }

    64. void TimeRead_Conv()//¶Áȡʱ¼ä
    65. {
    66.   uint8_t temp;
    67.   temp=IIC1_ReadData(0xd0,DS3231_SEC);   //Ãë
    68.   sec=(int)BCDtoBYTE(temp);
    69.   temp=IIC1_ReadData(0xd0,DS3231_MIN);   //·Ö
    70.   min=BCDtoBYTE(temp);
    71.   temp=IIC1_ReadData(0xd0,DS3231_HOUR);  //ʱ
    72.   hour=BCDtoBYTE(temp);
    73.   
    74.   if(18>=hour&&hour>=6) ampmflag=0;
    75.   else ampmflag=1;
    76.         
    77.   day=IIC1_ReadData(0xd0,DS3231_DAY);    //ÐÇÆÚ
    78.   temp=IIC1_ReadData(0xd0,DS3231_DATE);  //ÈÕ
    79.   date=BCDtoBYTE(temp);
    80.   temp=IIC1_ReadData(0xd0,DS3231_MONTH); //ÔÂ
    81.   month=BCDtoBYTE(temp);
    82.   temp=IIC1_ReadData(0xd0,DS3231_YEAR);  //Äê
    83.   year=BCDtoBYTE(temp);
    84.   Tem=IIC1_ReadData(0xd0,DS3231_TEMP_H);//ζÈ
    85. }

    86. #endif
    复制代码
    2.读取DHT11温湿度代码:
    1. #ifndef _DHT11_H
    2. #define _DHT11_H
    3. #include "gd32f4xx.h"
    4. #include "lcd1602.h"

    5. #define DHT11_GPIO GPIOC
    6. #define DHT11_GPIO_CLOEN rcu_periph_clock_enable(DHT11_GPIO)
    7. #define DHT11_PIN GPIO_PIN_13
    8. #define DHT11_PIN_SET gpio_bit_set(DHT11_GPIO,DHT11_PIN)
    9. #define DHT11_PIN_CLR gpio_bit_reset(DHT11_GPIO,DHT11_PIN)
    10. #define DHT11_PIN_Read gpio_input_bit_get(DHT11_GPIO,DHT11_PIN)

    11. void DHT11_IN()
    12. {
    13.         DHT11_GPIO_CLOEN;
    14.         gpio_mode_set(
    15.         DHT11_GPIO,
    16.         GPIO_MODE_INPUT,
    17.         GPIO_PUPD_NONE,
    18.         DHT11_PIN);
    19. }

    20. void DHT11_OUT()
    21. {
    22.         DHT11_GPIO_CLOEN;
    23.         gpio_mode_set(
    24.         DHT11_GPIO,
    25.         GPIO_MODE_OUTPUT,
    26.         GPIO_PUPD_NONE,
    27.         DHT11_PIN);
    28.         gpio_output_options_set(
    29.         DHT11_GPIO,
    30.         GPIO_OTYPE_PP,
    31.         GPIO_OSPEED_50MHZ,
    32.         DHT11_PIN);
    33. }

    34. void DHT11_Reset()           
    35. {                 
    36.         DHT11_OUT();         
    37.         DHT11_PIN_CLR;         
    38.         Delay_ms(20);
    39.         DHT11_PIN_SET;
    40.         Delay_us(30);
    41. }

    42. int DHT11_Check()
    43. {   
    44.         int retry=0;
    45.         DHT11_IN();
    46.         while (DHT11_PIN_Read&&retry<100)
    47.         {
    48.                 retry++;
    49.                 Delay_us(1);
    50.         };         
    51.         if(retry>=100)return 1;
    52.         else retry=0;
    53.         while (!DHT11_PIN_Read&&retry<100)
    54.         {
    55.                 retry++;
    56.                 Delay_us(1);
    57.         };
    58.         if(retry>=100)return 1;            
    59.         return 0;
    60. }

    61. int DHT11_Init()
    62. {
    63.         DHT11_GPIO_CLOEN;
    64.         gpio_mode_set(
    65.         DHT11_GPIO,
    66.         GPIO_MODE_INPUT,
    67.         GPIO_PUPD_NONE,
    68.         DHT11_PIN);
    69.         gpio_output_options_set(
    70.         DHT11_GPIO,
    71.         GPIO_OTYPE_PP,
    72.         GPIO_OSPEED_50MHZ,
    73.         DHT11_PIN);
    74.         
    75.         DHT11_Reset();
    76.         return DHT11_Check();
    77. }

    78. int DHT11_Read_Bit()                          
    79. {
    80.          int retry=0;
    81.         while(DHT11_PIN_Read&&retry<100)
    82.         {
    83.                 retry++;
    84.                 Delay_us(1);
    85.         }
    86.         retry=0;
    87.         while(!DHT11_PIN_Read&&retry<100)
    88.         {
    89.                 retry++;
    90.                 Delay_us(1);
    91.         }
    92.         Delay_us(40);
    93.         if(DHT11_PIN_Read) return 1;
    94.         else return 0;  
    95. }

    96. char DHT11_Read_Byte()   
    97. {        
    98.         char i,dat;
    99.         dat=0;
    100.         for(i=0;i<8;i++)
    101.         {
    102.                    dat<<=1;
    103.             dat|=DHT11_Read_Bit();
    104.   }
    105.         
    106.         return dat;
    107. }

    108. int DHT11_Read_Data(char *temp,char *humi)   
    109. {        
    110.          char buf[5],i;
    111.         DHT11_Reset();
    112.         if(DHT11_Check()==0)
    113.         {
    114.                 for(i=0;i<5;i++)
    115.                 {
    116.                         buf[i]=DHT11_Read_Byte();
    117.                 }
    118.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    119.                 {
    120.                         *humi=buf[0];
    121.                         *temp=buf[2];
    122.                 }
    123.         }
    124.         else return 1;
    125.         return 0;            
    126. }

    127. #endif
    复制代码
    3.更新SPI FLASH数据代码:
    1. if(hour==12||hour==0)
    2.                         {
    3.                                 locat=Read_Flash_Loc();
    4.                                 buff[0]=year,buff[1]=month,buff[2]=date,buff[3]=day;
    5.                                 buff[4]=hour,buff[5]=min,buff[6]=sec,buff[7]=temp;
    6.                                 buff[9]=humi;
    7.                                 W25Q128_Write(buff,locat*10,10);
    8.                                 Flash_Loc_Add();
    9.                         }
    复制代码
    4.外部中断代码:
    1. void EXTI0_IRQHandler()
    2. {
    3.         if(RESET!=exti_interrupt_flag_get(EXTI_0))
    4.         {
    5.                 Delay_ms(100);
    6.                 page=1-page;
    7.                 exti_interrupt_flag_clear(EXTI_0);
    8.         }
    9. }
    复制代码
    5.LCD1602显示日历代码:
    1.   if(page==0)
    2.                 {
    3.                         TimeRead_Conv();               
    4.                         LCD1602_Write_char(0,0,year/10+'0');
    5.                         LCD1602_Write_char(1,0,year%10+'0');
    6.                         LCD1602_Write_char(2,0,'/');
    7.                         LCD1602_Write_char(3,0,month/10+'0');
    8.                         LCD1602_Write_char(4,0,month%10+'0');
    9.                         LCD1602_Write_char(5,0,'/');               
    10.                         LCD1602_Write_char(6,0,date/10+'0');
    11.                         LCD1602_Write_char(7,0,date%10+'0');
    12.                         LCD1602_Write_char(8,0,' ');
    13.                         LCD1602_Write_char(9,0,day+'0');
    14.                         LCD1602_Write_char(10,0,' ');
    15.         
    16.                         if(ampmflag==0)LCD1602_Write_str(11,0,"DAY  ");
    17.                         else LCD1602_Write_str(11,0,"NIGHT");
    18.                
    19.                         LCD1602_Write_char(0,1,hour/10+'0');
    20.                         LCD1602_Write_char(1,1,hour%10+'0');
    21.                         LCD1602_Write_char(2,1,':');
    22.                         LCD1602_Write_char(3,1,min/10+'0');
    23.                         LCD1602_Write_char(4,1,min%10+'0');
    24.                         LCD1602_Write_char(5,1,':');
    25.                         LCD1602_Write_char(6,1,sec/10+'0');
    26.                         LCD1602_Write_char(7,1,sec%10+'0');
    27.                         LCD1602_Write_str(8,1,"        ");
    28.                         if(hour==12||hour==0)
    29.                         {
    30.                                 locat=Read_Flash_Loc();
    31.                                 buff[0]=year,buff[1]=month,buff[2]=date,buff[3]=day;
    32.                                 buff[4]=hour,buff[5]=min,buff[6]=sec,buff[7]=temp;
    33.                                 buff[9]=humi;
    34.                                 W25Q128_Write(buff,locat*10,10);
    35.                                 Flash_Loc_Add();
    36.                         }
    37.                                 
    38.                 }
    复制代码
    6.LCD1602显示温湿度代码:
    1.   else if(page==1)
    2.                 {
    3.                         DHT11_Read_Data(&temp,&humi);
    4.                         LCD1602_Write_str(0,0,"TEMPATURE:");
    5.                         LCD1602_Write_char(10,0,temp/10+'0');
    6.                         LCD1602_Write_char(11,0,temp%10+'0');
    7.                         LCD1602_Write_char(12,0,0xdf);
    8.                         LCD1602_Write_char(13,0,'C');
    9.                         LCD1602_Write_str(14,0,"  ");
    10.                         LCD1602_Write_str(0,1,"HUMIDITY:");
    11.                         LCD1602_Write_char(9,1,humi/10+'0');
    12.                         LCD1602_Write_char(10,1,humi%10+'0');
    13.                         LCD1602_Write_char(11,1,'%');
    14.                         LCD1602_Write_str(12,1,"    ");
    15.                         printf("当前温度:\n\n",temp);
    16.                         printf("当前湿度:%d\n\n",humi);
    17.                 }
    复制代码
    实验效果(GIF):
    2.gif
    1.gif
    1.JPG
    阳台.jpg
    电脑端.jpg

    工程文件: 工程文件.zip (413.87 KB, 下载次数: 3)
    设计文档: 设计文档.doc (172.5 KB, 下载次数: 5)

    至此,GD32F450小红板项目就告一段落了。
    回复

    使用道具 举报

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

    关闭

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

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

    GMT+8, 2017-11-18 03:28 , Processed in 0.176873 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部