OneNET麒麟座應用開發之十:空氣品質資料監測站項目總結

來源:互聯網
上載者:User

標籤:通過   emd   多次   清除   images   out   ima   receive   飲食   

大氣品質資料監測站用於測試空氣品質監測及資料擷取,實現野外或者室內空氣品質的檢測。

1、項目概述

本項目是一個定製項目,要求採集大氣的壓力、溫度、濕度、PM25、位置等資料並上傳到指定的後台伺服器。但有時候因為沒有條件或因為各種原因不能連網,則採用本地儲存的方式,本地儲存我們決定使用SD卡來實現。除此外,為了實現顯式需求,還需要配套一些東西來實現飲食的需求,如系統時鐘記錄,上傳連網方式的選擇等。

2、硬體設計

本項目涉及到的硬體並不複雜,我們對其中幾個實用比較多的電路做一個說明。首先說一下串口通訊電路,在本項目中雷射PM25感應器、氣體品質流量控制器、SD讀卡機等都是使用串口來實現通訊,所以我們採用如下的串口電路設計:

該方式即可支援RS232,也可實現RS485,當然簡單的TTL也沒問題,只需要根據自己的不同需求焊接不同的元器件就可實現。

接下來我們說一說PWM控制電路,其實用的是計時器來實現,由於點擊需要12V-24V的電源,所以我們外加一部分電路來實現電機的驅動,而PWM訊號則有MCU產生,並能夠通過電路提升電壓。

 

最後我們說一下連網部分,連網有多種方式,有線串連、wifi串連都支援,首先說一說wifi,我們使用了ESP8266來實現這一需求,之所以選擇ESP8266是因為軟硬體實現都比較簡單,而且我們對通訊的要求並不十分高,因為10m秒鐘記錄一個資料就好了,所以成本就是主要理由了。

 

至於有線我們使用W5500來實現,在以前的文章中已經多次說明過,這一次就不再重複了。

3、軟體設計

接下來我們說一說軟體的設計,軟體的設計較硬體要繁雜的多,我們選取其中一部分前面沒有說明過的做一些說明。首先我們說一下PWM控制,每台採集站有2路進氣,所以我們需要控制兩個氣泵,以及2路的PWM,每路可以單獨控制,在實驗時我們使用50%的占空比。

void PWM_Configuration(void){  //計算初始化的頻率和占空比  TimerPeriod = PWMTimePeriod;//計算用於設定ARR寄存器的值使產生訊號的頻率為17.57 Khz  PWM1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//計算CCR1寄存器的值在通道1和1N產生50%占空比,用於TIM1  PWM2Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//計算CCR1寄存器的值在通道1和1N產生50%占空比,用於TIM8  PWM_InitProcess(TIM1,TimerPeriod,PWM1Pulse);}

      其次我們說以說I2C控制,有好幾路感應器都使用的是I2C資料通訊來實現,我們在這裡我們只說兩個基本的I2C操作函數,一個是下發命令,一個是讀取資料。所有的操作都刻以通過調用這兩個函數來實現。

/*向I2C從站下髮指令,指令格式均為1個位元組*/void SendCommandToI2CSlave(I2C_TypeDef* I2Cx,uint8_t deviceAddress,uint8_t command){  uint16_t i2cTimeout=TimeoutPeriod;  /*產生I2C起始訊號*/  I2C_GenerateSTART(I2C2, ENABLE);  /*檢測 EV5 事件並清除標誌*/  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))  {    if ((i2cTimeout--) == 0) return ;  }  /*發送I2C從站的地址*/  I2C_Send7bitAddress(I2Cx,deviceAddress,I2C_Direction_Transmitter);  i2cTimeout=TimeoutPeriod;  /*檢測 EV6 事件並清除標誌*/  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))  {    if ((i2cTimeout--) == 0) return ;  }  /*下發操作命令*/  I2C_SendData(I2Cx, command);  i2cTimeout=TimeoutPeriod;  /*檢測 EV8 事件並清除標誌*/  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))  {    if ((i2cTimeout--) == 0) return ;  }  /* 產生I2C停止訊號 */  I2C_GenerateSTOP(I2Cx, ENABLE);} /*從I2C從站讀取多個位元組資料的值*/void GetBytesFromI2CSlave(I2C_TypeDef* I2Cx,uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum){  uint16_t i2cTimeout=TimeoutPeriod;  /*如果I2C匯流排忙,則等待一段時間*/  while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))  {    if ((i2cTimeout--) == 0) return ;  }  /* 產生 I2C 起始訊號 */  I2C_GenerateSTART(I2Cx, ENABLE);  /*檢測 EV5 事件並清除標誌*/  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))  {    if ((i2cTimeout--) == 0) return ;  }  /*發送I2C從站的地址*/  I2C_Send7bitAddress(I2Cx,deviceAddress+1,I2C_Direction_Receiver);  i2cTimeout=TimeoutPeriod;  /*檢測 EV6 事件並清除標誌*/  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  {    if ((i2cTimeout--) == 0) return ;  }  while(bytesNum)  {    if(bytesNum==1)    {      I2C_AcknowledgeConfig(I2Cx, DISABLE);//關閉應答      I2C_GenerateSTOP(I2Cx, ENABLE);//停止訊號    }    i2cTimeout=TimeoutPeriod;    /*檢測 EV7 事件並清除標誌*/    while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))    {      if ((i2cTimeout--) == 0) return ;    }    /*通過 I2C,從裝置中讀取一個位元組的資料 */    *pData=I2C_ReceiveData(I2Cx);    pData++;    bytesNum--;  }  /*使能應答,方便下一次 I2C 傳輸*/  I2C_AcknowledgeConfig(I2Cx, ENABLE);}

接下來我們看看將資料存放區到本地SD卡的操作過程,資料保留2位小數,並且採用4舍5入處理。

//將資料寫入到SD卡void WriteDataToSDCard(void){  //將資料寫入SD卡  saveData[0]=((int16_t)(tempProcessValue*100+0.5))/100.0;//溫度測量值  saveData[1]=((int16_t)(presProcessValue*100+0.5))/100.0;//壓力測量值  saveData[2]=((int16_t)(flowProcessValue1*100+0.5))/100.0;//流量計1的標況流量  saveData[3]=flowTatolVolume1;//流量計1的工況累計流量  saveData[4]=flowStdTatolVolume1;//流量計1的標況累計流量  saveData[5]=((int16_t)(flowProcessValue2*100+0.5))/100.0;//流量計2的標況流量  saveData[6]=flowTatolVolume2;//流量計2的工況累計流量  saveData[7]=flowStdTatolVolume2;//流量計2的標況累計流量       saveDate[0]=systemYear;  saveDate[1]=systemMonth;  saveDate[2]=systemDate;  saveDate[3]=systemHour;  saveDate[4]=systemMinute;  saveDate[5]=systemSecond;      SDCardFileOperation();}

4、結果展示

我們在OneNET上建立了一個產品,6台裝置,以及4個應用,來驗證方案的效果,在測試過程中我們使用了Wifi方式來進行此次測試,因為這也是我們正是產品主要使用的連網方式。我們看一看資料上傳的趨勢圖:

 

接下來我們看看顯示位置及溫濕度的應用:

 

我們再來看看顯示大氣壓、溫度和濕度的:

 

我們再來看看氣體流量及柱狀圖顯示:

 

至此,我們的測試專案完成,再次感謝電子發燒友和中國移動OneNET給我們帶來的完美體驗。

OneNET麒麟座應用開發之十:空氣品質資料監測站項目總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.