1回答

1收藏

麒麟座MINI开发板--温湿度、灰尘浓度监测

物联网 物联网 3757 人阅读 | 1 人回复 | 2017-09-11

本帖最后由 yayasoso 于 2017-9-11 23:26 编辑

前几天花了点时间看了下麒麟座mini板的资料,决定先从底层硬件和外围传感器入手,将手头的一些传感器都接入开发板。目前手头有温湿度传感器、灰尘传感器、光照传感器、气压传感器等,今晚实现了温湿度、灰尘浓度的OLED显示。
1.外设与麒麟座MINI开发板的连接
  MINI开发板没有带显示屏,所以外接了SPI的OLED显示屏,为了方便连接直接使用了杜邦线,看起来比较凌乱。

  OLED屏端口连接:
  //        CLK=PA0  
//        MOSI=PA1
  //        DC=PA6
  //        CS1=PA7
  //        FSO=PA4
  //        CS2=PA5

灰尘传感器端口连接:
  // RX=PA3




2.OLED显示
液晶屏选用中景园电子0.96寸OLED模块
该模块分辨率为128*64,内置字库,SPI/IIC两种接口方式

3.灰尘传感器
夏普GP2Y1051AU0F灰尘传感器,5V供电,串口输出,波特率2400


4.所用的OLED及传感器数据手册
中景园0.96OLED使用说明
GP2Y1051AU0F规格书_夏普二代PM2.5.pdf (3.01 MB, 下载次数: 1)

GB2312简体中文编码表.pdf (1.2 MB, 下载次数: 1)

GT20L16S1Y用户手册V35.pdf (407.55 KB, 下载次数: 1)

原理图 .pdf (62.53 KB, 下载次数: 2)

中景园电子0.96寸OLED显示屏_STM32F103RCT6系列_带字库.zip (1.8 MB, 下载次数: 2)

5.代码
由于整个工程是在SHT20-温湿度传感器工程的基础上添加了OLED显示和灰尘传感器的读取,OLED的完整驱动已给出,这里我就贴上灰尘传感器的读取代码。
  1. /*********************************************************************************
  2. *文件名 :USART1
  3. * 描述    :GP2Y10灰尘传感器读取
  4.                波特率2400
  5. * 作者   :
  6. * 时间   :2017-09
  7. **********************************************************************************/
  8. #include "usart1.h"
  9. #include "stdarg.h"
  10. #include "stm32f10x_usart.h"
  11. #include "misc.h"
  12. #include "stdio.h"                  
  13. #include "string.h"           

  14. uint8_t RxBuffer1[100];
  15. float Ud;
  16. float vout;
  17. extern float AQI;
  18. char len_rx;
  19. uint8_t RxCounter1;

  20. /*
  21. *函数:USART_Config
  22. * 描述:串口配置,串口2,波特率2400
  23. */
  24. void USART_Config(void)
  25. {
  26.         GPIO_InitTypeDef GPIO_InitStructure;
  27.   USART_InitTypeDef USART_InitStructure;
  28.         
  29.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  30.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
  31.         
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35.         GPIO_Init(GPIOA, &GPIO_InitStructure);   

  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  38.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  39.         USART_InitStructure.USART_BaudRate = 2400;
  40.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  41.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  42.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  43.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  44.         USART_InitStructure.USART_Mode = USART_Mode_Rx;
  45.         USART_Init(USART2, &USART_InitStructure);
  46.         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  47.         USART_Cmd(USART2, ENABLE);
  48. }
  49. /*
  50. * 函数名:NVIC_Configuration
  51. * 描述:串口2中断配置
  52. */
  53. void NVIC_Configuration(void)
  54. {
  55.   NVIC_InitTypeDef NVIC_InitStructure;
  56.                               
  57.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            

  58.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                   
  59.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                  
  60.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                              
  61.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                      
  62.   NVIC_Init(&NVIC_InitStructure);
  63.   
  64. }
  65. /*
  66. * 函数名:conc_dust
  67. * 描述:灰尘浓度值转空气质量指数AQI
  68. */
  69. void conc_dust(void)
  70. {
  71.   unsigned char verify;
  72.   verify=RxBuffer1[len_rx-3]+RxBuffer1[len_rx-4]+RxBuffer1[len_rx-5]+RxBuffer1[len_rx-6];  //?????
  73.    if(RxBuffer1[len_rx-2]==verify)
  74.      {
  75.        vout=(float)(RxBuffer1[len_rx-6]*256.0+RxBuffer1[len_rx-5])/1024.0*5.0;//vout=(((RxBuffer1[1]<<8)+RxBuffer1[2])>>10)*5;  //???????
  76.        Ud=(float)vout/0.35*100; //k=0.35v/0.1mg=0.35v/100ug
  77.        if(Ud<35)AQI=Ud*50.0/35.0;
  78.        else if(Ud>=35&&Ud<75)AQI=50+50*(Ud-35)/40.0;
  79.        else if(Ud>=75&&Ud<115)AQI=100+50*(Ud-75)/40.0;
  80.        else if(Ud>=115&&Ud<150)AQI=100+50*(Ud-115)/40.0;
  81.        else if(Ud>=150&&Ud<250)AQI=200+100*(Ud-150)/100;
  82.        else if(Ud>=250&&Ud<350)AQI=300+100*(Ud-250)/100;
  83.        else if(Ud>=350&&Ud<500)AQI=400+100*(Ud-350)/150;
  84.      }
  85.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  86. }
  87. /*
  88. * 函数名:USART2_IRQHandler
  89. *描述:串口2接收中断
复制代码
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

yayasoso

发表于 2017-9-11 23:28:25 | 只看该作者

怎么代码显示不完整?编辑了几次都不行只好手动贴了!
串口接收中断代码:

void USART2_IRQHandler(void)     
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)           
  {        
      RxBuffer1[RxCounter1++] = USART_ReceiveData(USART2);
      if(RxBuffer1[RxCounter1-7]==0xaa && RxBuffer1[RxCounter1-1]==0xff)
      {  
       USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);  
       len_rx=RxCounter1;
       RxCounter1=0;
      };
  }
}
/*********************************END OF FILE********************************/
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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