天天看點

快速實作一個室内空氣品質檢測儀

  冬天我們大多會關閉門窗,而依靠暖通空調裝置來維持室内溫度。而在保證房間溫度的同時,我們也希望保持房間内大氣環境的健康度。鑒于此,我們設計了一個簡單的室内空氣品質檢測器。

1、系統概述

  我們依靠暖通空調裝置來維持室内溫度、濕度和通風水準,以保證居住者的健康和舒适。是以我們希望設計一個小巧的、簡單的、低成本室内空氣品質檢測器來随時監測我們房間内的空氣品質。

  一般來說,我們關心的房間環境的溫度、濕度、可吸入顆粒物濃度、揮發性有機物的濃度等。當然還有二氧化炭濃度等其它一些參數,不過這次我們隻考慮溫度、濕度、可吸入顆粒物濃度、揮發性有機物的濃度。

  對于這個室内空氣檢測器,我們的基本想法是設計一個可以快速成型、監測溫度、濕度、可吸入顆粒物濃度、揮發性有機物濃度的手持裝置。這台室内空氣品質檢測器溫濕度、可吸入顆粒物濃度、揮發性有機物濃度并可以實時顯示出來,并可以将檢測出的資料向外傳送。

2、硬體設計

  根據前面的描述,我們使用一個溫濕度傳感器來監測溫度和濕度、一個可吸入顆粒物雷射檢測傳感器來檢測可吸入顆粒物濃度,一個VOC傳感器來檢測揮發性有機物濃度。

  為了快速實作一個室内空氣品質檢測器,我們采用我們所熟知的傳感器及其他相應裝置來實作。我們使用SHT20來實作溫濕度資料的檢測;使用SGP40來檢測VOC濃度;使用HLPM025K3雷射PM2.5傳感器來檢測可吸入顆粒物濃度;使用OLED來顯示資料;使用序列槽來實作資料的傳送。而處理器我們采用STM32F103C8T6來實作。

  HLPM025K3雷射PM2.5傳感器資料接口為TTL串行口,是以我們采用USART1端口來與之通訊。SHT20傳感器的資料接口為I2C接口,我們使用I2C1來與之通訊。SGP40傳感器資料接口為I2C接口,我們使用I2C2來與之通訊。顯示屏我們采用了SPI接口的0.96寸OLED,是以我們使用SPI1端口來與之通訊。資料傳輸我們采用USART2端口來實作。是以我們設計室内空氣品質檢測器的組成結構圖如下:

快速實作一個室内空氣品質檢測儀

  根據上述分析及結構示意圖,我們就能很容易的設計出室内空氣品質檢測器的控制闆。

3、軟體實作

  我們已經描述了室内空氣品質檢測器的控制闆及各部分元件,接下來我們需要實作相應的軟體功能。

3.1、資料采集

  資料的采集主要包括三個方面:一是使用SHT20采集溫濕度資料;二是使用SGP40來采集VOC濃度資料;三是使用HLPM025K3雷射PM2.5傳感器來檢測可吸入顆粒物濃度資料。這些資料的采集并不麻煩,在以前的文章中我們已經簡述多這些裝置的驅動程式的設計。在這裡我們直接使用已經封裝過的驅動程式來實作就可以了。

  HLPM025K3雷射PM2.5傳感器通過序列槽輸出資料,包括PM2.5和PM10的資料,我們使用封裝的驅動程式可以很友善的擷取和解析對應的資料。具體的實作程式如下:

HlpmObjectType hlpm; //聲明對象

/*PM25資料采集處理*/
void Ampm25DataProcess(void)
{
  /*解析PM2.5和PM10的資料*/
  ParsingPMData(&hlpm);
  
  aPara.phyPara.pm10Value=hlpm.pm100;
  aPara.phyPara.pm25Value=hlpm.pm25;
}
 
/*PM25資料采集配置*/
void Ampm25Configuration(void)
{
  /* PM25相關GPIO初始化配置 */
  Ampm25_GPIO_Initialization();
  
  /* USART1端口初始化配置 */
  USART1_Init_Configuration();
  
  /*允許資料發送*/
  AMPM25_RUNNING_ENABLE();
  
  /*HLPM對象初始化函數*/
  HlpmInitialization(&hlpm);
}
           

  需要注意的是HLPM025K3雷射PM2.5傳感器有一個測量控制信号,必須提供高電平才會工作。

  同樣測量其它的參數也是使用我們封裝的驅動程式,如使用SHT20溫濕度傳感器擷取溫濕度資料也是一樣的。

/* 溫濕度資料處理 */
void AmShtDataProcess(void)
{
  aPara.phyPara.temperature=GetSHT2xTemperatureValue(&sht,MEASURE_T_COMMAND_NOHOST);
  aPara.phyPara.humidity=GetSHT2xHumidityValue(&sht,MEASURE_RH_COMMAND_NOHOST);
}
 
/* 溫濕度配置 */
void AmShtConfiguration(void)
{
  /* I2C1端口初始化 */
  I2C1_Init_Configuration();
  
  /* 初始化配置SHT2x */
  SHT2xInitialization(&sht,        //SHT2X對象變量
             SHT2x_DPI_RH8_T12, //測量分辨率配置
             SHT2x_End_High,   //電池結束狀态配置
             SHT2xHEATERDISABLE, //加熱器是否啟用配置
             SHT2xOTPDISABLE,  //是否加載OTP配置
             WriteToSHT2x,    //寫操作指針
             ReadFromSHT2x,   //讀操作指針
             HAL_Delay);     //毫秒延時指針
}
           

3.2、資料顯示

  前述我們已經提到了使用0.96寸的OLED來顯示相應的資料。我們選用的是SPI接口的OLED顯示屏。其實0.96寸的OLED驅動程式我們也是封裝過的,直接使用就好。具體實作代碼如下:

OledObjectType oled;  //聲明OLED對象

/*OLED顯示處理*/
void AmoledDisplayProcess(void)
{
  char temp[]="temp=%.2f";
  char humi[]="humi=%.2f";
  char pm25[]="PM2.5=%.2f";
  char pm10[]="PM10=%.2f";
  
  OledShowString(&oled,OLED_FONT_8x16,0,0,temp,aPara.phyPara.temperature);
  OledShowString(&oled,OLED_FONT_8x16,2,0,humi,aPara.phyPara.humidity);
  OledShowString(&oled,OLED_FONT_8x16,4,0,pm25,aPara.phyPara.pm25Value);
  OledShowString(&oled,OLED_FONT_8x16,6,0,pm10,aPara.phyPara.pm10Value);
  
}
 
/*OLED初始化配置*/
void AmoledConfiguration(void)
{
  /* OLED顯示控制相關GPIO初始化配置 */
  Amoled_GPIO_Initialization();
 
  /* SPI1端口初始化 */
  SPI1_Init_Configuration();
 
  /*OLED顯示屏對象初始化*/
  OledInitialization(&oled,      //OLED對象
             OLED_SPI,       //通訊端口
             0xFF,        //I2C裝置位址
             AmOledWrite,        //寫資料函數
             AmOledChipReset,       //複位信号操作函數指針
             AmOledDCSelcet,        //DC信号控制函數指針
             NULL,       //SPI片選信号函數指針
             HAL_Delay       //毫秒延時函數指針
               );
}
           

3.3****、資料傳送

  資料的傳輸我們使用RS485的接口方式,應用層協定采用Modbus RTU協定。因為我們已經封裝過Modbus協定棧,并且已經開源到GitHub,是以我們直接使用Modbus協定棧來實作我們的資料傳送。

/* 上位通訊處理函數 */
void AmUpperCommunication(void)
{
  uint16_t respondLength=0;
  if(amupcRxLength>=8)
  {
     uint8_t respondBytes[AMUPCRECEIVELENGTH];

      respondLength=ParsingMasterAccessCommand(amupcRxBuffer,respondBytes,amupcRxLength,aPara.phyPara.activeAddress);
     if(respondLength!=65535)
     {
       if(respondLength > 0)
       {
          AmupcSendByte(respondBytes,respondLength);
       }
       
       amupcRxLength=0;
     }
  }
}
           

  關于資料傳送這塊,我們使用序列槽接收中斷來接收資料請求。當然也可以直接使用定期上傳的方式發送資料,則根據實際需求修改。

4、驗證測試

  我們已經設計了室内空氣品質檢測器的軟體和硬體,接下來我們運作看看其結果如何。我們将其運作起來,在我們的OLED軟體中設定為一次能顯示4行資料,具體結果如下圖:

快速實作一個室内空氣品質檢測儀

  這隻是一個小制作,實作了一些簡單的功能。在後續我們實際上可以将其功能擴充的更多。如将資料上傳到網絡實時檢視房間内的大氣環境;根據PM2.5的情況控制空氣淨化器的工作等。

歡迎關注:

快速實作一個室内空氣品質檢測儀

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時了解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更友善且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公衆号【木南創智】

繼續閱讀